令和6年度の科目B、その1問目です。プログラムは8行しかなく、配列も繰返しも出てきません。決め手は2つだけです ── 空欄より下が何を返すかと、残りを空欄が引き受けること。この記事では、解答群を1度も見ないまま空欄を自分で書くところまで進みます。
出題
まず原文のまま読んでみてください。記号の読み方は次の節にまとめてありますので、読めなくてもここでは問題ありません。
出典:令和6年度 基本情報技術者試験 科目B 公開問題 問1
次のプログラム中の に入れる正しい答えを,解答群の中から選べ。
関数maximum は,異なる三つの整数を引数で受け取り,そのうちの最大値を返す。
〔プログラム〕
○整数型: maximum(整数型: x, 整数型: y, 整数型: z)
if ( )
return x
elseif (y > z)
return y
else
return z
endif
解答群
ア x > y
イ x > y and x > z
ウ x > y and y > z
エ x > z
オ x > z and z > y
カ z > y
答えだけ先に見る
正解は イ(x > y and x > z)です。ほかの5つが駄目な理由も、数を入れて確かめます。
この問題に出てくる記号
読めない記号があったときだけ開いてください。いま読めればいいのは8つだけで、細かいところは使う場面で足していきます。
擬似言語の記号 8コ の読み方をひらく
| 書き方 | 読み方 |
|---|---|
○整数型: maximum(…) |
ここから関数が1つ始まるという印。○ のうしろの 整数型 は返すものの型、括弧の中が受け取るものです。別の場所から maximum(9, 5, 2) のように呼ばれると、x・y・z に順に入ります |
整数型: x |
x という箱を1つ用意する。整数型 なので整数だけが入ります。ここでは呼んだ側から値が渡ってきます(この受け取るものを引数といいます) |
if (…)endif |
かっこの中が成り立つときだけ、あいだの行を実行する(成り立つことを真、成り立たないことを偽といいます)。endif が枝分かれの終わりです |
elseif (…) |
上の条件が偽だったときだけ、この条件を見る。真なら、そのすぐ下の行を実行します |
else |
上の条件がどれも偽だったときに実行する |
return ◯ |
◯ を返して、その関数はそこで終わり。以降の行は実行されません |
a > b |
左のほうが大きいとき成り立つ。等しいときは成り立ちません |
and |
左右がどちらも真のときだけ真。片方でも偽なら、全体が偽になります |
記号でつまずいたら、下の教科書から、先にそこだけ読んでください(G5 のような番号は、当サイトの擬似言語の教科書の第何回かを表します)。
elseif から下は、y と z の大きいほうを返すだけ
このプログラムには return が3つあります。return は、その値をこの関数の答えとして、呼んだ側へ渡し、そこで終わるという意味です。x を返す、y を返す、z を返す ── どれか1つだけを通って終わります。この記事では、この3つを出口と呼びます。
if ・ elseif ・ else は、上から順に条件を見て、最初に真になった1つだけを実行します。空欄は中身がまだ分からないので、そこからは追い始められません。先に、決まっているほう ── elseif から下だけを動かします。
決まっているほう ── elseif から下だけを動かす
空欄が偽で、下の elseif の行へ進んできた場合です。①②に x の箱が無いのは、この枝の式に x が出てこないから。琥珀の箱はその段でいちばん大きい数で、①②では返る値と一致しますが、③では一致しません。
① y > z が真のとき
y5
z2
5 > 2 なので真。すぐ下の return y へ入り、y の 5 が返ります。
② y > z が偽のとき
y2
z9
2 > 9 は偽。else へ落ちて return z、z の 9 が返ります。
③ x がいちばん大きくても
x9
y5
z2
y > z は 5 > 2 で真 → y の 5 が返ります。最大は x の 9 なのに、x はこの枝の式のどこにも出てきません。
返るのは、いつも y と z の大きいほう。③では、返った 5 が最大ではありません。
問題文に「異なる三つの整数」とあるので、どの2つを比べても「等しい」は起きません。だから y > z が偽なら、z のほうが大きいと決まります。
そして、elseif から下に x は1度も出てきません。③のように x がいちばん大きくても、ここは x を候補にすら入れず、y と z の大きいほうを返してしまいます。下へ落としてよいのは、x が最大でないときだけ。
コードの中で、空欄は「x を返すかどうか」を決める行
いま分かったことを、プログラムの各行に当てはめます。
○整数型: maximum(整数型: x, 整数型: y, 整数型: z)
この関数の名前は maximum。整数を3つ受け取り、整数を1つ返す。受け取った3つに x・y・z という名前が付く
if ( )
ここが空欄。この条件が真なら、すぐ下の return x へ入る
return x
1つ目の出口。x を返して、関数はここで終わり
elseif (y > z)
上の条件が偽だったときだけ、ここへ来る
return y
2つ目の出口。y のほうが z より大きかった場合
else
上の2つがどちらも偽だったとき
return z
3つ目の出口。残ったのは z
endif
枝分かれの終わり
※ 右側の注釈は当サイトで書き加えたものです。プログラム自体は原文のまま引用しています。
空欄が決めているもの
空欄は「大きいほうを求める式」ではありません。x を返す出口に入るか、下へ落とすかだけを決める行です。
空欄に入るものを決める
決めるのは、この2行です。
〔プログラム〕空欄の行と、その真下の出口
if ( )
return x
※ 上の〔プログラム〕からの抜粋です(1字も変えていません)。
空欄が満たすこと
真になったら x が返る。x が最大でないのに真になったら誤り
偽になったら y と z の大きいほうが返る。x が最大なのに偽になったら誤り
つまり、上の2つの誤りがどちらも起きないようにするなら ── 真になるのは x が最大のときだけで、x が最大なら必ず真。だから 空欄は「x が最大」と同じ意味の式でなければなりません。
あとは「x が最大」を、この3つの名前の比較で書くだけです。x の相手は y と z の2つなので、x > y かつ x > z。片方だけでは足りません ── 書かなかったほうが大きいときに、そのまま x を返してしまいます。この「かつ」を、擬似言語では and と書きます(左右がどちらも真のときだけ真)。
空欄に入るもの
if (x > y and x > z)
ここで初めて解答群を見る
x > y and x > z。解答群でこの式は イ ひとつだけです。
答え合わせ ── 入れて動かすと、3通りとも最大が返る
空欄に イ を入れて、x・y・z のどれが最大かで分けた3通りを、最後まで通します。
1行ずつ追う 正解の イ(x > y and x > z)
出典:令和6年度 科目B 公開問題 問1(空欄に イ を入れたもの)
ループ開始前
いま計算していること
変数の状態
return で返した値
トレース表(進めると1行ずつ積み上がります)
正解は イ
if (x > y and x > z)。x が最大のときだけ真になり、そうでなければ下へ落ちて、y と z の大きいほうが返ります。
ほかの5つは、どれも 9・5・2 の並べかえで外れます。x を y と z の両方と比べているのが、イ だけだからです。
ア(x > y)と エ(x > z)は比較が1つ足りません。ア は (5, 2, 9)、エ は (5, 9, 2) で 5 > 2 が真になり、最大が 9 なのに x の 5 を返します。ウ(x > y and y > z)と オ(x > z and z > y)は x と関係のない比較を混ぜていて、x が最大でも下へ落ちます ── ウ は (9, 2, 5)、オ は (9, 5, 2) で、どちらも 5 が返ります。カ(z > y)には x が1度も出てこないので、x を返す道がありません。
次に読む
この問題でどこに手間取ったかで、行き先が変わります。
elseif に来た時点で何が確定しているかが曖昧だった人へG8演算子 ── and の「どちらも真」がつかみきれなかった人へ一覧科目B 全44問の解説 ── 同じ形の問題を続けて解きたい人へこの記事で引用した資料
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。

