条件が複数の場合の処理
これまで解説したif文は、真のケース(1択)と真・偽のケース(2択)となります。2択以上の振り分けをしたい場合はどうすればよいでしょうか?
参考書の事例を元に解説します。
| 区分 | 年齢 | 入場料 |
| 幼児 | 3歳以下 | 無料 |
| 子供 | 4~12歳 | 250円 |
| 大人 | 13歳以上 | 400円 |
いくつかの場合分けの書き方が考えられます。
【例1 参考書と同じ記述】
#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;
}
【例2】
#include <stdio.h>
int main(void)
{
int age;
printf("年齢:");
scanf("%d",&age);
if(age >= 4) && (age <= 12)
{
printf("子供:250円\n");
}else
{
if(age <= 3)
{
printf("幼児:無料\n");
}else if(age >= 13)
{
printf("大人:400円\n");
}
}
return 0;
}
例1は参考書と同じ書き方です。
例2は敢えて判定順を変えつつ、論理演算子の && を活用し、else文に else ifとして条件を記載しました。
どの書き方をしても、処理結果は同じになりますが、設計する本人が分かりやすい書き方が一番となります。
見やすい書き方
見やすい書き方とは、処理が理解しやすい書き方とも言いかえれます。
上記の例2は、4~12歳の判定を行って、3歳以下、13歳以上を判定していますが、
心理的には、3歳以下の判定 ⇒ 4~12歳の判定 ⇒ 13歳以上の判定と、年齢の昇順で判定をするか、逆に降順で判定をする方が理解しやすいです。
また、if文の中に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;
}
if文の最後のelseについても、else if(age >= 13) と敢えて条件式を書いても構いません。
設計している本人が理解しやすい。他人が見ても分かりやすいコードが優先されます。
その他、これまでに触れたかもしれませんが、インデントは揃える様に意識をしてください。
{ }は同じインデントで揃え、纏まりの処理であることが分かるようにします。
ネストした処理を書く場合は、インデントを右にズラしていき、
処理が深くなっていくことを意識させる記述が一般的です。
上述の例1や例2のif文の様な感じです。
if(age >= 4) && (age <= 12)
{
printf("子供:250円\n");
}else
{
/* if文がネストしているのでインデントを右へズラしている */
if(age <= 3)
{
printf("幼児:無料\n");
}else if(age >= 13)
{
printf("大人:400円\n");
}
}
最初のelse文の中で更にif文が存在し、分岐処理の中に分岐処理が入っていることを、インデントを右へズラしていくことで明示します。
更に分岐処理が入れば同じ様に右へ右へズラすのですが、どこまでも継続はしません。
理由は、その方が分かり難くなるからです。
特に決まりはありませんが、一般的な設計者のコードを見ていると、3つ~4つネスト処理を書くと、一度その処理を{ }で閉じて、新たな処理として書き直していく傾向にあります。