• 検索結果がありません。

Microsoft PowerPoint - 3.pptx

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft PowerPoint - 3.pptx"

Copied!
17
0
0

読み込み中.... (全文を見る)

全文

(1)

条件分岐( if 文)

条件分岐( if 文)

第2回の講義資料で出題した練習問題や演習問題の計算は,勿論 電卓でもでき,わざわざプログラムを作ってまでするほどの計算 ではありませんでした. プログラムによる計算と電卓の計算の⼤きな違いの⼀つが,プロ グラムには 条件による処理の分岐 繰り返しがあることです グラムには,条件による処理の分岐,繰り返しがあることです. まず今回は,条件による処理の分岐(「処理の切り替え」と⾔う ⽅が適切かもしれません)の書き⽅について学んでいきます. ⽅が適切かもしれません)の書き⽅について学んでいきます.

(2)

if 文の形式と意味

形式1:

if(式) 文

式が真のときのみ,文を実行

形式2:

if(式) 文1 else 文2

形式2:

if(式) 文1 else 文2

式が真のとき文1を実行し,式が偽のとき文2を実行

式としては, • 関係演算子: α == β αの値がβと等しいとき真 α != β αの値がβと異なるとき真 α != β αの値がβと異なるとき真 α < β αの値がβより小さいとき真 α > ββ αの値がβより大きいとき真値 β り大 真 α <= β αの値がβ以下のとき真 α >= β αの値がβ以上のとき真 • 四則演算(C⾔語では0(ゼロ)を偽,0以外を真として扱う)

(3)

例: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 ); }

(4)

例: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 がが偽偽なのでなので,何も表示何も表示 されずにプログラムを終了する.

(5)

複文(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"); } } }

(6)

複文(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 を使って,きれ いに字下げしながらプログラムを書くようにすると,このような間違い をプログラムを書いている最中に発見できる.

(7)

例 : 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"); }

(8)

例 : 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 ); } }

(9)

条件式での間違いについて(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 の値に関係なく偽

(10)

条件式での間違いについて(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"); }

(11)

演習

整数を2つ入力し,その差の絶対値(違い)を表示するプログラ ムを作れ. (1) 第2回の演習問題2.2で作成した sho_int.c,すなわち,整数を 2つ入力し,その商(1番目に入力された数÷2番目に入力され (2) た数)を表示するプログラムを改良して,2番目に入力された整 数が, 0 の場合 『 0 では割れません』と表示する 0 の場合: 『 0 では割れません』と表示する 0 以外の場合:商を表示する ようなプログラムを作れ. 約15分後に解答例を示します.

(12)

複雑な条件式

複雑な条件式は,以下の演算子を組み合わせて作る.

!

α αでない(αが偽のとき真) α || β α または β(α, βのうち少なくとも一方が真のとき真) α && β α かつ β(α, βがともに真のとき真)

【例】

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 < 10

(13)

if 文の入れ子(1/3)

if (条件) 文 (条 ) if (条件) 文1 else 文2 における,文,文1,文2が,また if 文や if ~ else 文があっ ても勿論OK ても勿論OK. これを利用して,複数の場合に場合分けすることができる. たとえば 次頁のプログラム(の断片)は t が たとえば,次頁のプログラム(の断片)は,ten が, 80 以上, 70 以上 80 未満, 60 以上 70 未満, 60 未満 の4つに場合分けし,それぞれの処理(表示)をしている.

(14)

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です を表示

(15)

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");

(16)

課題(レポート)

りんごを幾つか買うとする.りんごの値段は,一度にたくさん買うとサービス して安くしてくれる. 10 個未満だと 1つの値段は 100 円 (1) 10 個未満だと,1つの値段は 100 円, 10 個以上 20 個未満だと,1つの値段は 95 円, 20個以上だと,1つの値段は 90 円 である 買うりんごの個数を入力すると その個数のりんごの合計の値段を表 である.買うりんごの個数を入力すると,その個数のりんごの合計の値段を表 示するプログラムを作れ. 西暦を入力すると,その年が閏年ならば,“閏年です”と表示し,そうでないな (2) らば,“閏年ではありません”と表示するプログラムを作れ.ただし,西暦x年 が閏年か否かは次のようにして決まる. • 基本的には,xが4で割り切れば閏年. ( ) • ただし,xが4でも100でも割り切れる年は閏年としない. • ただし,xが4でも100でも400でも割り切れる年は閏年. (3) 3つの整数を入力し,それらを3辺とする三角形ができるならば,その面積を 出力し,そうでないならば, 三角形ではありません! 三角形ではありません! というメッセージを表示するプログラムを作れ(次ページヒント参照).

(17)

問題(3)のヒント & 補足

•三辺の長さが a, b, c である三角形がつくれるための条件は, a+b > c かつ b+c > a かつ c+a > b a+b > c かつ b+c > a かつ c+a > b •三辺の長さが a, b, c である三角形の面積は, s(s-a)(s-b)(s-c) ただし s = (a+b+c)/2 s(s a)(s b)(s c) ただし,s = (a+b+c)/2 注意 : s を求める際に小数点以下が切り捨てられないようにしよう. •平方根を求める関数は sqrt •平方根を求める関数は,sqrt たとえば,sqrt(x+1) とすると,x+1 の平方根を返す.ただし,引数(括弧 の中)の式は,float 型または double 型でなければならない. •sqrt や sin などの数学的関数を使う場合は... プログラム先頭( int main() より前のどこか)に #include<math.h> をつける.また,コンパイルするときは(ファイル名を AB.c とする), gcc –lm AB.c (または,gcc –lm – o AB AB.c)

参照

関連したドキュメント

した標準値を表示しておりますが、食材・調理状況より誤差が生じる場合が

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

問題集については P28 をご参照ください。 (P28 以外は発行されておりませんので、ご了承く ださい。)

*Windows 10 を実行しているデバイスの場合、 Windows 10 Home 、Pro 、または Enterprise をご利用ください。S

帰ってから “Crossing the Mississippi” を読み返してみると,「ミ

・分速 13km で飛ぶ飛行機について、飛んだ時間を x 分、飛んだ道のりを ykm として、道のりを求め

使用済自動車に搭載されているエアコンディショナーに冷媒としてフロン類が含まれている かどうかを確認する次の体制を記入してください。 (1又は2に○印をつけてください。 )

大村 その場合に、なぜ成り立たなくなったのか ということ、つまりあの図式でいうと基本的には S1 という 場