3つ以上の場合分け
条件が複数の場合の処理
今までに習ってきた方法では、1択ないしは2択の処理しかできませんでした。
しかし、現実には、3択以上の判断を必要とすることがいくらでもあります。
たとえば、ある動物園の入場料と年齢の関係が次の通りだったとします。
上記を元に、年齢を入力すると、必要な入場料を表示するプログラムを作ってみましょう。
次のプログラムは、if文を使って正直に作成した例です。
上記のプログラムは、ちゃんと正しく動作します。
しかし、幼児でも子供でもなければ確実に大人だと断言できます。
同様に、幼児でなければ子供か大人のどちらかになります。
それにもかかわらず、4回も年齢をチェックしており、ムダのあるプログラムになっています。
幼児ではない、大人ではない、といった、条件に一致しない場合の処理には、else文を使用できます。
したがって、else文を使用すれば、ムダな年齢チェックを減らすことができそうです。
しかし、今までは、条件に一致しない場合の処理は1つだけでした。
しかし、今回は、条件に一致しない場合の処理が、幼児ではない、大人ではない、の2つあります。
条件に一致しない場合の処理が2つある場合には、if~else文を連続させて書くことができます。
つまり、else文の実行文として、if文を使用することで、
直前に判断した内容を生かすことが出来、ムダがなくなるのです。
この考えかたで修正したプログラムは、次の通りになります。
このプログラムのポイントは、else文で実行する文にif文を使っている点です。
まず、始めのif文で、幼児であるのかどうかを判定します。
もし、幼児でなかった場合は、次に子供であるかを判定します。
もし、子供でなかった場合は、確実に大人なので、判断せずに表示します。
年齢のチェックが2回だけですんでおり、ムダが大幅に減少しています。
しかし、現実には、3択以上の判断を必要とすることがいくらでもあります。
たとえば、ある動物園の入場料と年齢の関係が次の通りだったとします。
| 区分 | 年齢 | 入場料 |
|---|---|---|
| 幼児 | 3歳以下 | 無料 |
| 子供 | 4~12歳 | 250円 |
| 大人 | 13歳以上 | 400円 |
上記を元に、年齢を入力すると、必要な入場料を表示するプログラムを作ってみましょう。
次のプログラムは、if文を使って正直に作成した例です。
ソースコード
#include <stdio.h>
int main(void)
{
int age;
printf("年齢:");
scanf("%d", &age);
if (age <= 3) printf("幼児:無料\n");
if (age >= 4 && age <= 12) printf("子供:250円\n");
if (age >= 13) printf("大人:400円\n");
return 0;
}
上記のプログラムは、ちゃんと正しく動作します。
しかし、幼児でも子供でもなければ確実に大人だと断言できます。
同様に、幼児でなければ子供か大人のどちらかになります。
それにもかかわらず、4回も年齢をチェックしており、ムダのあるプログラムになっています。
幼児ではない、大人ではない、といった、条件に一致しない場合の処理には、else文を使用できます。
したがって、else文を使用すれば、ムダな年齢チェックを減らすことができそうです。
しかし、今までは、条件に一致しない場合の処理は1つだけでした。
しかし、今回は、条件に一致しない場合の処理が、幼児ではない、大人ではない、の2つあります。
条件に一致しない場合の処理が2つある場合には、if~else文を連続させて書くことができます。
つまり、else文の実行文として、if文を使用することで、
直前に判断した内容を生かすことが出来、ムダがなくなるのです。
この考えかたで修正したプログラムは、次の通りになります。
ソースコード
#include <stdio.h>
int main(void)
{
int age;
printf("年齢:");
scanf("%d", &age);
if (age <= 3) {
printf("幼児:無料\n");
} else {
if (age <= 12) {
printf("子供:250円\n");
} else {
printf("大人:400円\n");
}
}
return 0;
}
このプログラムのポイントは、else文で実行する文にif文を使っている点です。
まず、始めのif文で、幼児であるのかどうかを判定します。
もし、幼児でなかった場合は、次に子供であるかを判定します。
もし、子供でなかった場合は、確実に大人なので、判断せずに表示します。
年齢のチェックが2回だけですんでおり、ムダが大幅に減少しています。
見やすい書き方
前項のプログラムでは、確かに年齢チェック回数のムダは減らせたのですが、
2回目の判定が右にずれているため、プログラムはあまり見やすくはありませんでした。
条件がさらに多くなると、インデントによってさらに右にずれていくために、
さらに見にくくなってしまいます。
これを見やすい文にするには、インデントを無視するしか方法はありません。
次のプログラムは、インデントを無視することで見やすくした例です。
このプログラムでは、else文のすぐ後ろにif文をつなげています。
その為、この書き方を、俗にelse-if文と呼ぶことがあります。
この書き方の良い所は、条件がいくつ増えても横に長くならないことです。
else文にifを書き足していくことで、下にどんどん伸びていきますが、
横方向には決して伸びないので、比較的見やすいプログラムになります。
2回目の判定が右にずれているため、プログラムはあまり見やすくはありませんでした。
条件がさらに多くなると、インデントによってさらに右にずれていくために、
さらに見にくくなってしまいます。
これを見やすい文にするには、インデントを無視するしか方法はありません。
次のプログラムは、インデントを無視することで見やすくした例です。
ソースコード
#include <stdio.h>
int main(void)
{
int age;
printf("年齢:");
scanf("%d", &age);
if (age <= 3) {
printf("幼児:無料\n");
} else if (age <= 12) {
printf("子供:250円\n");
} else {
printf("大人:400円\n");
}
return 0;
}
このプログラムでは、else文のすぐ後ろにif文をつなげています。
その為、この書き方を、俗にelse-if文と呼ぶことがあります。
この書き方の良い所は、条件がいくつ増えても横に長くならないことです。
else文にifを書き足していくことで、下にどんどん伸びていきますが、
横方向には決して伸びないので、比較的見やすいプログラムになります。
基本的にはインデントすべきです
これは、インデントを無視すると読みやすくなる特殊な例です。
ほとんどの場合にはインデントで右にずらしたほうが読みやすくなります。
ほとんどの場合にはインデントで右にずらしたほうが読みやすくなります。
本サイトについて
苦しんで覚えるC言語(苦C)はC言語入門サイトの決定版です。
C言語の基本機能を体系立てて解説しており、
市販書籍と同等以上の完成度です。




