本文へスキップ

平成22年度 春期 ITパスポート試験 問53

この問題の解説と、これまでの解答の記録です。

問53
頻出度★★☆

変数AとBに格納されているデータを入れ替えたい。データを一時的に格納するための変数をTMPとすると, データが正しく入れ替わる手順はどれか。ここで“x←y”は, yのデータでxの内容を置き換えることを表す。

出典 平成22年度 春期 ITパスポート試験 問53
解説

問 53

  • 不正解ア

    TMP←A → A←B → B←A。①②までは イ と同じで A=b, B=b, TMP=a となるが、③が B←TMP ではなく B←A になっている。この時点の A は②で既に b に上書きされているため、B←A は B に b を代入するだけで B は b のまま変わらない。最終状態は A=b, B=b で、せっかく TMP に退避した a を一度も使わずに終わっており、A の元の値が失われる。「退避したものを書き戻す」最後の一手が抜けた典型的な誤りである。

  • イ

    正解 変数の入れ替えは「先に上書きされる側の値を退避してから書き戻す」のが鉄則で、イ はその順序を正しく守っている。A の元の値を a、B の元の値を b とすると、① TMP←A で TMP に a が退避される (この時点で A=a, B=b, TMP=a)、② A←B で A が b に置き換わる (A=b, B=b, TMP=a — A の元の値 a は上書きされたが TMP に残っている)、③ B←TMP で B に退避しておいた a が戻る (A=b, B=a)。結果として A には元の B の値、B には元の A の値が入り、入れ替えが成立する。ポイントは、②で失われる A の値を①で先に TMP へ逃がし、③でその TMP を使って書き戻している点である。

  • 不正解ウ

    TMP←B → A←B → B←TMP。①で退避するのが A ではなく B になっている点が誤り。① TMP←B で TMP=b、② A←B で A=b となり、ここで A の元の値 a が退避されないまま上書きされて完全に消滅する。③ B←TMP は B に b を戻すだけなので、最終状態は A=b, B=b。退避する変数と次に上書きされる変数が食い違っているため、入れ替えではなく「B の値の複製」になってしまう。

  • 不正解エ

    TMP←B → A←B → B←A。ウ と同じく退避しているのが B の値であり、しかも③でも TMP を使っていない。① TMP←B で TMP=b、② A←B で A=b となり a は消える、③ B←A はこの時点の A(=b) を B に代入するだけなので B=b のまま。最終状態は A=b, B=b で、TMP は最初に代入されただけで一度も参照されていない。退避先の誤りと書き戻しの欠落という二つの誤りが重なった選択肢である。

ここがポイント
  • 二つの変数の値を入れ替えるには、代入 (x←y は y の値で x を上書きし、x の元の値は失われる) の破壊性を意識し、一時変数 TMP に「これから上書きされる側」の値を先に退避してから、最後にその TMP を相手側へ書き戻す、という 3 手順 (TMP←A → A←B → B←TMP) が必要である。
  • 退避する変数と最初に上書きされる変数は必ず同じでなければならず (A を上書きするなら退避も A)、かつ退避した TMP を最後に必ず参照しなければならない。この二条件のどちらかが欠けると両方の変数が同じ値になり片方のデータが失われる — 誤答肢はすべてこのどちらかに違反している。
用語

解答の記録