変数の値が特定の整数に一致するかどうかで分岐する switch 文を学ぶ。
多くの分岐を書くとき、if-else if の連鎖より見通しがよくなる。
switch (式) {
case 値1:
/* 式が値1と等しいときの処理 */
break;
case 値2:
/* 式が値2と等しいときの処理 */
break;
default:
/* どの case にも一致しないときの処理 */
}
| キーワード | 意味 |
|---|---|
case 値: | 式の値と一致したときの処理の開始点 |
break; | switch ブロックを抜ける。忘れると次の case に流れる(フォールスルー) |
default: | どの case にも一致しなかったときに実行される。省略可能 |
#include <stdio.h>
int main(void)
{
int n = 2;
switch (n) {
case 1:
printf("A\n");
break;
case 2:
printf("B\n");
break;
case 3:
printf("C\n");
break;
default:
printf("D\n");
}
return 0;
}
B
n = 2 なので case 2: に一致し「B」が出力される。
break により switch を抜け、case 3 や default は実行されない。
break を書かないと、一致した case 以降の処理が連続して実行される。
#include <stdio.h>
int main(void)
{
int n = 1;
switch (n) {
case 1:
printf("A\n");
/* break を書かない */
case 2:
printf("B\n");
default:
printf("D\n");
}
return 0;
}
A B D
| switch 文 | if 文 | |
|---|---|---|
| 得意な比較 | 整数値との完全一致 | 範囲・複合条件 |
| 使える型 | int, char のみ | 制限なし |
| 分岐が多いとき | 見通しがよい | else if が長くなる |
| 範囲比較(>=など) | できない | できる |
0〜6 の整数を入力し、対応する曜日名を英語で表示するプログラムを作れ。
0〜6 以外の入力には「Invalid input」と表示する。
| 入力 | 出力 |
|---|---|
| 0 | Sunday |
| 1 | Monday |
| 2 | Tuesday |
| 3 | Wednesday |
| 4 | Thursday |
| 5 | Friday |
| 6 | Saturday |
| その他 | Invalid input |
#include <stdio.h>
int main(void)
{
int n;
printf("0〜6の整数を入力してください: ");
scanf("%d", &n);
switch (n) {
/* ここに case を書く */
}
return 0;
}
#include <stdio.h>
int main(void)
{
int n;
printf("0〜6の整数を入力してください: ");
scanf("%d", &n);
switch (n) {
case 0: printf("Sunday\n"); break;
case 1: printf("Monday\n"); break;
case 2: printf("Tuesday\n"); break;
case 3: printf("Wednesday\n"); break;
case 4: printf("Thursday\n"); break;
case 5: printf("Friday\n"); break;
case 6: printf("Saturday\n"); break;
default: printf("Invalid input\n");
}
return 0;
}
2つの整数と演算子(+, -, *, /)を入力し、計算結果を表示するプログラムを作れ。
/ のとき b が 0 なら「0で割れません」と表示する。
#include <stdio.h>
int main(void)
{
int a, b;
char op;
printf("計算式を入力してください(例: 10 + 3): ");
scanf("%d %c %d", &a, &op, &b);
switch (op) {
/* ここに case を書く */
}
return 0;
}
#include <stdio.h>
int main(void)
{
int a, b;
char op;
printf("計算式を入力してください(例: 10 + 3): ");
scanf("%d %c %d", &a, &op, &b);
switch (op) {
case '+': printf("%d\n", a + b); break;
case '-': printf("%d\n", a - b); break;
case '*': printf("%d\n", a * b); break;
case '/':
if (b != 0) {
printf("%d\n", a / b);
} else {
printf("0で割れません\n");
}
break;
default:
printf("無効な演算子です\n");
}
return 0;
}
Q1. 次のプログラムの出力として正しいものはどれか。
int a = 3;
switch (a) {
case 1: printf("X\n"); break;
case 2: printf("Y\n"); break;
case 3: printf("Z\n"); break;
default: printf("W\n");
}
正解:ウ
a = 3 なので case 3 に一致 → 「Z」を出力。break で終了。
Q2. 次のプログラムの出力として正しいものはどれか(フォールスルーに注意)。
int x = 2;
switch (x + 1) {
case 1: printf("A\n");
case 2: printf("B\n");
case 3: printf("C\n");
default: printf("D\n");
}
正解:イ
x + 1 = 3 なので case 3 に一致 → 「C」出力。
break がないためフォールスルーで default へ → 「D」出力。
Q3. switch 文で使えない式として正しいものはどれか。
正解:ウ
switch 文の式は整数型(int, char など)のみ使用可能。double などの浮動小数点型は使えない。
Q4. switch 文と比べた if 文の利点として正しいものはどれか。
正解:イ
if 文は範囲比較(score >= 70)や &&・|| を使った複合条件に対応できる。
switch 文は整数値との完全一致のみ。