苦しんで覚えるC言語 8.2 3つ以上の場合分け  P155 – P158

条件が複数の場合の処理

これまで解説した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つネスト処理を書くと、一度その処理を{ }で閉じて、新たな処理として書き直していく傾向にあります。