13章 SWITCH文

http://www.geocities.jp/ky_webid/c/013.html

if文と同じように処理の流れを変更するのに使います。

この辺は習うより慣れよ。ということで一通り読んだら即練習問題に移りましょう。

問題1

次のプログラムはどんな処理をしているのか答えてください。

int main(void){
    int num;

    printf( "1〜4の数字を入力して下さい\n" );
    scanf( "%d", &num );
    switch( num ){
    case 4:
        printf( "*" );
    case 3:
        printf( "*" );
    case 2:
        printf( "*" );
    case 1:
        printf( "*" );
        break;
    default:
        printf( "入力された数字が不正です\n" );
        break;
    }

    return 0;
}

読み解いてみます。

4〜2までのcase文で意図的にbreak文を抜くことで入力された数値数の分だけ「*」を表示させるというわけですね。なるほど。

問題2

入力された数値が、奇数か偶数かを表示するプログラムを、switch文を使って書いてみて下さい。

switch文を使って書く?いまいち問題の意味がわからないですねぇ。

とりあえず無理やりでもswitch文を使ってみますか・・・。

int main () {
    int num;
    
    scanf("%d",&num);
    
    switch(num % 2){
        case 0:
            printf("偶数です");
            break;
        case 1:
            printf("奇数です");
            break;
    }
    return 0;
}
$ main
100
偶数です
$ main
3231
奇数です

こんな感じでいいのかな?

答え合わせ

おー、まんま当ってた。

問題3

「20 演算子 5」という数式の結果を表示するプログラムを作ります。「演算子」に使えるのは「+」「-」「*」「/」「%」の5種類とします。キーボードから、これらの演算子を入力してもらい、結果を表示するようにして下さい。また、正しくない演算子が入力されたときにはエラーメッセージを表示して下さい。

むむむ。またも難易度が跳ね上がった。とにかくやってみる。

int main () {
    int num1,num2;
    char c;
    
    printf("一つ目の数値\n");
    scanf("%d",&num1);
    printf("二つ目の数値\n");
    scanf("%d",&num2);
    
    printf("演算子の入力\n");
    scanf("%c",&c);
    switch(c) {
        case '+':
            printf("%d + %d = %d",num1,num2,num1 + num2);
            break;
        case '-':
            printf("%d - %d = %d",num1,num2,num1 - num2);
            break;
        case '*':
            printf("%d * %d = %d",num1,num2,num1 * num2);
            break;
        case '/':
            if ( num2 == 0 ) {
                printf("%d / %d = 0",num1,num2);
            }
            else {
                printf("%d / %d = %d",num1,num2,num1 / num2);
            }
            break;
        case '%':
            if ( num2 == 0 ) {
                printf("%d %% %d = 0",num1,num2);
            }
            else {
                printf("%d %% %d = %d",num1,num2,num1 % num2);
            }
            break;
        default:
            printf("正しい演算子を入力してください");
            break;
    }
    return 0;
}

これで試したところ、うまく動きませんでした。

二つ目の数値を入力した時点で、演算子の入力が勝手に終了してしまうんです。

よくわからないんですが、どうも改行コードが入力として使われてしまってるっぽいです。

対処法が思いつかなかったので、演算子の入力を最初に行うように変更してやってみるとうまく行きました。

どう考えてもごり押しですorz

ってことで修正バージョンは以下。

int main () {
    int num1,num2;
    char c;
    
    // 先に演算子の入力
    printf("演算子の入力\n");
    scanf("%c",&c);

    printf("一つ目の数値\n");
    scanf("%d",&num1);
    printf("二つ目の数値\n");
    scanf("%d",&num2);
    
    switch(c) {
        case '+':
            printf("%d + %d = %d",num1,num2,num1 + num2);
            break;
        case '-':
            printf("%d - %d = %d",num1,num2,num1 - num2);
            break;
        case '*':
            printf("%d * %d = %d",num1,num2,num1 * num2);
            break;
        case '/':
            if ( num2 == 0 ) {
                printf("%d / %d = 0",num1,num2);
            }
            else {
                printf("%d / %d = %d",num1,num2,num1 / num2);
            }
            break;
        case '%':
            if ( num2 == 0 ) {
                printf("%d %% %d = 0",num1,num2);
            }
            else {
                printf("%d %% %d = %d",num1,num2,num1 % num2);
            }
            break;
        default:
            printf("正しい演算子を入力してください");
            break;
    }
    return 0;
}
$ main
演算子の入力
+
一つ目の数値
10
二つ目の数値
10
10 + 10 = 20

$ main
演算子の入力
-
一つ目の数値
4
二つ目の数値
10
4 - 10 = -6

$ main
演算子の入力
*
一つ目の数値
99
二つ目の数値
10
99 * 10 = 990

$ main
演算子の入力
/
一つ目の数値
33
二つ目の数値
11
33 / 11 = 3

$ main
演算子の入力
%
一つ目の数値
100
二つ目の数値
2
100 % 2 = 0

バッチシです。「/」と「%」の場合は0除算の対応もしてみました。

$ main
演算子の入力
/
一つ目の数値
10
二つ目の数値
0
10 / 0 = 0

$ main
演算子の入力
%
一つ目の数値
10
二つ目の数値
0
10 % 0 = 0

うまくいってますね。

存在しない演算子の場合はエラーになります

$ main
演算子の入力
@
一つ目の数値
10
二つ目の数値
10
正しい演算子を入力してください

自分で言うのもなんですが、完璧っす。

答え合わせ

解答例を見たらフイタw

int num1 = 20;   /* 1つ目の数字 */
int num2 = 5;    /* 2つ目の数字 */

あああ、そこ固定で良かったのか・・・。

数値も入力させるのかと勘違いしてた。

まぁでも勉強になったので良しとします。