次は、このような問題から始めましょう。
0から4までの整数を入力し、
「0」であれば、「Zero」
「1」であれば、「One」
「2」であれば、「Two」
「3」であれば、「Three」
「4」であれば、「Four」
と表示するプログラムを作ってみてください。
解答例です。
<sample program 018-01>
#include <stdio.h> int main(void) { int input; printf("0から4までの整数を入力してください:"); scanf("%d", &input); if (input == 0) { printf("Zero\n"); } if (input == 1) { printf("One\n"); } if (input == 2) { printf("Two\n"); } if (input == 3) { printf("Three\n"); } if (input == 4) { printf("Four\n"); } return 0; } |
<実行結果1>
0から4までの整数を入力してください:0 Zero 続行するには何かキーを押してください・・・
<実行結果2>
0から4までの整数を入力してください:1 One 続行するには何かキーを押してください・・・
<実行結果3>
0から4までの整数を入力してください:2 Two 続行するには何かキーを押してください・・・
<実行結果4>
0から4までの整数を入力してください:3 Three 続行するには何かキーを押してください・・・
<実行結果5>
0から4までの整数を入力してください:4 Four 続行するには何かキーを押してください・・・
<実行結果6>
0から4までの整数を入力してください:5 続行するには何かキーを押してください・・・
<実行結果7>
0から4までの整数を入力してください:-1 続行するには何かキーを押してください・・・
今までに書いた方法だとこのような例が考えられます。
if文を5つ並べる方法です。
また、else文とネストを使って作ることも出来ます。
<sample program 018-02>
#include <stdio.h> int main(void) { int input; printf("0から4までの整数を入力してください:"); scanf("%d", &input); if (input == 0) { printf("Zero\n"); } else { if (input == 1) { printf("One\n"); } else { if (input == 2) { printf("Two\n"); } else { if (input == 3) { printf("Three\n"); } else { if (input == 4) { printf("Four\n"); } } } } } return 0; } |
<実行結果1>
0から4までの整数を入力してください:0 Zero 続行するには何かキーを押してください・・・
<実行結果2>
0から4までの整数を入力してください:1 One 続行するには何かキーを押してください・・・
<実行結果3>
0から4までの整数を入力してください:2 Two 続行するには何かキーを押してください・・・
<実行結果4>
0から4までの整数を入力してください:3 Three 続行するには何かキーを押してください・・・
<実行結果5>
0から4までの整数を入力してください:4 Four 続行するには何かキーを押してください・・・
<実行結果6>
0から4までの整数を入力してください:5 続行するには何かキーを押してください・・・
<実行結果7>
0から4までの整数を入力してください:-1 続行するには何かキーを押してください・・・
どちらかというと、こちらは悪い例となります。(間違いという訳ではありません。念のため)
ネストを繰り返している(ネストが深いといいます)ため、プログラムが右へ寄っています。
これが、「0」から「20」までとなると、画面からはみ出す可能性もあります。
しかし、実際に「0」から「20」までの分岐を考えた場合はどうなるのでしょうか。
if文を21個書くのでしょうか。
1つの変数に対して、値ごとに処理を分ける場合、switch文(スイッチ文)という分岐構造が使えます。
上のプログラムをswitch文に書き換えてみます。
<sample program 018-03>
#include <stdio.h> int main(void) { int input; printf("0から4までの整数を入力してください:"); scanf("%d", &input); switch( input) { case 0: printf("Zero\n"); break; case 1: printf("One\n"); break; case 2: printf("Two\n"); break; case 3: printf("Three\n"); break; case 4: printf("Four\n"); break; } return 0; } |
<実行結果1>
0から4までの整数を入力してください:0 Zero 続行するには何かキーを押してください・・・
<実行結果2>
0から4までの整数を入力してください:1 One 続行するには何かキーを押してください・・・
<実行結果3>
0から4までの整数を入力してください:2 Two 続行するには何かキーを押してください・・・
<実行結果4>
0から4までの整数を入力してください:3 Three 続行するには何かキーを押してください・・・
<実行結果5>
0から4までの整数を入力してください:4 Four 続行するには何かキーを押してください・・・
<実行結果6>
0から4までの整数を入力してください:5 続行するには何かキーを押してください・・・
<実行結果7>
0から4までの整数を入力してください:-1 続行するには何かキーを押してください・・・
とりあえず、入力して動作確認をしてみてください。
同じ動きをすることが確認できましたでしょうか。
では、文法を書きます。
switch (変数) { case 整数1: 変数の中身が整数1の場合の処理 break; case 整数2: 変数の中身が整数2の場合の処理 break; . . . } /* break後ここに飛びます */
switchの後に、変数を書きます。
この変数は整数型です。
case(ケース)はケースラベルといいます。(ラベルについては後述します)
これは、変数の中身が整数1の場合(ケース)は、caseラベルからbreakまでに書いてある処理を実行する、という意味です。
break(ブレイク)は、英語では破壊するという意味ですが、switch文を途中で抜けるという意味になります。
※コメントにも書いてありますが、抜けた後は「}」のところに行きます。
ですから、変数n中身が整数1の場合、整数1の場合の処理を実行した後、整数2の場合以降の処理は飛ばして、「}」へ飛ぶ、ということになります。
では、間違って実数(小数)の変数を指定したらどうなるでしょう?
<sample program 018-04>
#include <stdio.h> int main(void) { double input; printf("0から4までの整数を入力してください:"); scanf("%lf", &input); switch (input) { case 0: printf("Zero\n"); break; case 1: printf("One\n"); break; case 2: printf("Two\n"); break; case 3: printf("Three\n"); break; case 4: printf("Four\n"); break; } return 0; } |
<実行結果>
error C2450: switch 式の求める数値の型 'double' が無効です。 note: 整数型の式が必要です。
エラーになりました。
整数値にならないと書いてありますので、caseラベルの整数を実数にして見ましょう。
<sample program 018-05>
#include <stdio.h> int main(void) { double input; printf("0から4までの整数を入力してください:"); scanf("%lf", &input); switch (input) { case 0.0: printf("Zero\n"); break; case 1.0: printf("One\n"); break; case 2.0: printf("Two\n"); break; case 3.0: printf("Three\n"); break; case 4.0: printf("Four\n"); break; } return 0; } |
<実行結果>
error C2450: switch 式の求める数値の型 'double' が無効です。 note: 整数型の式が必要です。 error C2052: 'double': 条件式に対する無効な型です。 error C2052: 'double': 条件式に対する無効な型です。 error C2052: 'double': 条件式に対する無効な型です。 error C2052: 'double': 条件式に対する無効な型です。 error C2052: 'double': 条件式に対する無効な型です。 warning C4060: switch ステートメントに 'case' または 'default' ラベルがありません。
caseラベルの部分まで全部エラーになりました。
switch文は整数値しか判断できないということが分かりましたでしょうか。
次回は、switch文について、少しずつ掘り下げていきます。