CO-S17情報Ⅰ 対策問題

コンピュータとプログラミング思考・計算

次のプログラムの実行後、配列 Data の内容はどれか。 (1) Data = [4, 2, 7] (2) tmp = Data[0] (3) Data[0] = Data[2] (4) Data[2] = tmp (5) 表示する(Data)

解答・解説を見る

正解: 1

正答

1

この問題のポイント

一時変数を使った値の交換(スワップ) を問う問題です。「退避→上書き→書き戻し」の3ステップを追えるかがカギです。

解説

2つの変数の値を入れ替えたいとき、いきなり Data[0] = Data[2] とすると、Data[0]に入っていた元の値(4)が上書きされて失われてしまいます。そこで、一時変数tmpに値をいったん退避させてから入れ替えるのが定番の手順です。

1行ずつトレースします。

  1. (1) Data = 4, 2, 7
  2. (2) tmp = Data[0] → tmpに4を退避。Dataは[4, 2, 7]のまま
  3. (3) Data[0] = Data[2] → 先頭に7を上書き。Dataは[7, 2, 7]。tmpは4
  4. (4) Data[2] = tmp → 末尾に退避していた4を書き戻す。Dataは[7, 2, 4]
  5. (5) 表示: [7, 2, 4]

途中の(3)の時点で一瞬 [7, 2, 7] と「7が2つ」になるのがポイントです。tmpに4を逃がしてあるからこそ、(4)で元の値を復元できます。「tmp = a、a = b、b = tmp」の3ステップは値交換の定番イディオムとして丸ごと覚えましょう。

この交換(スワップ)は、バブルソートなど「隣どうしを比較して交換する」整列アルゴリズムの基本部品です。共通テストでは、3行の順序を並べ替えさせたり、途中状態の配列を問う形で出題されるので、1行ごとの配列の中身を書き出して追うのが確実です。

選択肢の確認

1.○ 先頭の4と末尾の7が交換され [7, 2, 4] になる。
2.× [4, 2, 7]は交換前のまま。代入を追っていない。
3.× [2, 4, 7]は昇順に整列した並びで、このプログラムの動作ではない。
4.× [7, 4, 2]は全体を逆順にした並びで、交換されたのは先頭と末尾だけ。

ここだけは覚えよう

交換は「tmp=a、a=b、b=tmp」の3ステップ — 退避せずに上書きすると元の値が消える。

関連問題

CO-S16CO-S18