3-4 switch 文 switch 文は 単一の式の値によって実行する内容を決める ( 変える ) 時に用いる 例えば if 文を使って次のようなプログラムを作ったとする /* 3 で割った余りを求める */ int a, b; b = a % 3; if (b== 0) printf( %d は 3 で割り切れます n, a); if (b == 1) printf( %d を 3 で割った余りは 1 です n, a); printf( %d を 3 で割った余りは2です n, a); 実行例 1 125 125 を 3 で割った余りは 2 です 実行結果 2 99 99 は 3 で割り切れます もちろんこれでも問題ないが switch 文を使うと スッキリ表すことができる switch (a % 3) case 0 : printf( %d は 3 で割り切れます n, a); break; case 1 : printf( %d を 3 で割った余りは 1 です n, a); break; case 2 : printf( %d を 3 で割った余りは 2 です n, a); break; 二つを見比べてどうだろうか では switch 文の具体的な使い方を見ていこう
switch 文の構文は次の通り switch ( 式 ) case * : 文 ; break; case * : 文 ; break; default : 文 ; くても間違いではない switch に続く括弧の中は式が入るが 変数でもかまわない ただし 結果の値は int 型か char 型か enum 型でなくてはならない case の次に実際の値が入り 式の結果によって文を実行する 文は複数行でもかまわないが 最後は必ず break で終わること これは case * の内容はここまでですよ と言うことを表し break にぶつかると switch 文の外に出る また それ以外は と言うときには default を用い 最後の break は無くてもよい というのは 常識的に考えて default は switch 文の一番最後に来るはずであり break を付けなくても必然的に switch 文が終わるからである そう言う意味では 前例の case 2 の部分は default に変えてもよいし 明示的に case 2 を使うのであれば 最後の break はな では break がないとどうなるか switch (a % 3) case 0 : printf( %d は 3 で割り切れます n, a); case 1 : printf( %d を 3 で割った余りは 1 です n, a); case 2 : printf( %d を 3 で割った余りは 2 です n, a); これは 先ほどの例から break をとったものである a%3 が 0 の時はもちろん case0 に飛んで printf を実行する 次の行は case1 なので条件に当てはまらないので飛ばすと思うかもしれないが そうではない case1,case2 に続く printf も実行してしまうのだ どういうことかというと case * default はラベルと呼ばれるもので 飛び先の目印となる ところが 一度飛んでいくとその後の case や default は無視されてしまう switch 文全体を一つの建物として例えてみよう 建物の入り口にはいくつかの入り口があり 入り口には番号が振ってある 番号にしたがって中に入り どんどん進んでいくが break があったら外に出る 無ければ先まで進む 図示したら次のような感じか
逆に このことを利用して 例えば 0 と 1,2 と 3 でそれぞれ同じ内容を実行するときは次のよ うな書き方ができる switch (a % 3) case 0 : case 1 : printf( %d は 0 か 1 です n, a); break; case 2 : case 3 : printf( %d は 2 か 3 です n, a); break; default : printf( %d は 0,1,2,3 のいずれでもありません n, a); case0, 1 のような書き方はできない switch の括弧の中は 式であって条件式ではない a>0 や a==b のような判定には使えない 括弧の仲は char 型でもよいので case a のような書き方は OK
次のようなプログラムがある 1~8 までの整数を入力したときの実行結果をそれ ぞれ示せ 問題 3-4 switch (a) case 1 : printf( A n ); printf( B n ); break; case 2 : printf( C n ); case 5 : printf( D n ); break; case 4 : printf( G n ); case 6 : case 7 : printf( E n ); break; default : printf( F n ); 3-5 入れ子になった if 文 if 文の中に さらに if 文を入れることができる 例えば 整数を入力して 正の値であれば 5 で割り切れるかどうかを表示し そうでなければ 正でない値が入力されました と表示する プログラムは 次のようになる if (a > 0) if (a % 5) printf( %d は 5 では割り切れません n, a); printf( %d は 5 では割り切れます n, a); printf( 正でない値が入力されました n ); まず 入力された値が 0 より大きいかどうかを判定し 0 より大きければさらに 5 で割り切れるかどうかを判定する 0 以下の時は最後の に飛んで printf を実行する 入れ子になった if 文や 多重ループ ( 後から出てくる ) はきちんとインデントをとらないとこんがらがってしまうので 十分注意すること
問題 3-5 荷物の運送料を 3 辺の合計と重さで決めるとする それらを入力することによ って 料金を自動的に計算するプログラムを作れ 荷物の大きさは縦 横 高さ をそれぞれ入力するものとする なお 料金の規定は次の通りである 5kg 未満 5kg 以上 8kg 未満 8kg 以上 100cm 未満 500 750 1000 100cm 以上 150cm 未満 700 950 1200 150cm 以上 900 1150 1400 次のプログラムの間違いをすべて指摘して修正せよ 問題 3-6 1: /*/* 小さい方の値と大きい方の値を求めて表示 */*/ 2: #includo <stdio.h> 3: main () 4: 5: int a, b; /* 読込む値 /* 6: int min, max; /* 小さい方 / 大きい方の値 7: printf( 整数 a: ); scanf( %d, a); 8: printf( 整数 b: ); scanf( %d, b); 9: if (a = b) 10: printf( 二つの値は同じです m ); 11: if 12: if (a < b) 13: min = a; 14: max = b; 15: 16: min = b; 17: max = a; 18: 19: 20: printf( 小さい方の値は min です m ); 21: printf( 大きい方の値は max です m ); 22:
問題解答 3-4 実行例 1 実行例 2 実行例 3 整数値を入力して下さい :1 A B 整数値を入力して下さい :2 C D 整数値を入力して下さい :3 F 実行例 4 実行例 5 実行例 6 整数値を入力して下さい :4 G E 整数値を入力して下さい :5 D 整数値を入力して下さい :6 E 実行例 7 実行例 8 整数値を入力して下さい :7 E 整数値を入力して下さい :8 F 1: case 1 を実行して終了 2: case 2 を実行した後 break がないので case 5 を実行して終了 3,8: 該当するケースがないので default を実行して終了 4: case 4 を実行した後 break がないので case 7 を実行して終了 値の並び順は 必ずしも順序よく並んでなくてもよい 5: case 5 を実行して終了 6,7: case 7 を実行して終了
3-5 double tate, yoko, takasa, weight; /* tate= たて yoko= よこ takasa= 高さ weight= 重さ */ double sum; /* sum=3 辺の長さの合計 */ int price; /* price= 料金 */ printf( 荷物のタテの長さ (cm): ); scanf( %lf, &tate); printf( ヨコの長さ (cm): ); scanf( %lf, &yoko); printf( 高さ (cm): ); scanf( %lf, &takasa); printf( 荷物の重さ (kg): ); scanf( %lf, weight); sum = tate + yoko + takasa; if (sum < 100) if (weight < 5) price = 500; if (weight < 8) price = 750; price = 1000; if (sum < 150) if (weight < 5) price = 700; if (weight < 8) price = 950; price = 1200; if (weight < 5) price = 900; if (weight < 8) price = 1150; price = 1400; printf( 料金は %d 円です \n, price);
3-6 1: 最後の */ が不必要 2: include が includo になっている 5: 最後の */ が /* になっている 6: 最後の */ が無い 7: scanf の & が抜けている 8: 7 と同じ 9: == が = になっている 10,20,21:\n が \m になっている 11: if が余計 10 行目の最後もしくは 11 行目の頭に が必要 あるいは 9 行目の を削除