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) Data = 4, 2, 7
- (2) tmp = Data[0] → tmpに4を退避。Dataは[4, 2, 7]のまま
- (3) Data[0] = Data[2] → 先頭に7を上書き。Dataは[7, 2, 7]。tmpは4
- (4) Data[2] = tmp → 末尾に退避していた4を書き戻す。Dataは[7, 2, 4]
- (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ステップ — 退避せずに上書きすると元の値が消える。