分岐構造:switch文1★


次は、このような問題から始めましょう。

0から4までの整数を入力し、

「0」であれば、「Zero」
「1」であれば、「One」
「2」であれば、「Two」
「3」であれば、「Three」
「4」であれば、「Four」

と表示するプログラムを作ってみてください。









































解答例です。


<sample program 018-01>

#include <stdio.h>

int main( void )
{
    int input;

    printf( "0から4までの整数を入力してください:" );

    scanf( "%d", &input );

    if( input == 0 ) {
        printf( "Zero\n" );
    }

    if( input == 1 ) {
        printf( "One\n" );
    }

    if( input == 2 ) {
        printf( "Two\n" );
    }

    if( input == 3 ) {
        printf( "Three\n" );
    }

    if( input == 4 ) {
        printf( "Four\n" );
    }

    return 0;
}

<実行結果1 VC++ Express Edition>

0から4までの整数を入力してください:0
Zero
続行するには何かキーを押してください・・・

<実行結果2 VC++ Express Edition>

0から4までの整数を入力してください:1
One
続行するには何かキーを押してください・・・

<実行結果3 VC++ Express Edition>

0から4までの整数を入力してください:2
Two
続行するには何かキーを押してください・・・

<実行結果4 VC++ Express Edition>

0から4までの整数を入力してください:3
Three
続行するには何かキーを押してください・・・

<実行結果5 VC++ Express Edition>

0から4までの整数を入力してください:4
Four
続行するには何かキーを押してください・・・

<実行結果6 VC++ Express Edition>

0から4までの整数を入力してください:5
続行するには何かキーを押してください・・・

<実行結果7 VC++ Express Edition>

0から4までの整数を入力してください:-1
続行するには何かキーを押してください・・・

今までに書いた方法だとこのような例が考えられます。

if文を5つ並べる方法です。

また、else文とネストを使って作ることも出来ます。


<sample program 018-02>

#include <stdio.h>

int main( void )
{
    int input;

    printf( "0から4までの整数を入力してください:" );

    scanf( "%d", &input );

    if( input == 0 ) {
        printf( "Zero\n" );
    }
    else {
        if( input == 1 ) {
            printf( "One\n" );
        }
        else {
            if( input == 2 ) {
                printf( "Two\n" );
            }
            else {
                if( input == 3 ) {
                    printf( "Three\n" );
                }
                else {
                    if( input == 4 ) {
                        printf( "Four\n" );
                    }
                }
            }
        }
    }

    return 0;
}

<実行結果1 VC++ Express Edition>

0から4までの整数を入力してください:0
Zero
続行するには何かキーを押してください・・・

<実行結果2 VC++ Express Edition>

0から4までの整数を入力してください:1
One
続行するには何かキーを押してください・・・

<実行結果3 VC++ Express Edition>

0から4までの整数を入力してください:2
Two
続行するには何かキーを押してください・・・

<実行結果4 VC++ Express Edition>

0から4までの整数を入力してください:3
Three
続行するには何かキーを押してください・・・

<実行結果5 VC++ Express Edition>

0から4までの整数を入力してください:4
Four
続行するには何かキーを押してください・・・

<実行結果6 VC++ Express Edition>

0から4までの整数を入力してください:5
続行するには何かキーを押してください・・・

<実行結果7 VC++ Express Edition>

0から4までの整数を入力してください:-1
続行するには何かキーを押してください・・・

どちらかというと、こちらは悪い例となります。(間違いという訳ではありません。念のため)

ネストを繰り返している(ネストが深いといいます)ため、プログラムが右へ寄っています。

これが、「0」から「20」までとなると、画面からはみ出す可能性もあります。


しかし、実際に「0」から「20」までの分岐を考えた場合はどうなるのでしょうか。

if文を21個書くのでしょうか。

1つの変数に対して、値ごとに処理を分ける場合、switch文(スイッチ文)という分岐構造が使えます。

上のプログラムをswitch文に書き換えてみます。


<sample program 018-03>

#include <stdio.h>

int main( void )
{
    int input;

    printf( "0から4までの整数を入力してください:" );

    scanf( "%d", &input );

    switch( input ) {
        case 0:
            printf( "Zero\n" );
            break;
        case 1:
            printf( "One\n" );
            break;
        case 2:
            printf( "Two\n" );
            break;
        case 3:
            printf( "Three\n" );
            break;
        case 4:
            printf( "Four\n" );
            break;
    }

    return 0;
}

<実行結果1 VC++ Express Edition>

0から4までの整数を入力してください:0
Zero
続行するには何かキーを押してください・・・

<実行結果2 VC++ Express Edition>

0から4までの整数を入力してください:1
One
続行するには何かキーを押してください・・・

<実行結果3 VC++ Express Edition>

0から4までの整数を入力してください:2
Two
続行するには何かキーを押してください・・・

<実行結果4 VC++ Express Edition>

0から4までの整数を入力してください:3
Three
続行するには何かキーを押してください・・・

<実行結果5 VC++ Express Edition>

0から4までの整数を入力してください:4
Four
続行するには何かキーを押してください・・・

<実行結果6 VC++ Express Edition>

0から4までの整数を入力してください:5
続行するには何かキーを押してください・・・

<実行結果7 VC++ Express Edition>

0から4までの整数を入力してください:-1
続行するには何かキーを押してください・・・

とりあえず、入力して動作確認をしてみてください。

同じ動きをすることが確認できましたでしょうか。

では、文法を書きます。


・switch文の文法

switch( 変数 ) {
    case 整数1:
        変数の中身が整数1の場合の処理
        break;
    case 整数2:
        変数の中身が整数2の場合の処理
        break;
         .
         .
         .
} /* break後ここに飛びます */

switchの後に、変数を書きます。

この変数は整数型です。

case(ケース)はケースラベルといいます。(ラベルについては後述します)

これは、変数の中身が整数1の場合(ケース)は、caseラベルからbreakまでに書いてある処理を実行する、という意味です。

break(ブレイク)は、英語では破壊するという意味ですが、switch文を途中で抜けるという意味になります。
※コメントにも書いてありますが、抜けた後は「}」のところに行きます。

ですから、変数n中身が整数1の場合、整数1の場合の処理を実行した後、整数2の場合以降の処理は飛ばして、「}」へ飛ぶ、ということになります。


では、間違って実数(少数)の変数を指定したらどうなるでしょう?


<sample program 018-04>

#include <stdio.h>

int main( void )
{
    double input;

    printf( "0から4までの整数を入力してください:" );

    scanf( "%lf", &input );

    switch( input ) {
        case 0:
            printf( "Zero\n" );
            break;
        case 1:
            printf( "One\n" );
            break;
        case 2:
            printf( "Two\n" );
            break;
        case 3:
            printf( "Three\n" );
            break;
        case 4:
            printf( "Four\n" );
            break;
    }

    return 0;
}

<実行結果 VC++ Express Edition>

main.cpp(11) : error C2050: switch 式の結果は、整数値になりませんでした。

エラーになりました。

整数値にならないと書いてありますので、caseラベルの整数を実数にして見ましょう。


<sample program 018-05>

#include <stdio.h>

int main( void )
{
    double input;

    printf( "0から4までの整数を入力してください:" );

    scanf( "%lf", &input );

    switch( input ) {
        case 0.0:
            printf( "Zero\n" );
            break;
        case 1.0:
            printf( "One\n" );
            break;
        case 2.0:
            printf( "Two\n" );
            break;
        case 3.0:
            printf( "Three\n" );
            break;
        case 4.0:
            printf( "Four\n" );
            break;
    }

    return 0;
}

<実行結果 VC++ Express Edition>

main.cpp(11) : error C2050: switch 式の結果は、整数値になりませんでした。
main.cpp(12) : error C2052: 'double' : 条件式に対する無効な型です。
main.cpp(15) : error C2052: 'double' : 条件式に対する無効な型です。
main.cpp(18) : error C2052: 'double' : 条件式に対する無効な型です。
main.cpp(21) : error C2052: 'double' : 条件式に対する無効な型です。
main.cpp(24) : error C2052: 'double' : 条件式に対する無効な型です。

caseラベルの部分まで全部エラーになりました。

switch文は整数値しか判断できないということが分かりましたでしょうか。


次回は、switch文について、少しずつ掘り下げていきます。


次へ

戻る

目次へ