<戻る  目次  進む>  
          <戻 進> 雑誌 白黒 明暗   フォント 既定 ゴシック 明朝 手書き   サイズ   標準  


   番号による場合分け   

  1. 第1項:番号と対応させる処理
  2. 第2項:当てはまらない場合の処理
  3. 第3項:同様の処理をまとめる
  4. 第4項:判断力の弱さ

[1]番号と対応させる処理

今までに説明した方法で、もはやどんな条件の判断も可能です。
しかし、もうひとつ、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文と異なり、{} なしで複数の文を並べてもかまいません。

[  プログラマーは芸術家  ]
先ほどから、美しく、などという言葉を使用していますが、
実は、プログラマーの間では意外にも普通に使用される言葉です。
プログラマーの仕事は単純な計算を複雑に組み合わせるパズルであり、
それは技術者というより、むしろ芸術家に近いと言うべきです。

目次に戻る


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

実は、前項の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の番号を入力すると、対応する名前が表示されます。

目次に戻る


[3]同様の処理をまとめる

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

#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文を忘れないように。

目次に戻る


[4]判断力の弱さ

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

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

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

目次に戻る


<−前に戻る  先頭に戻る  次へ進む−>