
武蔵野個別指導塾の特徴
共通テスト情報I 変数と代入—更新の前後を表にして最後の値を追いかける|武蔵野個別指導塾

右辺を先に計算し、一時変数を使う入替えまで、変数の更新前後を表に残して代入の順序を追います。
よくあるのは、高校生が代入を数学の等式として読み、処理の前後で同じ関係がずっと成り立つと考える場面です。たとえば、箱に入れた数を増やす命令は、矛盾した式ではありません。実行前の数を使って新しい数を作り、箱の中身を置き換える操作です。順番を記録すると、最後の値を根拠とともに説明できます。
何を答える問題か
変数は値を記憶する場所に付けた名前です。処理を読み取る問題では、命令を実行するたびに、その場所の値がどう変わるかを尋ねられます。次のような出方を区別すると、表に何を書けばよいかが見えてきます。
1つ目は、初期値と数行の代入から最後の値を求める型です。変わった変数だけでなく、変わらなかった変数も同じ行に残します。2つ目は、2つの値を入れ替える処理で、一時的に保存する場所の役割を問う型です。3つ目は、処理の順番を変えたときに結果が同じかを比べる型です。順番が違う2本の処理には別々の表を作り、同じ時点の値を照合します。
以下の処理は学習用の自作記法です。矢印の右側を計算し、その結果を左側の変数に入れます。各行は上から順に1回ずつ実行し、出力は指定された位置で行います。数は整数で、加算と減算は通常の計算です。反復、配列、整数除算、剰余は使いません。試験で別の表記が示されたときは、その問題の定義を優先します。
値を読む時点と書き換える場所
図1のように、代入は右辺の読み取りと左辺の更新に分けます。右辺に複数の変数があれば、その行を実行する直前の値をそれぞれ使います。右辺の計算が終わってから、左辺の場所に結果を入れます。左辺以外の変数は、この行では変化しません。

たとえば、a が 4、b が 7 のとき、a ← a + b を実行します。右辺は古い a の 4 と b の 7 から 11 です。その後 a が 11 になり、b は 7 のままです。式の中の a を先に 11 に変えてから足すわけではありません。また、実行後に a と a + b が等しいという約束でもありません。記号は計算の指示であり、両辺の関係を保ち続ける等号ではないからです。
表の列は変数ごとに作り、行は初期状態と命令ごとの実行後に分けます。ある変数にまだ値が入っていないときは「未設定」と書き、0 と区別します。未設定の変数を右辺で読む処理は、この記法では結果を定めていません。値を想像して続きを計算せず、必要な初期値が与えられているか確認します。
入替えでは、上書きで消える値を一時変数に保存します。一時変数は特別な種類の値ではなく、後から使う値を保持する普通の変数です。a ← b の後は元の a を a から取り出せません。元の a が必要なら、その前に別の場所へコピーしておきます。コピー後に元の場所が変わっても、保存した値は自動では変わりません。
基本例題:2つの札を入れ替える
2枚の札の番号を変数 a、b に記録します。最初に a は 3、b は 8 です。次の処理の各行の後の値と、最後に出力される a、b を順に整数で答えてください。t は最初は未設定ですが、読む前に値が入ります。
t ← a
a ← b
b ← t
a と b をこの順に出力
図2のように、初期状態から1行ずつ進みます。表の「未設定」は数ではなく、まだ値を入れていないことを表します。

| 時点 | a | b | t |
|---|---|---|---|
| 初期 | 3 | 8 | 未設定 |
| t ← a の後 | 3 | 8 | 3 |
| a ← b の後 | 8 | 8 | 3 |
| b ← t の後 | 8 | 3 | 3 |
最初の行では a の 3 を読み、t にコピーします。a 自体は消えず、b も変わりません。次の行では b の 8 を読み、a に入れます。このとき a の元の 3 は上書きされますが、t に保存されています。最後に t の 3 を b に入れるため、出力は 8、3 です。
元の札の番号に戻して確かめると、最初の b の 8 が最後の a にあり、最初の a の 3 が最後の b にあります。どちらも相手側へ移ったので、入替えという目的に合います。途中で a と b が両方 8 になる行があっても、t に 3 が残っている点が重要です。出力後に t を使う指示はないので、答えに t を含めません。
値が同じ場合も、この処理自体は実行できます。たとえば両方が 12 なら、各場所の値は最後まで 12 です。見た目の変化がなくても、コピーと上書きは指示どおりに行われています。一方、初期の a が未設定なら最初の右辺を評価できず、上の表の答えをそのまま使えません。問題が定めていない入力の出力を作らないことも読み取りの一部です。
少し難しい例題:保存した後も値を変える
初めに x は 2、y は 6 です。次の各行を上から1回ずつ実行し、最後の x、y、t を順に整数で答えてください。右辺は各行の直前の値で評価し、t は最初は未設定です。
t ← x + y
x ← t - x
y ← x + t
t ← y - t
x、y、t をこの順に出力
| 時点 | x | y | t | その行の右辺 |
|---|---|---|---|---|
| 初期 | 2 | 6 | 未設定 | なし |
| 1行目の後 | 2 | 6 | 8 | 2 + 6 |
| 2行目の後 | 6 | 6 | 8 | 8 − 2 |
| 3行目の後 | 6 | 14 | 8 | 6 + 8 |
| 4行目の後 | 6 | 14 | 6 | 14 − 8 |
答えは 6、14、6 です。2行目では t の 8 から、その行の前の x の 2 を引き、x を 6 にします。3行目の x はもう 2 ではなく 6 です。4行目の右辺にある t は、4行目の前の 8 を指します。右辺を 14 − 8 と評価してから、t を 6 に書き換えます。
初期の x と y に答えを戻して確認すると、t はまず 2 + 6 の 8、次の x は 8 − 2 の 6、次の y は 6 + 8 の 14、最後の t は 14 − 8 の 6 です。どの行でも、その行の前に保持している値だけを使っています。最後に残った t を使って4行目をもう一度計算すると、別の実行を追加したことになってしまいます。
同じ処理で x が 0、y が 0 の場合は、4回の代入後も 0、0、0 です。負の数もこの記法では整数として扱うため、x が -2、y が 1 なら途中の t は -1、続く x は 1、y は 0、最後の t は 1 です。0 や負数を特別な終了の合図と決めていないので、指定された行を最後まで実行します。
間違いを表に戻して直す
基本例題の札を、一時変数を使わず次のように入れ替えたつもりになる誤答を考えます。初期値は同じく a が 3、b が 8 です。
a ← b
b ← a
a と b をこの順に出力
「8、3」と答えると、2行目の a を初期値の 3 のまま読んだことになります。実際には図3のように、1行目で a が 8 に変わっています。2行目はその時点の a を読むため、b も 8 になり、出力は 8、8 です。初期の a の 3 はどこにも保存されていません。

原因は、変数名を最初の値の別名として固定してしまったことです。修正するときは、最初に t ← a を置き、a ← b の後に b ← t を実行します。これで 3 を保存してから a を上書きでき、最後に 8、3 となります。図3の誤答と修正は、同じ初期値から別々に始めています。
別の間違いとして、t ← a を書いた後、t も a と連動して変わると考えることがあります。しかし代入はその時点の値のコピーです。a を 8 にしても t は 3 のままです。表の t の列を残せば、保存先の変化がないことを確認できます。
自分で追う4問
いずれも各行を上から1回ずつ実行し、右辺は直前の値で評価します。出力は示した最後の位置です。整数の加算と減算を使い、反復、配列、整数除算、剰余は使いません。各変数の初期値は問題に示したものとし、未設定の t は右辺で読む前に代入します。
問1
p は 9、q は 2 です。最後に出力される p、q を順に整数で答えてください。
p ← p - q
q ← p + q
p と q を出力
問2
m は 4、n は 11、t は未設定です。各代入の後の m、n、t と、最後の m、n を順に答えてください。
t ← n
n ← m
m ← t
m と n を出力
問3
r は 5、s は 5 です。次の処理の最後の r、s を順に整数で答えてください。値が同じ場合でも各行を実行します。
r ← s
s ← r
r と s を出力
問4
u は -3、v は 0 です。最後の u、v を順に整数で答えてください。0 も負の整数も、通常の数として計算します。
v ← u - v
u ← v + u
u と v を出力
答えと途中の値
問1の答え
7、9 です。最初に p は 9 − 2 の 7 となり、q は 2 のままです。次に q は更新後の p の 7 と、更新前の q の 2 を足した 9 になります。元の初期値から2行を戻ってたどると、出力時の組は確かに 7、9 です。初期の p を2行目で使って 11 とするのは、1行目の更新を飛ばした読み方です。
問2の答え
初期状態は 4、11、未設定です。各行の後の m、n、t は順に 4、11、11、次に 4、4、11、最後に 11、4、11 です。出力は 11、4 です。元の n の 11 を t に保存し、n に元の m の 4 を入れ、最後に保存した 11 を m に入れます。元の値を相手の場所に戻して照合すると、2つの値は入れ替わっています。
最初に t ← m とすると、続く行を変えない場合は 4 を保存し、最後は m、n ともに 4 です。保存すべきものは、先に上書きされる n の元の値だとわかります。未設定の t を最初に読むような別の処理は、ここでは出力を定めていません。
問3の答え
5、5 です。1行目の後も r、s は 5、5 で、2行目でも同じ値をコピーします。元の値が等しいので、結果の組は入替え後の組と一致します。ただし、この結果だけでは異なる値でも入れ替えられると判断できません。たとえば片方が異なる入力では、先に上書きされた値が失われるからです。
問4の答え
-6、-3 です。1行目で v は -3 − 0 の -3 になり、u は -3 のままです。2行目の右辺は、新しい v と古い u を使うので -3 + -3 の -6 です。元の入力に戻して各行を再実行すると、最後の u は -6、v は -3 です。0 を未設定と見なしたり、負数で処理を止めたりする条件はありません。
順番の違いを比べるときの手順
同じ命令を並べ替えた2つの処理を比べる際は、最終値だけを暗算で比べず、初期状態をそれぞれの表に書きます。たとえば c が 1、d が 4 のとき、先に c ← d、次に d ← d + 1 と実行すれば、途中は 4、4、最後は 4、5 です。逆順なら、先に d が 5 になり、次にその 5 を c にコピーするため、最後は 5、5 です。代入する先が異なっていても、後の行が参照する値を前の行が変更するなら、順番によって結果が変わります。
それぞれの表の初期行を同じ 1、4 に戻し、各行の右辺を計算すると、違いは c ← d を実行する時点の d にあります。前者では 4、後者では 5 です。並べ替えてよいかを判断するには、命令が読む場所と書き換える場所の両方を調べます。片方の命令が書き換えた場所をもう片方が読む場合には、少なくともその影響を追う必要があります。
また、同じ入力で結果が一致しても、別の入力で一致するとは限りません。等しい値と異なる値の両方を使うと、上書きの影響を見分けやすくなります。
また、追跡表に書いた数が答えの形式に合うかも確かめます。値の組を指定された順序で答える問題なら、列を逆に並べるだけで別の答えになります。途中状態を尋ねられた場合には、最後まで進めた値ではなく、指定された行の直後を選びます。表の行名に「前」と「後」を明記すれば、出力位置を取り違えにくくなります。答えの順番も最後に再確認します。
手元に残す要点
右辺はその行の実行前の値で計算します。 左辺だけを更新し、他の変数はそのまま表に残します。 上書きする前に必要な値を一時変数へ保存します。 出力する時点と順番まで追って答えます。
どこで追跡がずれたか
答えが合わないときは、最後の行から推測せず、表で初めて値が食い違った行へ戻ります。その行の直前の値、右辺の計算結果、左辺への書き込みを順に口に出して確認します。個別指導で確かめる際も、未設定と 0 の区別、一時変数に残る値、出力直前の列を順番に見ます。代入の1行を境に前後を分ければ、値の移り方を説明できます。
もう「日東駒専」を目標にしないでください。
武蔵境駅徒歩30秒、講師1人に生徒1人の完全1対1。授業のあいだ、先生は隣を離れません。いまの詰まりを、無料相談でそのまま話してください。
まず15分だけ電話で話したい方は、無料電話相談(15分)から。塾からお電話を差し上げます。
本気になった日が、入塾の日。
お子様の教育、迷ったら「丸投げ」してください。必ず、期待以上の結果で返します。武蔵野で育む、武蔵境で学ぶ。
電話は年中無休。365日、24時間、お電話可能。



