苦しんで覚えるC言語

番号による場合分け


番号と対応させる処理


今までに説明した方法で、もはやどんな条件の判断も可能です。
しかし、もうひとつ、C言語に用意された便利な判断文を知っておきましょう。

我々の身の回りでは、番号分けをすることが良くあります。
その1例として、学校のクラスの出席番号名簿を考えて見ましょう。
ある学校のあるクラスの出席番号名簿が次の通りであるとします。
番号名前性別
1野比のび太男性
2源静香女性
3剛田武男性
4骨川スネ夫男性
番号を入力すると、対応する名前を表示するプログラムを考えます。
これは、前述のelse-if文で簡単に実現可能です。

#include <stdio.h>
int main (void)
{
    int no;
    scanf("%d",&no);
    if (no == 1) {
            printf("野比のび太\n");
    } else if (no == 2) {
            printf("源静香\n");
    } else if (no == 3) {
            printf("剛田武\n");
    } else if (no == 4) {
            printf("骨川スネ夫\n");
    } else {
            printf("そんな番号の人はいない\n");
    }
    return 0;
}
この方法でももちろん良いのですが、else-ifが続き、あまり美しくありません。
switch(スイッチ)文~case(ケース)を使うと美しく書くことができます。
switch文~caseの使い方は、次の通りです。

switch (条件式) {
    case 数値:
        実行文;
        break;
    case 数値:
        実行文;
        break;
}
switch文は、指定された条件式の値と同じ値のcaseへジャンプします。
ジャンプ先ではcase以下の文を実行し、break(ブレイク)文を見つけたら、
switch文の後で囲っている {} の中から抜け出します。
次のプログラムは、switch文~caseを使って書きなおした例です。

#include <stdio.h>
int main (void)
{
    int no;
    scanf("%d",&no);
    switch (no) {
            case 1:
                printf("野比のび太\n");
                break;
            case 2:
                printf("源静香\n");
                break;
            case 3:
                printf("剛田武\n");
                break;
            case 4:
                printf("骨川スネ夫\n");
                break;
    }
    return 0;
}
先ほどまでよりも、番号との対応がわかりやすく、美しくなっています。
もちろん、番号を入力すると、対応する名前を表示されます。
なお、if文と異なり、{} なしで複数の文を並べてもかまいません。
プログラマーは芸術家
先ほどから、美しく、などという言葉を使用していますが、
実は、プログラマーの間では意外にも普通に使用される言葉です。
プログラマーの仕事は単純な計算を複雑に組み合わせるパズルであり、
それはある側面では芸術に近いと言える部分もあります。

目次に戻る

当てはまらない場合の処理


実は、前項のswitch文~case文のプログラムを実行して見ると、
else-if文で作成したときとは結果が異なることがあります。

else-if文のときは、名簿に無い番号を指定したときは、
「そんな番号の人はいない」と間違いを表示してくれたのですが、
switch文~caseのプログラムでは、何も表示してくれません。

このように、他のcaseの値に当てはまらない場合に処理を実行させるには、
default(デフォルト)を使用することができます。
defaultは、case文の代わりとして使うことができます。
defaultには、他のcaseに当てはまる数値が無かった場合にジャンプします。

次のプログラムは、defaultを追加したものです。


#include <stdio.h>
int main (void)
{
    int no;
    scanf("%d",&no);
    switch (no) {
            case 1:
                printf("野比のび太\n");
                break;
            case 2:
                printf("源静香\n");
                break;
            case 3:
                printf("剛田武\n");
                break;
            case 4:
                printf("骨川スネ夫\n");
                break;
            default:
                printf("そんな番号の人はいない\n");
                break;
    }
    return 0;
}
このプログラムを実行させて10を入力した場合の結果は、次の通りになります。

10 入力したデータ
そんな番号の人はいない
1~4の番号を入力すると、対応する名前が表示されます。

目次に戻る

同様の処理をまとめる


次は、先ほどの名簿を使って、性別を表示させるプログラムを考えて見ます。
これは、文字列を書き換えるだけなので、とても簡単です。
次のプログラムは、文字列を書き換えて作ったものです。

#include <stdio.h>
int main (void)
{
    int no;
    scanf("%d",&no);
        switch (no) {
        case 1:
            printf("男性\n");
            break;
        case 2:
            printf("女性\n");
            break;
        case 3:
            printf("男性\n");
            break;
        case 4:
            printf("男性\n");
            break;
        default:
            printf("そんな番号の人はいない\n");
            break;
    }
    return 0;
}
またまたおなじみの検討方法になるのですが、このプログラムを見ると、
「男性」の文字列が3回も使われていて、とてもムダです。
なんとかこれを1回で済ますことはできないのでしょうか。

実は、caseは、複数を連続させて使うことが可能です。
case自体には、switch文でジャンプする場所を示す意味しか無いので、
caseを複数つなげても、実行内容には影響がありません。
次のプログラムは 1、3、4 のcaseをつなげたものです。

#include <stdio.h>
int main (void)
{
    int no;
    scanf("%d",&no);
    switch (no) {
        case 1:
        case 3:
        case 4:
            printf("男性\n");
            break;
        case 2:
            printf("女性\n");
            break;
        default:
            printf("そんな番号の人はいない\n");
            break;  
    }
    return 0;
}
このプログラムでは 1、3、4 が入力された場合には、
いずれも「男性」を表示します。
break文を忘れるな
この例のように、break文を除けばcaseをつなげられるのですが、
逆に言えば、break文を忘れると関係ないcaseがつながってしまうのです。
つなげたくない場合にうっかりbreak文を忘れないように。

目次に戻る

判断力の弱さ


これまで見てきたことでわかるように、switch文~caseを使うと、
多方向に分岐するプログラムを簡単に書くことが可能です。
しかし、実は、switch文~caseは判断力がとても弱いのです。

switch文~caseにおいて、caseにおくことができるのは整数値だけです
実数や、変数や、条件式などをおくことはできないのです。
つまり、if文のように、変数同士を比べたり、大小関係の比較などは不可能です。

switch文~caseは、変数と整数値の比較にしか使うことができません。
複雑な判断が必要な場合には、if文を使う以外には方法がありません。

目次に戻る