150 likes | 257 Views
第 3 週 条件式. プログラミング言語 2014 立命館大学情報理工学部. List3-17 & 3-3 (P.54 & P.38 ). List3-18 (P.55 ). /* 読み込んだ整数値を3で割った剰余を表示( switch 文) * / #include < stdio.h > int main(void) { int num ; printf (" 整数を入力してください: "); scanf ("%d", & num ); switch ( num % 3 ) {
E N D
第3週条件式 プログラミング言語 2014 立命館大学情報理工学部
List3-17 & 3-3 (P.54 & P.38) List3-18(P.55) /* 読み込んだ整数値を3で割った剰余を表示(switch文) */ #include <stdio.h> int main(void) { intnum; printf("整数を入力してください:"); scanf("%d", &num); switch (num % 3) { case 0 : puts("その数は3で割り切れます。"); break; case 1 : puts("その数を3で割った余りは1です。"); break; case 2 : puts("その数を3で割った余りは2です。"); break; } return 0; } /* 読み込んだ整数値を3または5で割った剰余を表示 */ #include <stdio.h> int main(void) { intnum; printf("整数を入力してください:"); scanf("%d", &num); if (num % 3 == 0) puts("その数は3で割り切れます。"); else if (num % 3 == 1) puts("その数を3で割った余りは1です。"); else puts("その数を3で割った余りは2です。"); if (num % 5) puts("その数は5で割り切れません。"); else puts("その数を5で割り切れます。"); return 0; } 第3週のプログラム
条件に基づいてプログラムの流れを変える方法を学ぶ条件に基づいてプログラムの流れを変える方法を学ぶ • if 文(もし制御式を評価して非0だったら文を実行する) • 「制御式を評価する」とは? • if( num % 3 )printf(“3で割り切れない\n”); • if( (num % 3) == 0 ) printf(“3で割り切れる\n”); 等式が「正しい」⇒「等式の値」は1(非0)⇒文を実行 • 等価演算子( == ,!= )・関係演算子( < ,> ,<= ,>= ) • 論理演算子( && ,|| ) • else と else if • switch文(制御式を評価して対応するcaseへ移動する) • 条件演算子(三項演算子) (例)max = ( n1 > n2 ) ? n1 : n2 ; (n1とn2の大きい方をmaxに代入) ( n1 > n2 ) を評価して,非0(不等式が正しい)ならn1, 0(不等式が正しくない)ならn2 • 複合文 第3週のポイント
PP.36--40 • if ( 制御式) 文 制御式を評価して非0⇒文実行 • if ( 制御式) 文1else 文2 制御式を評価して非0⇒文1実行 0⇒文2実行 【例:List3-4】 no = 3 とする 制御式 no % 2 を評価すると no % 2 = 1 だから 非0 よって,文1 puts(“その数は奇数です。”); が実行される (文2は飛ばされる) 【参考:List3-5】 制御式の評価の別の例 List3-4 (P.39) /* 読み込んだ整数値は偶数であるか奇数であるか */ #include <stdio.h> int main(void) { intno; printf("整数を入力してください:"); scanf("%d", &no); if (no % 2) puts("その数は奇数です。");/* 文1 */ else puts("その数を偶数です。");/* 文2 */ return 0; } if 文と else
PP.42--43 • if ( x1 == x2) 文 等式が「正しい」⇒文実行 [理由]等価演算子(==)は 左右のオペランドの値を比較し, 等しいときに1(非0) そうでなければ0 の値を生成 つまり,等式が正しければ非0 制御式を評価して非0⇒文実行 • if ( x1 != x2) 文 x1とx2が等しくない ⇒ 文実行 【例:List3-8】 vx = 35 とする。 vx% 10 = 5 なので, 制御式 vx % 10 == 5 を評価すると 5 == 5 となり「正しい」 よって,制御式の値は 1(非0)となり puts(“最も下の桁は5です。”); が実行される List3-8 (P.43) /* 最下位の桁は5であるか */ #include <stdio.h> int main(void) { intvx; printf("整数を入力してください:"); scanf("%d", &vx); if (vx % 10 == 5) puts("最も下の桁は5です。"); return 0; } 等価演算子
P.44 • if ( x1 < x2) 文 • if ( x1 > x2) 文 • if ( x1 <= x2) 文 • if ( x1 >= x2) 文 不等式が「正しい」⇒文実行 (不等号 <と等号 = の順番注意!) [理由]比較演算子( <,>,<=,>=)は 不等式が正しいときに1(非0) そうでなければ0 の値を生成 つまり,不等式が正しければ制御式が非0⇒文実行 【例:List3-9】 no = 3 とする。no == 0 でない(if)ので,文1は実行されない no == 0 ではなく(else)no > 0 なので(if),文2が実行される List3-9 (P.44) /* 読み込んだ整数値の符号を判定 */ #include <stdio.h> int main(void) { intno; printf("整数を入力してください:"); scanf("%d", &no); if (no == 0) puts("その数は0です。"); /* 文1 */ elseif (no > 0) puts("その数は正です。"); /* 文2 */ else puts("その数は負です。"); return 0; } 比較演算子
P.45 • no は1 から 9までの数字 「勝ち」の番号は!? Listoriginal /* 勝ちか負けか */ #include <stdio.h> int main(void) { intno; printf("整数を入力してください:"); scanf("%d", &no); if (no % 2) puts("負け。");/* 文1 */ else if (no > 5) puts("勝ち。");/* 文2 */ else puts("負け。"); /* 文3 */ return 0; } 練習:入れ子のif文(else if) 0 no%2 2,4,6,8 非0 1,3,5,7,9 0 偽 no>5 非0 真 6,8 2,4 負け 勝ち 負け
PP.52--53 • if (式1&&式2) 文 式1と式2の両方が非0⇒文実行 [例]if( x >= 2 && x <= 4 ) 文 x >= 2が正しく(非0) かつ x <= 4が正しい(非0) ならば,文実行 • if ( 式1 ||式2) 文 式1または式2が非0⇒文実行 [例]if( x <2 ||x >4 ) 文 x <2 が正しい(非0) または x >4 が正しい(非0) ならば,文実行 List3-16 (P.52) /* 読み込んだ月の季節を表示 */ #include <stdio.h> int main(void) { int month;/* 月 */ printf("何月ですか:"); scanf("%d", &month); if (month >= 3 &&month <= 5) puts("春です。"); else if (month >= 6 && month <= 8) puts("夏です。"); else if (month >= 9 && month <= 11) puts("秋です。"); else if (month == 1 ||month == 2 || month == 12) puts("冬です。"); else puts("そんな月はありませんよ!!\a"); return 0; } 論理演算子
PP.48~49 • オペランドが3つの演算子 • if 文に似たはたらき • 式1 ?式2:式3の値 式1を評価して, 非0(正しい式) ⇒式2が値 0(正しくない式)⇒式3が値 [例]max = ( n1 > n2 ) ? n1 : n2; (n1とn2の大きい方をmaxに代入) ( n1 > n2 ) を評価して, 非0(不等式が正しい)ならn1, 0(不等式が正しくない)ならn2 が右辺の値となる(それを max に代入) List3-13 (P.48) /* 読み込んだ二つの整数値の大きい方の値を求めて表示 (条件演算子) */ #include <stdio.h> int main(void) { intn1, n2, max; puts("二つの整数を入力してください。"); printf("整数1:"); scanf("%d", &n1); printf("整数2:"); scanf("%d", &n2); max = (n1 > n2) ? n1 : n2; /* 大きい方の値をmaxに代入 */ printf("大きい方の値は%dです。\n", max); return 0; } 条件演算子(3項演算子)
PP.50--51 • 複合文(ブロック) 文を{ } で囲んだもの 通常2つ以上の文を囲む [例]{ max = n1 ; min = n2 ; } 文の前であれば宣言を含んでもよい [例]{ int x ; x = 5; printf(“%d\n”, x); } • if の後など 単一の文が要求される場所で, 複数の文を実行する必要があるとき,複合文 { } を用いる 今後出てくる for や while でも重要になる List3-15 (P.50) /* 読み込んだ二つの整数値の大きい方の値・ 小さい方の値を求めて表示 */ #include <stdio.h> int main(void) { int n1, n2, max, min; puts("二つの整数を入力してください。"); printf("整数1:"); scanf("%d", &n1); printf("整数2:"); scanf("%d", &n2); if (n1 > n2) { max = n1; min = n2; }else { max = n2; min = n1; } printf("大きい方の値は%dです。\n", max); printf("小さい方の値は%dです。\n", min); return 0; } 複合文(ブロック)
PP.54--56 • switch ( 制御式) { case 値1: 文1 case 値2: 文2 default : 文d } 制御式を評価して 値1⇒「case 値1 : 」へ移動 文1, 文2, 文dが実行される 値2⇒「case 値2 : 」へ移動 文2, 文dが実行される それ以外の値⇒「default : 」へ移動 文dへ移動 移動後はそこから下へ順番に実行 • break; (break 文) これに出会ったら,switch文から一気に抜け出る( } の外へ) 【参考:今週のプログラム(if, else との比較)】 List3-4 (p39) /* switch文の動作を確認するプログラム */ #include <stdio.h> int main(void) { intsw; printf("整数を入力してください:"); scanf("%d", &sw); switch (sw) { case 1 :puts("A"); puts("B"); break; case 2 : puts("C"); case 5 : puts("D"); break; case 6 : /* 空文 */ case 7 : puts("E"); break; default : puts("F"); break; } return 0; } switch 文
PP.54--56 • swは 1 から 8 までの数字 それぞれのswで何が出力? [例]sw=1 の場合 「case 1:」へ移動 AとBが出力 「break; 」に出会いswitchの外へ sw=2C D sw=3 F sw=4 F sw=5 D sw=6 E sw=7 E sw=8 F List3-19 (p39) /* switch文の動作を確認するプログラム */ #include <stdio.h> int main(void) { intsw; printf("整数を入力してください:"); scanf("%d", &sw); switch (sw) { case 1 :puts("A"); puts("B"); break; case 2 : puts("C"); case 5 : puts("D"); break; case 6 : /* 空文 */ case 7 : puts("E"); break; default : puts("F"); break; } return 0; } 練習:switch 文 ? ? ? ? ? ? ?
no が 2 のとき何が表示? ① A ② B ③ C Listoriginal 2 /* 勝ちか負けか */ #include <stdio.h> int main(void) { intno; printf("整数を入力してください:"); scanf("%d", &no); if (no - 2) puts("A");/* 文1 */ else if (no % 2 != 1) puts("B");/* 文2 */ else puts("C"); /* 文3 */ return 0; } クイズ 0 no-2 2 非0 2以外 0 偽 奇数 no%2!=1 非0 真 偶数 2 なし A B C 正解は ② B
右の空欄を補充して, swの値に応じて, 下記の文字を出力する プログラムを作成せよ。 (1行に1文字ずつ出力でよい) sw=1 H sw=2D sw=3 A B C sw=4 C sw=5 E F G sw=6 B C sw=7 G sw=8 C List3-4 (P.39) /* switch文の動作を確認するプログラム */ #include <stdio.h> int main(void) { intsw; printf("整数を入力してください:"); scanf("%d", &sw); switch (sw) { case 3 : puts("A"); case 6 : puts(“B"); case 8 : case 4 : puts(“C”); break; case 2 : puts(“D"); break; case 5 : puts(“E"); puts(“F"); case 7 : puts(“G"); break; case 1 : puts(“H"); } return 0; } グループワーク ?
右の空欄を補充して, swの値に応じて, 下記の文字を出力する プログラムを作成せよ。 sw=1 H sw=2D sw=3 A B C sw=4 C sw=5 E F G sw=6 B C sw=7 G sw=8 C case 3 : puts("A"); case 6 : puts("B"); case 8 : case 4 : puts("C"); break; case 2 : puts("D"); break; case 5 : puts("E"); puts("F"); case 7 : puts("G"); break; case 1 : puts("H"); グループワーク:解答 別解もあります