番号による場合分け
番号と対応させる処理
今までに説明した方法で、もはやどんな条件の判断も可能です。
しかし、もうひとつ、C言語に用意された便利な判断文を知っておきましょう。
我々の身の回りでは、番号分けをすることが良くあります。
その1例として、学校のクラスの出席番号名簿を考えて見ましょう。
ある学校のあるクラスの出席番号名簿が次の通りであるとします。
※上記はあくまでもわかりやすくした例であり、作中の設定とは異なります
上記を元に、出席番号を入力すると、対応する名前を表示するプログラムを作ってみましょう。
これは、前述のelse-if文で簡単に実現可能です。
上記のプログラムは、ちゃんと正しく動作します。
しかし else-if文 がとても多く、プログラムの入力が少々面倒です。
上記のような、複数の番号との一致を判断する場合に限り、より簡単な書き方が用意されています。
switch(スイッチ)文~case(ケース)を使うと、より美しく書くことができます。
switch文~caseの使い方は、次の通りです。
switch文は、指定された条件式の値と同じ値のcaseまで、処理の順番をジャンプします。
ジャンプ先ではcase以下の文を実行し、break(ブレイク)文を見つけたら、
switch文のあとで囲っている {} の中から抜け出します。
次のプログラムは、switch文~caseを使って書きなおした例です。
先ほどまでよりも、番号との対応がわかりやすく、美しくなっています。
もちろん、番号を入力すると、対応する名前を表示されます。
なお、if文と異なり、{} なしで複数の文を並べてもかまいません。
しかし、もうひとつ、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を追加したものです。
このプログラムを実行させて10を入力した場合の結果は、次の通りになります。
1~4の番号を入力した場合には、対応する名前が正しく表示されます。
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回も使われていて、とてもムダです。
なんとかこれを1回で済ますことはできないのでしょうか。
実は、caseは、複数を連続させて使うことが可能です。
case自体には、switch文でジャンプする場所を示す意味しかないので、
caseを複数つなげても、実行内容には影響がありません。
次のプログラムは 1、3、4 のcaseをつなげたものです。
このプログラムでは 1、3、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文には十分に注意するようにしましょう。
逆に言えば、break文を忘れると関係ないcaseがつながってしまいます。
著名なアプリで、break文を忘れたことで、重大なバグが発生してしまった実例もあります。
break文には十分に注意するようにしましょう。
判断力の弱さ
これまで見てきたことでわかるように、switch文~caseを使うと、
多方向に分岐するプログラムを簡単に書くことが可能です。
しかし、実は、switch文~caseは判断力がとても弱いのです。
switch文~caseにおいて、caseにおくことができるのは整数値だけです
実数や、変数や、条件式などをおくことはできないのです。
つまり、if文のように、変数同士を比べたり、大小関係の比較などは不可能です。
switch文~caseは、変数と整数値の比較にしか使うことができません。
複雑な判断が必要な場合には、if文を使う以外には方法がありません。
多方向に分岐するプログラムを簡単に書くことが可能です。
しかし、実は、switch文~caseは判断力がとても弱いのです。
switch文~caseにおいて、caseにおくことができるのは整数値だけです
実数や、変数や、条件式などをおくことはできないのです。
つまり、if文のように、変数同士を比べたり、大小関係の比較などは不可能です。
switch文~caseは、変数と整数値の比較にしか使うことができません。
複雑な判断が必要な場合には、if文を使う以外には方法がありません。
本サイトについて
苦しんで覚えるC言語(苦C)はC言語入門サイトの決定版です。
C言語の基本機能を体系立てて解説しており、
市販書籍と同等以上の完成度です。




