MMGamesロゴ  MMGames
Twitterシェアボタン  Facebookシェアボタン   
 English 

しんで覚えるC言語
しんで覚える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の使い方
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文を忘れたことで、重大なバグが発生してしまった実例もあります。
break文には十分に注意するようにしましょう。

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

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

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


本サイトについて

苦しんで覚えるC言語(苦C)は
C言語入門サイトの決定版です。
C言語の基本機能を体系立てて解説しており、
市販書籍と同等以上の完成度です。

第0部:プログラム概要編
  1. プログラムとは何か?
2章:プログラムの書き方
  1. 書き方のルール
  2. 書き方の慣習
  3. 練習問題2
3章:画面への表示
  1. 文字列の表示
  2. 改行文字
  3. 練習問題3
6章:キーボードからの入力
  1. 入力用の関数
  2. 入力の恐怖
  3. 練習問題6
9章:回数が決まっている繰り返し
  1. 繰り返しを行う文
  2. ループ動作の仕組み
  3. 練習問題9
10章:回数がわからない繰り返し
  1. 回数不明ループ
  2. 入力チェック
  3. 練習問題10
13章:複数の変数を一括して扱う
  1. 複数の変数をまとめて扱う
  2. 配列の使い方
  3. 練習問題13
20章:複数のソースファイル
  1. 最小限の分割
  2. 分割の定石
  3. 練習問題20

コメント
COMMENT

💬 コメント投稿欄を開く