第5章 制御文 制御式を書 く if (aa > 100) bb = 200; else bb = 300; ーこの条件が取れたら ーこれを実行 ーそうでなければ ーこれを実行 単一文を制御す る int i; for (i=1; i<=3; i++) printf(“aaaa\n”); -3回繰り返せ -この文を int i; for (i=1; i<=3; i++) printf(“aaaa\n”); printf(“bbbb\n”); -このfor文は -このひとつの文だけを制御 -この文はfor文の制御範囲にない 複合文(ブロック)を使 う int i; for (i=1; i<=3; i++) { printf(“aaaa\n”); printf(“bbbb\n”); } -この{から -この}までを繰り返す 空文を使う for (i=1; i<=10000; i++) ; -1万回ループする -その間何もしない if (aa > 100) -1万回ループする ; -その間何もしない else ーそうでないときは bb = 200; ーこれを実行する if文の書式 if (式) { 文1 } else { 文2 } ・式が新なら文1を、偽なら文2を実行する ・else以下は不要なら省略できる ・文がひとつなら{}は省略できる 式 文1 文2 例1 被制御文が単文の 例 if (b > 10) b = 0; else ++b; -bが10より大なら ーこれを実行 ーさもなくば ーこちらを実行 例2 被制御文が複数の 例 if (a == 2) { x = 1; y = 2; } else { x = 3; y = 4; } -aが2なら これを実行 ーさもなくば こちらを実行 リスト if文の使用例 #include <stdio.h> int main(void) { int n1, n2, n3; printf(“数値1: “); scanf(“%d”,&n1); if (n1%2 ==1) { -2で割った余りが1なら奇数 printf(“数値1は奇数\n”); } else { printf(“数値1は奇数\n”); } printf(“数値2: ”); scanf(“%d, &n2); printf(“数値3: “); scanf(“%d”, &n3); if (n2 > n3) -else ifによる多方向分岐 printf(“数値2の方が数値3より大きい\n”); else if (n2 < n3) printf(“数値2より数値3の方が大きい\n”); else printf(“数値2と数値3は等しい\n”); return 0; } for文の書式 初期化式 for (初期化式; 継続条件式; 再設定式) { 文 } 偽 継続条件式 真 ・まずループ処理に入る前に初期化式を実行する 文 ・その後、継続条件式が真の間、文を実行する ・各ループ処理のたびに文の実行後、再設定式を実行する 再設定式 ・文がひとつなら{}は省略できる ◆for文の決まり文句◆ for (i= ; i<= から ; i++) まで 実際の意 味 変数iを1にしろ(初期化) iが10以下の間ループしろ(継続条件 ループのたびにiを1加算しろ(再設定) for (i=1; i<=10; i++) { ・・・ } リスト for文の使用 例#include <stdio.h> int main(void) { int i, sum, mul; sum = 0; mul = 1; for (i=1; i<=5; i++) { sum = sum + i; mul = mul + i; } printf(“和=%d\n”, sum); printf(“積=%d\n”, mul); -1~5の加算と乗積をする -合計値を出力 ー乗算値を出力 for (i=40; i>=20; i=i-2) { printf(“%d ”, i); } printf(“\n”); return 0; } -カウントダウンfor文 -途中値を出力 ー最後に開業する while文の書式 while (式) { 文 } 偽 式 真 文 ・式が真である間、文を繰り返し実行する ・while文は次のループに「入る条件」を判断する ・式がはじめから偽の場合は1度も実行されない ・文がひとつなら{}は省略できる リスト while文の使用例 #include <stdio.h> 1 int main(void) { int i, de[ ] = {100, 200, 300, -1, 400}; i = 0; while (dt[i] i = -1) { printf(“%d\n”, dt[i]); i++; } return 0; } ーdt[i]が-1でない間ループせよ ー内容を表示 ー次の継続条件のための準備 リスト while文の使用例 #include <stdio.h> 2 int main(void) { int nn, sum = 0; scanf(“%d”, &nn); while (nn != 0) { printf(“入力値=%d\n”, nn); sum = sum + nn; scanf(“%d”, &nn); } printf(“合計値=%d\n”, sum); return 0; } -最初のデータ入力 ーデータが0でなければループする ー値の出力 ー加算する -2回目以降のデータ入力 -加算結果の出力 do-while文の書 式 do { 文 } while (式); 文 真 式 偽 ・式が真なら処理を継続する ・do-while文では最低1回は文を実行する ・do-while文は現在のループを「続行する条件」を判断する ・文がひとつなら{}は省略できる ・式の後ろに’;’が必要 { }を省略しない do a[i] = b[i]; while (a[i++]); -この行だけを見るとwhile文のように見える do { a[i] = b[i]; } while (a[i++]); -’}’があるのでdo-whileだろうと推測できる リスト do-while文の使用例 #inclede <stdio.h> int main(void) { int n; char ss[ ] = “ABCDE”; printf(“%s\n”, ss); n = -1 do { ++n; printf(“%d”, ss[n]); } while(ss[n] != ‘0’); printf(“\n”); return 0; } -文字列は最後に’\0’をもっている ー文字列を出力 ーループ開始 -数値で出力 -’\0’でなければループ継続 -最後に改行する switch文の書式 switch (式) { case 定数式1; 文1 break; case 定数式2; 文2 break; ・ ・ ・ case 定数式n; 文n break; default: 文 式 case 定数式1 文1 case 定数式2 文2 default case 定数式n 文n 文 } ・式の値を評価し、その値と一致する定数式のcase部分にジャンプし、対応する文を実行する ・式は整数を結果とするものでなければならない ・定数式は定数で表現した式を書く(変数名を使ってはいけない) ・break文に出会うと処理を終了してswitch文全体を終了する ・一致する定数式がないときはdefault部分に記述された文を実行する ・default部は不要なら省略できる リスト switch文で分岐する #inclede <stdio.h> int main(void) { int a; for (a=1; a<=5; a++) { printf(“--------%d\n”, a); switch (a) { case 1: printf(“a=1\n”); break; case 3: printf(“a=3\n”); break; 終 case 5: 了 printf(“a=5\n”); break; default: printf(“その他\n”); } } return 0; } aの値で分岐 a=1のときここにくる。’:’が必要 実行される文(いくつ書いてもよい) breakでcase1を終了する a=3のときここにくる a=5のときここにくる その他のときここにくる break文の書式 break; ・break文はseitch文の終了、またはfor,while,do-whileのループから脱出する ための文である ・break文を使うとスマートにループを脱出することができる ・switch文以外で用いるbreak文は、if文と併用することが多い ・ループがネスト構造になっているときは、break文の存在するループをひとつだけ抜ける リスト 基本的なbreak処理 #inclede <stdio.h> int main(void) { int i, dt[10]; printf(“----- for loop\n); for (i=0; i<10; i++) { scanf(“%d”, &dt[i]); if (dt[i] == 0) break; ―とりあえず10回ループせよ ―データ格納 ―データが0ならループを打ち切れ } printf(“----- while loop\n”); i = 1; while (1) { ―無限ループせよ printf(“%d”, i); if (i> 1000) break; ―iの値が1000を超えたら理を打ち切れ i = i * 2; ―数値を2倍にする } printf(“\n”); ―改行 return 0; } リスト 多重ループでのbreak文の効果 #include <stdio.h> int main(void) { int i, j; for (i=1, i<=4, i++) { printf(“i=%d: “, i); for (j=1, j<=4; j++) { printf(“j=%d “, j): if (j == 2) break; } printf(“\n”); } return 0; } ひとつだけル ープ脱出 内側の ループ 外側の ループ break文の書式 continue; ・continueはfor,while,do-whileの中で使用する ・ループ処理をその回だけスキップし、以降の処理は継続(continue)する ・continue記述位置から、ループ終端部までに書かれた記述をスキップす る リスト breakとcontinueの違いを見る #include <stdio.h> int main(void) { int i; printf(“----- break test\n”); for (i=1; i<=4; i++) { printf(“i=%d start\n”, i); if (i == 2) break; ―iが2ならcontinue printf(“i=%d end\n”, i); } printf(“----- continue test\n”); for (i=1; i<=4; i++) { printf(“i=%d start\n”, i); if (i == 2) continue; printf(“i=%d end\n”, i); } return 0; } ―iが2ならbreak 練習問題1 解答例 #include <stdio.h> int main(void) { int sum; sum = 0; for (i=1; i<=100; i++) { sum = sum + i; } printf(“sum=%d\n”, sum); sum = 0; i = 1; while (i<=100){ sum = sum + i; ++i; } printf(“sum=%d\n”, sum); sum = 0; i = 1; do { sum = sum + i; ++i; } while (i <= 100); printf(“sum=%d\n”, sum); return 0; } 練習問題2 解答例 1900年から2000年の間で、うるう年である年号を、for文とif文を使って、次 のように表示しなさい。 #include <stdio.h> int main(void) { int n; for (n=1900; n<=2000; n++) { if (n%4==0 && n%100!=0) printf(“%d “,n); else if (n%400 == 0) printf(“%d ”, n); } printf(“\n”) return 0; }
© Copyright 2025 ExpyDoc