第6章の3 switch文

1. switch文の基本

if~else if~else~は、多方向分岐を行う制御構造でした。しかし、選択肢が多く、それぞれの条件が具体的な値に基づく場合にはswitch文を使う方がシンプルでわかりやすくなります。

【書き方】
switch (式) {
  case定数式1:
    文1;
    break;
  case定数式2:
    文2;
    break;
    :
    :
  case定数式n:
    文n;
    break;
  default:
    文;
    break;
}

【フローチャート】

式の値が
定数式1 と等しければ、文1 実行
定数式2 と等しければ、文2 実行
定数式n と等しければ、文n 実行
それ以外ならば、文実行

switch文の使用例 サンプルプログラム

#include <stdio.h>

int main( void )
{
    int a;

    printf("整数値> ");
    scanf("%d", &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("others\n");
            break;
    }

    return 0;
}

【実行結果例】
整数値> 3
a = 3

水色文字はキーボードからの入力

2. switch文の注意事項

  • 「break」に出会うとswitchの {} を抜ける。
    「break」がないと、それ以下の文を全て実行してしまうので、「break」を忘れないこと。
  • 一致する定数式がないときは、「default」部分に記述された文を実行。「default」部は省略可。
  • 文は複数行の文も可。ただし、複数行でも { } は不要。
  • 「式」は整数を結果とするもののみ可。
    正しい式 誤った式
    int a;
    
    switch (a) 
    switch (a + 10)
    
    char moji;
    
    switch (moji)
    
    float a;
    
    switch (a)
    
  • 「定数式」は整数、文字定数、定数の式のみ。

    その他はelse ifを用いる。

    正しいcase句の例
    case 1: (整数)
    case 'A': (文字定数)
    case LIMIT: (記号定数
    誤ったcase句の例
    case 0.1: (浮動小数点数は不可)
    case x > 5: (大小比較は不可)
    case "XYZ": (文字列は不可)
    

3. 複数 case句を使った switch文

分岐先を示す case句を複数つけた switch文。

#include <stdio.h>

int main( void )
{
    int a;

    scanf("%d", &a);
    switch (a) {

        case 10:
        case 11:
        case 12:
            printf("10 ~ 12\n");
            break;
        case 13:
        case 14:
        case 15:
        case 16:
            printf("13 ~ 16\n");
            break;
        case 17:
        case 18:
            printf("17, 18\n");
            break;
        default:
            printf("その他\n");
            break;
    }
    return 0;
}

case句は分岐先を示すラベルである。
switch文では 1つの処理に対して複数の case句を記述することができる。

〇 演習問題

問1

scanf関数を用いて計算方法 ( + – * / ) と2個の整数を入力し、計算方法によって、2個の整数の計算を行いなさい。ただし、除算を指定した場合には 0 で割り算をしないこと。

【実行結果例】
計算方法の入力( + – * / )+
整数値1の入力 12
整数値2の入力 22
kekka = 34

水色文字はキーボードからの入力

問2

scanf関数で 1~10 までの整数値を1個入力し、入力した値により、以下の処理を行いなさい。

  • 入力した数字が 1 か 2 か 3 なら “1: one 2: two 3: three” と表示する。
  • 入力した数字が 4 か 5 か 6 なら “4: four 5: five 6: six” と表示する。
  • 入力した数字が 7 か 8 か 9 か 10 なら “7: seven 8: eight 9: nine 10: ten” と表示する。
  • それ以外なら “number input err” と表示する。

【実行結果例】
input number( 1-10 ) 5
4:four 5:five 6:six

水色文字はキーボードからの入力

解答例

// 問1
#include <stdio.h>

int main(void)
{
    char houhou;
    int data1, data2, kekka = 0;

    printf("計算方法の入力( + - * / )");
    scanf("%c", &houhou);
    printf("整数値1の入力 ");
    scanf("%d", &data1);
    printf("整数値2の入力 ");
    scanf("%d", &data2);

    switch (houhou) {
        case '+':
            kekka = data1 + data2;
            break;
        case '-':
            kekka = data1 - data2;
            break;
        case '*':
            kekka = data1 * data2;
            break;
        case '/':
            if (data2 != 0)
                kekka = data1 / data2;
            else
                printf("0で割ることはできません\n");
            break;
        default:
            printf("計算方法の入力エラーです\n");
            break;
    }
    printf("kekka = %d\n", kekka);

    return 0;
}
// 問2
#include <stdio.h>

int main(void)
{
    int no;

    printf("input number( 1-10 ) ");
    scanf("%d", &no);

    switch (no) {
        case 1:
        case 2:
        case 3:
            printf("1:one   2:two   3:three\n");
            break;
        case 4:
        case 5:
        case 6:
            printf("4:four  5:five  6:six\n");
            break;
        case 7:
        case 8:
        case 9:
        case 10:
            printf("7:seven 8:eight 9:nine  10:ten\n");
            break;
        default:
            printf("number input error\n");
            break;
    }
    return 0;
}

コメント