プログラムは12行で、配列も繰返しも出てきません。決め手は1つ ── if と elseif は、上から見て最初に真になった1つだけを実行すること。これで、15 のように 3 でも 5 でも割り切れる数がどの行で決まるかが分かり、空欄は自分で書けます。
難易度 ★(当サイトの目安)── 条件を並べる順番(両方で割り切れるほうを先)に気づけば決まる。4段階の決め方は科目B 最短合格の戦略にあります。
出題
出典:基本情報技術者試験 科目B サンプル問題 問2
次のプログラム中の a ~ c に入れる正しい答えの組合せを,解答群の中から選べ。
関数fizzBuzz は,引数で与えられた値が,3 で割り切れて5 で割り切れない場合は“3 で割り切れる”を,5 で割り切れて3 で割り切れない場合は“5 で割り切れる”を,3 と5 で割り切れる場合は“3 と5 で割り切れる”を返す。それ以外の場合は“3 でも5 でも割り切れない”を返す。
〔プログラム〕
○文字列型: fizzBuzz(整数型: num) 文字列型: result if (num が a で割り切れる) result ← " a で割り切れる" elseif (num が b で割り切れる) result ← " b で割り切れる" elseif (num が c で割り切れる) result ← " c で割り切れる" else result ← "3 でも 5 でも割り切れない" endif return result
解答群
ア a = 3 / b = 3 と5 / c = 5
イ a = 3 / b = 5 / c = 3 と5
ウ a = 3 と5 / b = 3 / c = 5
エ a = 5 / b = 3 / c = 3 と5
オ a = 5 / b = 3 と5 / c = 3
※ 解答群の原本は a・b・c を3つの列に分けた表です。当サイトでは1行にまとめて引用しました(字句は変えていません)。
答えだけ先に見る
正解は ウ(a = 3 と5/b = 3/c = 5)です。
この問題に出てくる記号
読めない記号があったときだけ開いてください。
擬似言語の記号 6コ の読み方をひらく
| 書き方 | 読み方 |
|---|---|
○文字列型: fizzBuzz(整数型: num) |
ここから関数が1つ始まるという印。整数を1つ受け取って num という名前を付け、文字列を1つ返します |
文字列型: result |
文字列を入れる箱 result を用意する。この時点ではまだ何も入っていません |
result ← "…" |
右の文字列を result に入れる |
if / elseif / else |
上から順に条件を見て、最初に真になった1つだけを実行する。どれも偽なら else の下を実行する(成り立つことを真、成り立たないことを偽といいます) |
num が 3 で割り切れる |
num を 3 で割った余りが 0 なら真 |
return result |
result の中身を返して、関数を終える |
空欄 a に入るものを決める
決めるのは、いちばん上のこの2行です。
〔プログラム〕空欄 a の2行(上の〔プログラム〕から抜き出した。1字も変えていない)
if (num が a で割り切れる) result ← " a で割り切れる"
※ 上の〔プログラム〕からの抜粋です(1字も変えていません)。
まず、15 がどの行で決まるかを考えます。15 は 3 で割り切れ、5 でも割り切れます。つまり 「3 で割り切れる」「5 で割り切れる」「3 と5 で割り切れる」のどれを聞いても真です。
ところが if と elseif は、最初に真になった1つだけを実行し、その下の条件はもう見ません。だから15 は、いちばん上で聞かれたものに決まってしまいます。
15 は、いちばん上で聞かれたものに決まる
琥珀=最初に真になった条件 / 赤=問題文と違う答え / 緑=問題文どおりの答え
「3 で割り切れる」を最初に聞く並び
num = 15
最初の条件
3 で
割り切れる?
→ 真
ここで決まる
“3 で
割り切れる”
下の elseif はもう見られません。「3 と5 で割り切れる」かを聞く行に、15 は届きません。
「3 と5 で割り切れる」を最初に聞く並び
num = 15
最初の条件
3 と5 で
割り切れる?
→ 真
ここで決まる
“3 と5 で
割り切れる”
15 は問題文どおり“3 と5 で割り切れる”になります。
上の段で「3」の代わりに「5」を先に聞いても同じで、今度は“5 で割り切れる”で決まります。15 に“3 と5 で割り切れる”を返す道は、「3 と5 で割り切れる」かをいちばん最初に聞くことだけ。だから a = 3 と5 です。
空欄 b と c を決める
〔プログラム〕空欄 b・c の行(上の〔プログラム〕から抜き出した。1字も変えていない)
elseif (num が b で割り切れる) result ← " b で割り切れる" elseif (num が c で割り切れる) result ← " c で割り切れる" else result ← "3 でも 5 でも割り切れない" endif
※ 上の〔プログラム〕からの抜粋です(1字も変えていません)。
ここへ来るのは、a の条件が偽だった数だけです。つまり 3 と5 の両方では割り切れない数。
その数が 3 で割り切れるなら、5 では割り切れないことがもう決まっています。問題文の「3 で割り切れて5 で割り切れない場合」は、ここでは「3 で割り切れる」と聞くだけで言えるわけです。5 のほうも同じです。
だから b = 3、c = 5。どちらも割り切れない数(たとえば 7)は、両方偽で else へ落ち、“3 でも 5 でも割り切れない”になります。
解答群を見る
a = 3 と5、b = 3、c = 5。解答群でこの組は ウ ひとつだけです。a が「3 と5」なのも ウ だけなので、a が決まった時点で答えは1つに絞れていました。
答え合わせ ── 入れて動かすと、4通りとも正しく返る
空欄に ウ を入れて動かします。
1行ずつ追う 正解の ウ(a = 3 と5/b = 3/c = 5)
出典:科目B サンプル問題 問2(空欄に ウ を入れたもの)
ループ開始前
いま計算していること
変数の状態
return で返した文字列
トレース表(進めると1行ずつ積み上がります)
正解は ウ
a = 3 と5、b = 3、c = 5。両方で割り切れるかを最初に聞くから、15 が“3 と5 で割り切れる”に届きます。
ほかの4つは、a が「3」(ア・イ)か「5」(エ・オ)なので、15 がいちばん上で決まってしまいます。9・10・7 はどれを入れても正しく返るので、間違いが出るのは 15 のような両方で割り切れる数だけです。
次に読む
この問題でどこに手間取ったかで、行き先が変わります。
elseif に来た時点で何が確定しているかが曖昧だった人へR6 問1令和6年度 科目B 問1 ── 同じく if の連鎖で、上で決まったことが下で前提になる問題です一覧科目B 全44問の解説 ── 続けて解きたい人へこの記事で引用した資料
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。

