*if文を用いた場合分け [#l5ecd070]
まずは、if文で場合分けするプログラムを考えてみましょう(プログラム1)。
#geshi(c){{
int i;
printf("数字を入力してください:\n");
scanf("%1d", &i);
if (i == 0) {
printf("ゼロ\n");
} else if (i == 1) {
printf("一\n");
} else if (i == 2) {
printf("二\n");
} else {
printf("三以上\n");
}
}}
このプログラムは、入力された数字によって、出力するメッセージを切り替えています。
このような場合分けを行う処理は、よく出てきます。
しかし、if文による場合分けでは、同じような条件式を何度も書かなければなりません。
そこで、場合分けを行うときに同じような条件式を何度も書かなくてもいいように、switch文が用意されています。
*switch文を用いた場合分け [#e9c501dc]
if文による場合分けにおいて、if文の条件文が、次の条件を満たすとき、このif文をswitch文に書き換えることができます。
-条件式の左辺がすべて同じ
-関係演算子がすべて ==
-条件式の右辺がすべて整数の定数
switch文は、次の形をしています。
#geshi(c){{
switch (条件式の左辺) {
case 定数1:
処理1
case 定数2:
処理2
...
default:
いずれの場合にも当てはまらないときの処理
}
}}
switch文は、条件式の左辺を計算し、その値が定数iに等しいときに処理i以後の処理を''すべて''実行します。
どの定数にも当てはまらない場合には、''default:'' の次に書かれている処理を実行します。
ここで、条件式の左辺の値が定数iに等しいとき、処理i以後の処理が''すべて''実行されることに注意しましょう。
if文による場合分けと同じように、処理i''だけ''を実行したいときは、処理iの最後に''break文が必要です''。
上のプログラム1をswitch文に書き換えると、次のようになります(プログラム2)。
#geshi(c){{
int i;
printf("数字を入力してください:\n");
scanf("%1d", &i);
switch (i) {
case 0:
printf("ゼロ\n");
break;
case 1:
printf("一\n");
break;
case 2:
printf("二\n");
break;
default:
printf("三以上\n");
}
}}
繰り返しますが、''break文''が入っていることに注意してください。
break文がないと、それ以後の処理がすべて実行されます。
**演習1 [#jab13f03]
プログラム2を作成し、実行結果を確認せよ。
**演習2 [#qda3b0b2]
プログラム2からすべてのbreak文を削除し、実行結果を確認せよ。
*複数の場合で同じ処理をするswitch文 [#zb36cc5e]
switch文において、break文がないと、それ以後の処理がすべて実行されます。
これを利用して、複数の場合で同じ処理をするswitch文を作ることができます。
次のプログラムは1から6までの整数をランダムに生成し、その数が1または6ならば「当たり」、そうでないならば「はずれ」と出力します(プログラム3)。
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int r;
srand((unsigned int) time(NULL));
r = rand() % 6 + 1;
printf("%d\n", r);
switch (r) {
case 1:
case 6:
printf("当たり\n");
break;
default:
printf("はずれ\n");
}
}
}}
*演習3 [#a8be8ed8]
プログラム3を作成し、実行結果を確認せよ。
*文字による場合分け [#vd885e11]
文字は文字コードで表されていますので、整数として扱うことができます。
したがって、switch文のcaseに文字を使うことができます(プログラム4)。
#geshi(c){{
char c;
int n;
printf("トランプのカードに使われる英字を入力してください\n");
scanf("%c", &c);
switch (s[0]) {
switch (c) {
case 'A':
n = 1;
break;
case 'J':
n = 11;
break;
case 'Q':
n = 12;
break;
case 'K':
n = 13;
break;
default:
n = -1;
}
if (n > 0) {
printf("%d\n", n);
} else {
printf("トランプには使われません\n");
}
}}
**演習4 [#hacb33d6]
プログラム4を作成し、実行結果を確認せよ。
*まとめ [#m9f5cc56]
if文による場合分けにおいて、if文の条件が一定の条件を満たすとき、''switch文''で書くことができます。
switch文は一致したケース以後の処理を全て行います。
したがって、全ての処理を実行しないときは''break文''を使ってswitch文を抜け出します。
break文の位置やケースの順序を工夫することによって、複数のケースで同じ処理を行うこともできます。