定番 FizzBuzz判定
条件を並べる順番のドリル
FizzBuzz は、条件分岐の練習として世界中で使われている定番の題材です。ルールは次のとおりです。3の倍数なら Fizz、5の倍数なら Buzz、3と5の両方の倍数なら FizzBuzz、どれでもなければ数をそのまま表示します。
1から100まで並べる版が有名ですが、繰り返しはまだ習っていないので、今回は数をひとつ受け取って1回だけ判定します。繰り返しと組み合わせる版は第4章で作ります。今回学ぶのは、条件を並べる順番という一点です。
倍数の判定は剰余で
「3の倍数」は、3で割った余りが0ということです。第2章で使った剰余演算子 % がそのまま使えます。
if (n % 3 == 0) {
printf("Fizz\n");
}% は == より先に計算されるので、(n % 3) == 0 と同じ意味になります。かっこを付けても構いません。
素直に書くと FizzBuzz が出ない
多くの人が最初にこう書きます。
if (n % 3 == 0) {
printf("Fizz\n");
} else if (n % 5 == 0) {
printf("Buzz\n");
} else if (n % 3 == 0 && n % 5 == 0) {
printf("FizzBuzz\n");
} else {
printf("%d\n", n);
}15 を入れてみると Fizz と出ます。15 は3の倍数なので1つ目の条件で確定し、else if の性質どおり残りは評価されないからです。3つ目の条件はどんな数を入れても真になりません。到達できない枝は、書いた本人以外にはバグに見えないので厄介です。
厳しい条件を先に置く
直し方は前回と同じ考え方です。当てはまる数が最も少ない、つまり最も厳しい条件を先頭に置きます。
if (n % 3 == 0 && n % 5 == 0) {
printf("FizzBuzz\n");
} else if (n % 3 == 0) {
printf("Fizz\n");
} else if (n % 5 == 0) {
printf("Buzz\n");
} else {
printf("%d\n", n);
}3と5の両方の倍数は3の倍数でもあるので、両方の判定を先に済ませておく必要があります。なお n % 3 == 0 && n % 5 == 0 は n % 15 == 0 と書いても同じ結果です。3と5に共通の倍数は15の倍数だからです。意図が伝わるのは前者、短いのは後者で、どちらを選んでも構いません。
要件
- scanf で整数を1つ読む
- 3と5の両方の倍数なら FizzBuzz と表示する
- 3の倍数だけなら Fizz、5の倍数だけなら Buzz と表示する
- どれでもなければ読み込んだ数をそのまま表示する
- 表示するのは1行だけにする
入出力例
main("9") → "Fizz"
main("10") → "Buzz"
main("30") → "FizzBuzz"
main("7") → "7"
main("1") → "1"ヒント
編集 LuaGate編集部