このスライドの使い方

  • 画面下の「▶」で再生開始、「⏸」で一時停止

  • 画面右下の「>」で次頁へ、「<」で前頁へ

  • 青字下線の部分は、まとめプリントの穴埋め

  • 作業」のところでは、ファイルをダウンロードしてコンパイル・実行

第 3 章
「プログラムの
流れの分岐」

教科書 pp.43–71

§ 3-1「if 文」(教 pp.44–65)

if 文(教 p.44

if ( 式1 ) 文1

という形のこと

  • 1 を評価して、その値が非 0 (すなわち真) なら、 1 を実行する
  • 1の値が 0 (すなわち偽) なら、何もしない

作業: List 3-1 を実行する(入力として 5 の倍数とそうでないものを試す)

if 〜 else 文 (教 p.46

if ( 式1 ) 文1 else 文2

という形のこと

  • 1 を評価して、その値が非 0 (すなわち真) なら、 1 を実行
  • 1 の値が 0 (すなわち偽) なら、 2 を実行

作業: List 3-3 を実行する(入力として 5 の倍数とそうでないものを試す)

if 文 if 〜 else 文

作業: まとめのプリント Q 3.1.1 をやってみる

等価演算子(教 p.50

==」演算子

  • 両辺の値が等しければ1(つまり真)を
  • 等しくなければ0(つまり偽)を返す   

!=」演算子

  • ==」と逆に等しくないかどうかを判定する

作業: List 3-6 を実行する
(2つの入力値が等しいときとそうでないときを試す)

関係演算子(教 p.52

以下の4つがある。

< 左辺が右辺よりも小さいとき真
> 左辺が右辺よりも大きいとき真
<= 左辺が右辺よりも小さいか等しいとき真
>= 左辺が右辺よりも大きいか等しいとき真

」「」はもちろん 「=<」とか「=>」という演算子はない

入れ子になった if 文(教 p.53


  if (no == 0)
      puts("その数は 0です。");
  else if (no > 0) 
      puts("その数は正です。");
  else 
      puts("その数は負です。");  

単に else の次の文が、また if 文になっているだけ

入れ子になった if 文(教 p.53


  if (no == 0)
      puts("その数は 0です。");
  else if (no > 0) 
      puts("その数は正です。");
  else 
      puts("その数は負です。");  

単に else の次の文が、また if 文になっているだけ

作業: List 3-9 , List 3-10, を実行する(正の数、0、負の数、奇数、偶数などを試す)

作業: まとめのプリント Q 3.1.2 をやってみる

評価(教 p.55

式の値を調べる(ために実行する)ことを 評価する (evaluate) という

2値の最大値を求める
〜3値の最大値を求める(教 pp.56–57)

教科書を読んでおくこと。

作業: List 3-12 , List 3-13, を実行する(入力の大小の順を変えて試す)

条件演算子 (三項演算子)(教 p.58

1 ? 式2 : 式3

まず 式1 を評価し、その値が

非 0 (真) であれば、 2を評価して、その値を返す
3は評価しない
0 (偽) であれば、 3を評価して、その値を返す
2は評価しない

作業: List 3-14 を実行する(入力の大小の順を変えて試す)

複合文 (ブロック)(教 p.60

文の並びを波括弧 (ブレース — 「{」 と「}」 —) で囲んだもの

  • 複合文は構文上単一の文と見なされる
  • 複合文中の文は上 (左) から順に一つずつ実行される

作業: List 3-17 を実行する(入力の大小の順を変えて試す)

繰り上がりの計算
(まとめのプリント・章末)

作業: addtime.c を実行する
(繰り上がりが起こる/起こらない、いくつかの入力を試す)

2 つの数を大きい順に並べる
(まとめのプリント・章末)

作業: maxswap.c を実行する
(入力の大小の順を変えていくつかの入力を試す)

注意!(教 p.61

if 文の制御する文 (後述の while 文、for 文などでも同様) は、たとえ一つの文でも (間違いを避けるため)波括弧で囲んでブロックにする

△ 望ましくないスタイル ◎ 望ましいスタイル  

if (n1 > n2)
    printf("hello");
else
    printf("hi");
   

if (n1 > n2) {
    printf("hello");
} else {
    printf("hi");
}

教科書の例題は望ましいスタイルでないものが多いので、特に注意する。 この授業の課題の解答は「望ましいスタイル」で提出すること。 (教科書 p.5961 下のほうの ▷)

(発展)ぶら下がりの else
(dangling else)


if (h < 12) 
if (h < 6) printf("A");    
else printf("B")

は、どのように文法的に解釈されるか?

#1:

if (h < 12) {
    if (h < 6)
        printf("A");   
    else
        printf("B"); 
}
#2:

if (h < 12) {
    if (h < 6)
        printf("A");   
} else 
    printf("B");

(発展)ぶら下がりの else 続き

作業: まとめのプリント Q 3.1.3 をやってみる

論理演算子(教 p.62

演算子 呼び方 説明
&& 論理 AND 演算子
かつ
左オペランドを評価して、0 (偽) であれば、
0 (偽) を返す。非 0 (真) であれば、
右オペランドを評価して 0 ならば 0 を、
非 0 なら 1 を
返す
|| 論理 OR 演算子
または
左オペランドを評価して、非 0 (真) であれば
1を返す。0 (偽) であれば、
右オペランドを評価して 0 ならば 0 を、
非 0 なら 1 を
返す
(プリントの赤字の箇所を訂正してください。)

左右非対称 — つまり左オペランドを評価して値が決まれば、 右オペランドは評価しない(短絡評価)

作業: List 3-18 を実行する(1 から 12までの入力を試す)

chap03/summary1.c も見ておく

初学者が誤りやすい if 文(教 p.65

作業: まとめのプリント Q 3.1.4 をやってみる(教 p.65)

§ 3-2「switch 文」
(教 pp.66–69)

switch 文 (教 p.66

ある式の値 (整数型) によって、プログラムの流れを複数に分岐する

switch ( 1 ) 1

1は、通常、複合文(ブロック)である

  • 1 を評価して、文1 の中の case と 「:」の間に書かれた定数と一致するところにジャンプする
  • どの case にも一致しないときは default: にジャンプする
  • その後 break 文に出会うと、一気に switch 文を飛び出る
  • 逆に break 文がなければ、そのまま次の文を実行する

switch 文(つづき)

case:default: のようにプログラムの飛び先を示す目印をラベル (名札) と呼ぶ

作業: List 3-20 を実行する(3 で割った余りの異なる複数の入力を試す)

作業: List 3-21 を実行する(いくつかの整数の入力を試す)

switch 文と if 文~選択文(教 p.69)

教科書を読んでおくこと

文法のまとめ

文 (statement)

分類 一般形 補足説明
if 文 if ( ) (教 p.4244)
if 〜 else 文 if ( ) else (教 p.4446)
複合文(ブロック) { 宣言 … 文 … } (教 p.5860)
switch 文 switch ( ) (教 p.6466)
ラベル付き文 case 整数リテラル :
default :
(教 p.6567)
break 文 break ; (教 p.6567)

式 (expression)

分類 一般形 補足説明
三項演算子 ?: (教 p.5658)

第 3 章・終