複雑な条件分岐を行うためのスキルを学ぶ

今回はif文における、複雑な条件指定を勉強していこうと思います。
前回や前々回では非常にシンプルな条件での解説をしてきました。
しかし、実際には複雑な条件分岐を必要とされるシチュエーションもあります。
例題を出しながら学んでいきましょう。

例題「うるう年であるかどうかの判定プログラム」

プログラムの条件判定において、よく例題にされるのがうるう年です。
指定した年がうるう年であるかどうかの判定プログラムをif文で作成してみましょう。
そのためにも、まず知るべきは「うるう年の条件」です。うるう年の条件は下記となります。

・4で割り切れる西暦であること
・ただし、100で割り切れるのはうるう年ではない
・100で割り切れても400で割り切れたらうるう年である

これを素直にプログラムにすると下記になります。
 

    int year = 2000;
    if(year % 4 == 0)
    {
        if(year % 100 == 0)
        {
             if(year % 400 == 0)
            {
                printf("うるう年です。\n");
            }
            else
            {
                printf("うるう年ではない\n");
            }
        }
        else
        {
            printf("うるう年です。\n");
        }
    }
    else
    {
        printf("うるう年ではない\n");
    }

このプログラムで問題はないのですが、少し煩雑な書き方と言えます。
正直もう少しスマートな書き方の方が良いです。
仮にprintfの部分である、判定結果の処理を書きかえる際に少し面倒ですし、ひょっとしたら修正する際にバグが起こる可能性もあります。
また、if文の構造が深くなっているので、これ自体を嫌うプログラマーもいます。
では、どのようにしてスマートな書き方にするか?その答えはANDとORを使った条件判定を取り入れることです。
このANDとORを使った例を見てみましょう。

    int year = 2000;
    if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    {
        printf("うるう年です。\n");
    }
    else
    {
        printf("うるう年ではない\n");
    }

 
ANDとはif文の中にある&&であり、ORとは||の部分となります。
先ほどのプログラムに(year % 4 == 0 && year % 100 != 0)と書かれている部分があります。
これは4で割り切れて、且つ100で割り切れないという意味になります。ANDとはこの「且つ」の部分となります。
ではORはどのような意味なのか?
先ほどの例題では|| year % 400という部分がありました。
「4で割り切れて、且つ100で割り切れない」の後に||を入れることで、「または」400で割り切れるという意味になります。
(year % 4 == 0 && year % 100 != 0) || year % 400 == 0のプログラムの意味は「4で割り切れて、且つ100で割り切れない」または「400で割り切れる」となります。

ANDやORを使ってスマートなプログラムに!

if文は複雑な条件になり、if文の中にif文を入れ過ぎると複雑で読みにくくなってしまう場合があります。
どのようなコーディングをするかは目的次第ではありますが、行数を短く、分かりやすくすることでスマートなプログラムとなりますので意識して取り入れてみましょう。