令和6年度 基本情報技術者試験 科目B 問1の解説|3つの数から最大値を返す if

基本情報技術者試験

令和6年度 科目B 公開問題 問1擬似言語・if の連鎖・and最終更新 2026-09-05

令和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(空欄に イ を入れたもの)


ループ開始前

いま計算していること

まだ計算していません

変数の状態

トレース表(進めると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 を返す道がありません。

次に読む

この問題でどこに手間取ったかで、行き先が変わります。

この記事で引用した資料

いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。

Copied title and URL