CO-P26情報Ⅰ 対策問題

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

次のプログラムは、配列 Data の全要素の合計を求めるつもりだが、(4)に誤りがある。正しい修正はどれか。 【関数の説明】 要素数(A) … 配列Aの要素の個数を返す (1) Data = [10, 20, 30] (2) goukei = 0 (3) i を 0 から 要素数(Data) - 1 まで 1 ずつ増やしながら繰り返す: (4) ⎿ goukei = Data[i] (5) 表示する(goukei) (意図: 合計60を表示したい。実際は30が表示される)

解答・解説を見る

正解: 1

正答

1

この問題のポイント

累積のバグ修正(代入と累積の違い) を問う問題です。

解説

まず「なぜ30が表示されるのか」を、誤ったプログラムのままトレースして突き止めます。
i=0のとき: goukei = Data[0] = 10。
i=1のとき: goukei = Data[1] = 20(10は上書きされて消える)。
i=2のとき: goukei = Data[2] = 30(20も消える)。
表示は30。つまり「goukei = Data[i]」は毎回上書きするだけで、過去の値を捨ててしまうのが原因です。症状「最後の要素だけが残る」は、上書きバグの典型的なサインです。

合計を出すには、「今までの合計」に「今回の値」を積み上げる形、すなわち goukei = goukei + Data[i] に直します。修正後をトレースすると、
i=0のとき: goukei = 0+10 = 10。
i=1のとき: goukei = 10+20 = 30。
i=2のとき: goukei = 30+30 = 60。
意図どおり60が表示されます。

「goukei = Datai」と「goukei = goukei + Datai」——右辺に自分自身を含むかどうかだけの違いで、動きは全く別物になります。この対比は合計・回数・文字列連結などあらゆる積み上げ処理に共通です。

共通テストでは「意図した結果と実際の結果が違う。どこをどう直すか」というデバッグ形式が出題されます。解く手順は、①誤ったまま数周トレースして症状を再現する、②原因を言葉にする(ここでは「上書きで過去が消える」)、③原因を解消する修正を選ぶ——の3段階です。

選択肢の確認

1.○ 右辺に goukei 自身を含む累積の正しい形。合計60になる。
2.× +1しても上書きのまま。31が表示されるだけ。
3.× Data[goukei] は意味のない参照で、範囲外にもなり得る。
4.× 答えの60を直書きするのは、データが変わると壊れるので修正ではない。

ここだけは覚えよう

合計は「goukei = goukei + 値」— 右辺に自分自身を含むのが累積 — 最後の値しか残らないなら上書きバグを疑う。

関連問題

CO-P25CO-P27