今までに説明した方法で、もはやどんな条件の判断も可能です。
しかし、もうひとつ、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; }
switch文は、指定された条件式の値と同じ値のcaseへジャンプします。switch (条件式) { case 数値: 実行文; break; case 数値: 実行文; break; }
先ほどまでよりも、番号との対応がわかりやすく、美しくなっています。#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; }
[ プログラマーは芸術家 ]
先ほどから、美しく、などという言葉を使用していますが、
実は、プログラマーの間では意外にも普通に使用される言葉です。
プログラマーの仕事は単純な計算を複雑に組み合わせるパズルであり、
それは技術者というより、むしろ芸術家に近いと言うべきです。
実は、前項のswitch文〜case文のプログラムを実行して見ると、
else-if文で作成したときとは結果が異なることがあります。
else-if文のときは、名簿に無い番号を指定したときは、
「そんな番号の人はいない」と間違いを表示してくれたのですが、
switch文〜caseのプログラムでは、何も表示してくれません。
このように、他のcaseの値に当てはまらない場合に処理を実行させるには、
default(デフォルト)を使用することができます。
defaultは、case文の代わりとして使うことができます。
defaultには、他のcaseに当てはまる数値が無かった場合にジャンプします。
次のプログラムは、defaultを追加したものです。
このプログラムを実行させて10を入力した場合の結果は、次の通りになります。#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; }
1〜4の番号を入力すると、対応する名前が表示されます。
10 入力したデータ
そんな番号の人はいない
次は、先ほどの名簿を使って、性別を表示させるプログラムを考えて見ます。
これは、文字列を書き換えるだけなので、とても簡単です。
次のプログラムは、文字列を書き換えて作ったものです。
またまたおなじみの検討方法になるのですが、このプログラムを見ると、#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; }
実は、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: case 3: case 4: printf("男性\n"); break; case 2: printf("女性\n"); break; default: printf("そんな番号の人はいない\n"); break; } return 0; }
[ break文を忘れるな ]
この例のように、break文を除けばcaseをつなげられるのですが、
逆に言えば、break文を忘れると関係ないcaseがつながってしまうのです。
つなげたくない場合にうっかりbreak文を忘れないように。
これまで見てきたことでわかるように、switch文〜caseを使うと、
多方向に分岐するプログラムを簡単に書くことが可能です。
しかし、実は、switch文〜caseは判断力がとても弱いのです。
switch文〜caseにおいて、caseにおくことができるのは整数値だけです
実数や、変数や、条件式などをおくことはできないのです。
つまり、if文のように、変数同士を比べたり、大小関係の比較などは不可能です。
switch文〜caseは、変数と整数値の比較にしか使うことができません。
複雑な判断が必要な場合には、if文を使う以外には方法がありません。