CO-P18情報Ⅰ 対策問題

コンピュータとプログラミングプログラミング特訓 (第3問対策)

次のプログラムは、5人の得点のうち最高点をとった人の「番号」(添字)を求める。空欄【ア】に入るものはどれか。 (1) Ten = [64, 88, 71, 88, 52] (2) saikou_i = 0 (3) i を 1 から 4 まで 1 ずつ増やしながら繰り返す: (4) | もし Ten[i] > Ten[saikou_i] ならば: (5) ⎿ ⎿ saikou_i = i (6) 表示する(【ア】) (最高点の「番号」と「点数」を両方表示したい: 1 88)

解答・解説を見る

正解: 1

正答

1

この問題のポイント

「位置」を求めてから「値」を引く — 最大値問題の発展形です。

解説

このプログラムは、最高点の「点数そのもの」ではなく「何番目の人か(添字)」を saikou_i に記録していきます。位置さえ分かれば、点数は Ten[saikou_i] でいつでも取り出せる——これが「位置を求めてから値を引く」型です。

saikou_i の変化を1ステップずつトレースします(初期値0)。
i=1のとき: Ten[1]=88 > Ten[0]=64 → 真 → saikou_i=1。
i=2のとき: Ten[2]=71 > Ten[1]=88 → 偽 → saikou_i=1のまま。
i=3のとき: Ten[3]=88 > Ten[1]=88 → 偽(88>88は成り立たない) → saikou_i=1のまま。
i=4のとき: Ten[4]=52 > 88 → 偽。
よって saikou_i=1、点数は Ten[saikou_i]=Ten[1]=88。「1 88」の順で表示するには saikou_i, Ten[saikou_i] です。

注目すべきは i=3 の周です。88は添字3にもありますが、条件が「>」(より大きい)なので同点では更新されず、先に見つけた方(添字1)が保持されます。もし条件を「>=」にすると同点でも更新され、後の方(添字3)が答えになる——等号の有無で結果が変わるのは、本試験でも狙われる細部です。

もう1つの罠は選択肢3・4の「i」です。ループが終わった後の i は最後の値(4)のままなので、Ten[i] は52になってしまいます。ループ変数はループの外では「最後の値」でしかない、と覚えておきましょう。

選択肢の確認

1.○ 位置 saikou_i=1 と、その位置の値 Ten[1]=88。
2.× 中身は同じだが表示順が逆で「88 1」になる。
3.× ループ後の i は4のまま。「4 52」と表示されてしまう。
4.× Ten[i]=Ten[4]=52 になり、点数が誤り。

ここだけは覚えよう

最大値問題は「位置を記録→値は配列引き」 — 条件の「>」と「>=」の違い(同点で先か後か)にも注意。

関連問題

CO-P17CO-P19