条件分岐( if 文)
条件分岐( if 文)
第2回の講義資料で出題した練習問題や演習問題の計算は,勿論 電卓でもでき,わざわざプログラムを作ってまでするほどの計算 ではありませんでした. プログラムによる計算と電卓の計算の⼤きな違いの⼀つが,プロ グラムには 条件による処理の分岐 繰り返しがあることです グラムには,条件による処理の分岐,繰り返しがあることです. まず今回は,条件による処理の分岐(「処理の切り替え」と⾔う ⽅が適切かもしれません)の書き⽅について学んでいきます. ⽅が適切かもしれません)の書き⽅について学んでいきます.if 文の形式と意味
形式1:
if(式) 文
式が真のときのみ,文を実行
形式2:
if(式) 文1 else 文2
形式2:
if(式) 文1 else 文2
式が真のとき文1を実行し,式が偽のとき文2を実行
式としては, • 関係演算子: α == β αの値がβと等しいとき真 α != β αの値がβと異なるとき真 α != β αの値がβと異なるとき真 α < β αの値がβより小さいとき真 α > ββ αの値がβより大きいとき真値 β り大 真 α <= β αの値がβ以下のとき真 α >= β αの値がβ以上のとき真 • 四則演算(C⾔語では0(ゼロ)を偽,0以外を真として扱う)例:if(式)文
(1/2)
あまり意味のあるプログラムではありませんが… #i l d < tdi h> #include <stdio.h> int main() { int age; /* 入力 */ printf("あなたの年齢は : "); scanf("%d",&age); /* 結果の表示 */ if(age >= 20) printf("ビールを飲んでもいいですよ ¥n"); printf( ビ ルを飲んでもいいですよ.¥n ); }例:if(式)文
(2/2)
前記のプログラムの if(age >= 20) if(age >= 20) printf("ビールを飲んでもいいですよ.¥n"); の部分では 変数 age の値が たとえば 21 ならば これは 20 以 の部分では,変数 age の値が,たとえば,21 ならば,これは 20 以 上であるから,age >= 20 が真となり, printf("ビールを飲んでもいいですよ.¥n"); が実行され, ビールを飲んでもいいですよ.ルを飲 も すよ と表示される.一方方,age の値が,19 の場合は,age の値が 19 の場合は age >= 20age > 20 がが偽偽なのでなので,何も表示何も表示 されずにプログラムを終了する.
複文(1/2)
if 文において,条件が真であるときに実行する文が複数あるときは, 中括弧 { } で囲む.{ } で囲まれた文を複文と呼ぶ. #include <stdio.h> int main() { int age; /* 入力 */ printf("あなたの年齢は : ");scanf("%d" &age); age >= 20 が真の時は, scanf( %d ,&age); /* 結果の表示 */ if(age >= 20) { age > 20 が真の時は, { } で囲まれた文が順に実 行される. if(age >= 20) { printf("ビールを飲んでもいいですよ.¥n"); printf("お酒を飲んでもいいですよ.¥n"); } } }
複文(2/2)
中括弧を忘れると... #include <stdio h> #include <stdio.h> int main() { int age; int age; /* 入力 */ printf("あなたの年齢は : "); printf( あなたの年齢は : ); scanf("%d",&age); /* 結果の表示 */ 変数 age の値に関係 なく,赤で示した i tf 文が実行され / 結果の表示 / if(age >= 20) printf("ビールを飲んでもいいですよ.¥n"); printf("お酒を飲んでもいいですよ.¥n"); printf 文が実行され てしまう p } 字下げはプログラムの動作に影響しません 常に TAB を使って きれ 字下げはプログラムの動作に影響しません.常に TAB を使って,きれ いに字下げしながらプログラムを書くようにすると,このような間違い をプログラムを書いている最中に発見できる.例 : if (条件) 文1 else 文2 (1/2)
次のプログラムは入力した数値(年齢)が,20 以上か,20 未満かで 表示するものが変わる. #include <stdio.h> int main() { int age; /* 入力 */ printf("あなたの年齢は : "); scanf("%d" &age); scanf( %d ,&age); /* 結果の表示 */ if(age >= 20) if(age >= 20) printf("ビールを飲んでもいいですよ.¥n"); else i tf("飲めるのは水かジ スです ¥ ") printf("飲めるのは水かジュースです.¥n"); }例 : if (条件) 文1 else 文2 (2/2)
if ~ else 文に関しても,if の条件式が真のとき実行する文が複数ある場合 は,それらの文を { } で囲んで複文にする.if の条件式が偽のとき実行する 文が複数ある場合も同様に それらを中括弧で囲む #include <stdio.h> int main() { 文が複数ある場合も同様に,それらを中括弧で囲む. { int age; /* 入力 */ / 入 / printf("あなたの年齢は : "); scanf("%d",&age); /* 結果の表示 */ /* 結果の表示 */ if(age >= 20){ printf("ビールを飲んでもいいですよ.¥n"); printf("お酒を飲んでもいいですよ.¥n"); p } else { printf("飲めるのは水かジュースです.¥n"); printf("こっそり飲んでいるでしょう ¥n"); printf( こっそり飲んでいるでしょう.¥n ); } }条件式での間違いについて(1/2)
ここで,条件式に関して犯しやすい間違いについて説明しておく. if 文の条件の式で,ある変数(たとえば,x )の値と式(変数一つや 定数も式 す) 値が等 と う条件を 定数も式です)の値が等しいという条件を, x = 式 と書いてしまう人がいる.これは慣れた人でもよく犯す間違い! 代入文は右辺を計算してその結果を左辺の変数に代入するのだが,実は 代入文も値を返し 代入文も値を返し, 変数 = 式 の返す値は,右辺の式の値.C言語では,0 は偽,0 以外は真だから, たとえば, 条件 x = 0 は x の値に関係なく 偽 条件 x = 0 は,x の値に関係なく,偽, 条件 x = 1 は,x の値に関係なく,真, が 0 のとき 条件 は の値に関係なく偽 y+z が 0 のとき,条件 x = y+z は,x の値に関係なく偽条件式での間違いについて(2/2)
以下のプログラムは足し算のテストを行うプログラムのつもりである.二つの整 数を入力し,続いて2数の足し算の値を入力する.入力した答えが合っていれば, 「正解です 」と表示し 間違っていれば 「誤りです 」と表示することを意 「正解です.」と表示し,間違っていれば,「誤りです.」と表示することを意 図しているのだが,条件式の誤りのために,正解が 0 の場合は,答えとして何を 入力しても,「誤りです.」と表示され,逆に正解が 0 でない場合は,答えとし て何を入力しても 「正解です 」と表示されてしまう! 正しいプログラムと #include <stdio.h> i t i () て何を入力しても,「正解です.」と表示されてしまう! 正しいプログラムと するには,条件式を z = = x + y としなければならない. int main() { int x,y,z;printf("1つ目の数は :"); scanf("%d" &x); printf( 1つ目の数は : ); scanf( %d ,&x); printf("2つ目の数は :"); scanf("%d",&y); printf("%d+%d はいくつになりますか:",x,y); scanf("%d" &z); scanf( %d ,&z); if(z = x + y) printf("正解です.¥n"); else else printf("誤りです.¥n"); }
演習
整数を2つ入力し,その差の絶対値(違い)を表示するプログラ ムを作れ. (1) 第2回の演習問題2.2で作成した sho_int.c,すなわち,整数を 2つ入力し,その商(1番目に入力された数÷2番目に入力され (2) た数)を表示するプログラムを改良して,2番目に入力された整 数が, 0 の場合 『 0 では割れません』と表示する 0 の場合: 『 0 では割れません』と表示する 0 以外の場合:商を表示する ようなプログラムを作れ. 約15分後に解答例を示します.複雑な条件式
複雑な条件式は,以下の演算子を組み合わせて作る.!
α αでない(αが偽のとき真) α || β α または β(α, βのうち少なくとも一方が真のとき真) α && β α かつ β(α, βがともに真のとき真)【例】
a > 0 && ( b==2 || b==4 || ! (b > a) )【例】
a > 0 && ( b==2 || b==4 || ! (b > a) ) の真偽は, a が -1 の場合 ・・・ 偽 a が 1 の場合 偽 a が 1 で,b が 4 の場合 ・・・ 真 a が 1 で,b が 3 の場合 ・・・ 偽 変数 値が 真【例】
変数 x の値が 5 以上 10 未満のとき真となる式は, 5 <= x && x < 10【例】
※ 注意:以下は誤り. 5 <= x < 10if 文の入れ子(1/3)
if (条件) 文 (条 ) if (条件) 文1 else 文2 における,文,文1,文2が,また if 文や if ~ else 文があっ ても勿論OK ても勿論OK. これを利用して,複数の場合に場合分けすることができる. たとえば 次頁のプログラム(の断片)は t が たとえば,次頁のプログラム(の断片)は,ten が, 80 以上, 70 以上 80 未満, 60 以上 70 未満, 60 未満 の4つに場合分けし,それぞれの処理(表示)をしている.if 文の入れ子(2/3)
if (80 < t ){ Y if (80 <= ten){ printf("成績はAです.¥n"); } else { 80 <= ten No Yes 成績はAです を表示 else { if(70 <= ten) { printf("成績はBです.¥n"); } 70 <= ten 成績はBです を表示 Yes } else { if(60 <= ten){ printf("成績はCです ¥n"); Yes No を表示 成績はCです printf( 成績はCです.¥n ); } else { printf("成績はDです.¥n"); Yes 60 <= ten No 成績はCです を表示 p ( 成績 す ) } } } 成績はDです を表示if 文の入れ子(3/3)
前⾴のプログラムの断⽚は,分かり易さを考えて,書いているが,以 下のように書いても良い(こちらの⽅が普通).
if (80 <= ten) printf("成績はAです.¥n");
else if(70 <= ten) printf("成績はBです.¥n"); else if(60 <= ten) printf("成績はCです.¥n"); else printf("成績はDです.¥n");
このように上手く if 文の入れ子を使うと,以下のように,無駄な 条件判定を含む複雑な条件式を書く必要がない.
if (80 <= ten) printf("成績はAです.¥n");
else if(70 <= ten && ten < 80) printf("成績はBです ¥n"); else if(70 <= ten && ten < 80) printf( 成績はBです.¥n ); else if(60 <= ten && ten < 70) printf("成績はCです.¥n"); else printf("成績はDです.¥n");