サンプル問題 科目B 問2

問題

次のプログラム中の [ a ] ~ [ c ] に入れる正しい答えの組合せを,解答群の中から選べ。

関数 fizzBuzz は,引数で与えられた値が,3 で割り切れて 5 で割り切れない場合は“3 で割り切れる”を,5 で割り切れて 3 で割り切れない場合は“5 で割り切れる”を,3 と 5 で割り切れる場合は“3 と 5 で割り切れる”を返す。それ以外の場合は“3 でも 5 でも割り切れない”を返す。 

出典:基本情報技術者試験 科目B サンプル問題

解き方

問題としては難しいところはないと思いますが、条件を書く順番に注意が必要です。これは実務でも、込み入った条件になってくると間違えることがありました。

この問題では、3でも5でも割りきれる数は、3で割り切れるし、5でも割り切れる、という点がポイントです。真っ先に、3でも5でも割りきれるかどうか判断する必要があります。その後は、3で割り切れるか、5で割り切れるかの順番は気にしません。

回答

ということで、[ a ] には 3と5 が入り、その選択肢はウしかないので、これが正解です。

おまけ

一般化すると、ifの条件として要素A, B, Cがあり、条件A, B, Cに重なりがないと、この問題のような判断の順番を気にする必要がありません。

しかし、重なりがあると、重なった部分を先に判断する必要があります。下の図の場合は、A and B and Cを最初に判断して、次にA and B, B and C, C and Aをそれぞれ判断して、最後にA, B, Cを判断することになります。

あるいは、A and Bの代わりにA and B and (not C)、Aの代わりにA and (not B) and (not C)のように書けば、条件の重なりがなくなるので順番を気にしなくて良いのですが、これはこれで面倒です。