ITパスポート 2010年 春期 問53
問題文
変数AとBに格納されているデータを入れ替えたい。データを一時的に格納するための変数をTMPとすると、データが正しく入れ替わる手順はどれか。ここで“”は、yのデータでxの内容を置き換えることを表す。

選択肢
ア:
イ:(正解)
ウ:
エ:
🔒 解説は解答すると表示されます
変数AとBの入れ替え(TMPを使う)【ITパスポート 解説】
正解の理由
選択肢のうち、イ(TMP ← A → A ← B → B ← TMP)は正しい手順です。ここで「変数」はデータを保存する箱、「一時変数(temporary variable)」はその中の一つで一時的に値を避難させる箱です。
手順の肝は「元のAの値を上書きする前にどこかに保存しておく」ことです。イでは最初に元のAの値をTMPに退避させ(TMP ← A)、次にBをAに入れ(A ← B)、最後に退避しておいた元のAをBに戻します(B ← TMP)。これでAとBが互いに入れ替わります。
手順の肝は「元のAの値を上書きする前にどこかに保存しておく」ことです。イでは最初に元のAの値をTMPに退避させ(TMP ← A)、次にBをAに入れ(A ← B)、最後に退避しておいた元のAをBに戻します(B ← TMP)。これでAとBが互いに入れ替わります。
具体例(分かりやすく数値で示す)
- 初めに A=1, B=2
- TMP ← A → TMP=1
- A ← B → A=2
- B ← TMP → B=1 結果:A=2, B=1(入れ替わり完了)
解法ステップ
- 「上書きで失われる値」を確認する。ここではAの元の値が失われる危険がある。
- 失われる前にその値を別の場所に退避(TMP ← A)する。
- もう片方の値を上書き先に移す(A ← B)。
- 退避しておいた値を残りの変数に戻す(B ← TMP)。
- シンプルに、手順を符号化してシミュレーション(数値や を使う)して確認する。
記号的に見ると、(元のA)と (元のB)を使えば:
- TMP =
- A =
- B = TMP =
→ 最終的に A = , B = (入れ替わり成立)
選択肢別の誤答解説
-
ア(TMP ← A、A ← B、B ← A)
最後の操作で「B ← A」を行うと、Aは既にBの値に上書きされているため、Bもその同じ値(元のB)になってしまいます。結果的に両方とも元のBになり、元のAが失われます。 -
ウ(TMP ← B、A ← B、B ← TMP)
TMPにBを退避してからA ← Bを行うと、AとBはどちらも元のBの値になります。TMPにBを使っても元のAを保存していないため、元のAは失われます。 -
エ(TMP ← B、A ← B、B ← A)
TMPにBを保存しているが、最後に「B ← A」を行うとAは既にBに上書きされています。結果としてやはり両方とも同じ値(元のB)になり、元のAは失われます。
いずれも共通する誤りは「上書きされる前に元のAの値を保存していない」ことです。
よくある誤解
-
「A ← B の後に B ← A をすれば入れ替わる」
→ 間違い。Aを先に上書きすると元のAは消えるので、B ← A はもはや元のAを取り戻せません。必ず先にどちらかを退避する必要があります。 -
矢印(←)の意味を取り違える
→ 「x ← y」は「x に y の内容を入れる(x を y で置き換える)」という意味です。左辺が書き換えられます。 -
一時変数は不要だと考える
→ 高級言語には組み込みで簡単に入れ替えられる構文(例:Pythonの A, B = B, A)がありますが、処理の本質は一時的にどちらかの値を確保することです。低級操作では一時変数が必要です。
補足コラム
- 穴埋めの例え:AとBを入れ替えるのは「コップの水を移す」ようなものです。Aの水をBに注ぐ前に、Aの水を一時的なコップ(TMP)に移しておかないと、Aの中身を失います。
- プログラミングでの簡易例(Python):
A = 1
B = 2
# 一時変数を使う方法
TMP = A
A = B
B = TMP
# Pythonならこの一行でOK
A, B = B, A
- 一時変数を使わない数学的手法(参考):
- 加減法: A = A + B; B = A - B; A = A - B (数値でかつオーバーフローに注意)
- XORスワップ(ビット演算): A = A ^ B; B = A ^ B; A = A ^ B (数字のビット操作) ただしこれらは制約や安全面の問題(型やオーバーフロー、可読性)があります。試験では「一時変数を使う安全確実な方法」を理解しておくことが重要です。
FAQ
Q: TMPは必ず必要ですか?
A: 低レベルの逐次代入で安全に値を保つには通常必要です。高級言語では言語の機能で省略できますが、概念的には「どこかに値を保存する」ことが行われています。
A: 低レベルの逐次代入で安全に値を保つには通常必要です。高級言語では言語の機能で省略できますが、概念的には「どこかに値を保存する」ことが行われています。
Q: AとBが同じ場所(同一変数)だったら?
A: 同一変数同士の入れ替えは意味がない(結果は変わりません)。参照やポインタ的な話になると別の注意が必要です。
A: 同一変数同士の入れ替えは意味がない(結果は変わりません)。参照やポインタ的な話になると別の注意が必要です。
Q: 矢印の向きが逆の問題が出たら?
A: まず「左辺が書き換えられる」ことを確認してください。x ← y は x に y を入れる操作です。方向を取り違えると論理が逆になります。
A: まず「左辺が書き換えられる」ことを確認してください。x ← y は x に y を入れる操作です。方向を取り違えると論理が逆になります。
関連キーワード: 変数, 一時変数, 代入, スワップ, 入れ替え, 退避, フローチャート, 代入の順序, アルゴリズム, XORスワップ

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

