switch文 解答ページ | Programming Place Plus C言語編 第11章

トップページC言語編第11章

問題①

問題① 次のプログラムがコンパイルエラーになる理由を説明してください。

#include <stdio.h>

int main(void)
{
    int value = 3;

    switch (value + 1) {
    case 0:
        break;
    case 1:
        printf("*\n");
        break;
    case 1 + 1:
        printf("**\n");
        break;
    case 0:
        printf("\n");
        break;
    }
}


コンパイルエラーの原因は、同じ値になる caseラベルが2つあることです。このような重複は許されません。

switch (value + 1) のように、計算をともなう条件式はなんら問題ありません(条件「式」ですから、計算式を書いてかまいません)。value + 1 の結果は 4 であり、該当するラベルがありませんが、これも問題ありません。単に、どれも実行されないだけです。

case 1 + 1: のように、caseラベルのところで計算式を使うことも、それが定数式であるなら問題ありません。

最後のところに break; がありませんが、これも問題はありません。switch文の終わりの } に行き着いたら、switch文自体が終わります。

問題②

問題② 標準入力から、0~6 の整数を受け取り、それぞれに該当する曜日を出力するプログラムを switch文を使って、作成してください。「0」を日曜日、「1」を月曜日…といった具合に考えるものとします。


#include <stdio.h>

int main(void)
{
    puts("Please enter the integer (0~6).");
    char s[40];
    fgets(s, sizeof(s), stdin);
    int value;
    sscanf(s, "%d", &value);

    switch (value) {
    case 0:
        puts("Sunday");
        break;
    case 1:
        puts("Monday");
        break;
    case 2:
        puts("Tuesday");
        break;
    case 3:
        puts("Wednesday");
        break;
    case 4:
        puts("Thursday");
        break;
    case 5:
        puts("Friday");
        break;
    case 6:
        puts("Saturday");
        break;
    default:
        puts("Please Enter one of 0 to 6.");
        break;
    }
}

実行結果:

Please enter the integer (0~6).
3  <-- 入力された内容
Wednesday

defaultラベルを必ず書くようにしましょう。今回であれば、入力が間違っている場合に defaultラベルのところへ進むので、正しく入力するように促すメッセージを出しています。ここまでの知識だけではできませんが、こういう場合、再び入力からやり直させるように作ることもできます(たとえば、第17章で紹介する continue文を使うと、処理をやり直させることができます)。

問題③

問題③ 1~13 のいずれかの整数の入力を受け取ります。この整数をトランプの数字に見立てて、1 は A、11 は J、12 は Q、13 は K、それ以外の数はそのまま出力するプログラムを作成してください。


特別なあつかいをしなければならないのは、1、11、12、13 の4パターンです。これらにだけ caseラベルを用意し、ほかは defaultラベルの方に進ませればいいでしょう。たとえば次のようになります。

#include <stdio.h>

int main(void)
{
    puts("Please enter the integer. (1~13)");
    char s[40];
    fgets(s, sizeof(s), stdin);
    int value;
    sscanf(s, "%d", &value);

    switch (value) {
    case 1:
        puts("A");
        break;
    case 11:
        puts("J");
        break;
    case 12:
        puts("Q");
        break;
    case 13:
        puts("K");
        break;
    default:
        printf("%d\n", value);
        break;
    }
}

実行結果:

Please enter the integer. (1~13)
1  <-- 入力した整数
A

実行結果:

Please enter the integer. (1~13)
13  <-- 入力した整数
K

実行結果:

Please enter the integer. (1~13)
5  <-- 入力した整数
5

トランプに見立てている以上、1~13 以外の入力を不正なものとみなすという考え方をすることもできるでしょう。次のように書けます。

#include <stdio.h>

int main(void)
{
    puts("Please enter the integer. (1~13)");
    char s[40];
    fgets(s, sizeof(s), stdin);
    int value;
    sscanf(s, "%d", &value);

    switch (value) {
    case 1:
        puts("A");
        break;
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
    case 10:
        printf("%d\n", value);
        break;
    case 11:
        puts("J");
        break;
    case 12:
        puts("Q");
        break;
    case 13:
        puts("K");
        break;
    default:
        puts("error.");
        break;
    }
}

実行結果:

Please enter the integer. (1~13)
14  <-- 入力した整数
error.

defaultラベルを不正な入力の処理に使うようにしました。

入力が 2~10 のときの処理が全部同じになりますが、こういうときにはフォールスルーを利用して書けます。フォールスルーの濫用は避けたほうがいいですが、このサンプルのように明らかに同じ処理でいい(後から部分的に処理が変更されるとも思えないような)場面では使ってもいいでしょう。


参考リンク


更新履歴



第11章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る