制御構造 (if/while/for) の擬似言語トレース

変数表を使ったトレース技法を学びます。

擬似言語の制御構造をトレースする実践的な方法。変数の値を1ステップずつ追いかけます。

日野 こむぎ(しょんぼり) 日野 こむぎ

コード読んでも、何が起こってるのかピンとこないんだよね…

藤森 さやか 先生(笑顔) 藤森 さやか 先生

それはトレースの練習が足りないからなのよ。
トレースは、紙の上で変数の値を1行ずつ追いかけていく技法ね。

青木 澪(普段) 青木 澪

例題を見てみましょう。
次のコードでループ終了時の sum の値を求めてみて。

○ 手続: calc()
  整数型: i, sum
  sum ← 0
  for (i を 1 から 5 まで 1 ずつ増やす)
    if (i mod 2 = 0)
      sum ← sum + i
    endif
  endfor
  return sum
桃井 すみれ(普段) 桃井 すみれ

うぅ〜ん、すみれは紙に書いて追ってみますぅ

青木 澪(普段) 青木 澪

それが正解よ。
紙に変数の表を作って追っていくの。
i = 1, 2, 3, 4, 5 と進む中で、偶数 (mod 2 = 0) のときだけ sum に加算するから…

藤森 さやか 先生(笑顔) 藤森 さやか 先生

i = 2 の時 sum = 0 + 2 = 2、i = 4 の時 sum = 2 + 4 = 6。
最終的に sum は 6 を返すの。

日野 こむぎ(笑い) 日野 こむぎ

なるほど!
あたしも変数表を書きながら追っていけば、複雑な処理もわかりそうじゃん!

青木 澪(普段) 青木 澪

コツは「i と sum の両方を表で管理する」こと。
条件分岐の判定もメモしながら進めると、間違いにくいですよ。

変数表で5回のループを完全に追う

頭の中だけで追わず、条件判定の前後を表にします。mod は剰余なので、i mod 2 = 0 は「iを2で割った余りが0」、つまり偶数という意味です。

ii mod 2条件処理前sum処理後sum
11偽00
20真02
31偽22
40真26
51偽66

偽の回でも行を省かず、sumが「変化しない」と記録するのがポイントです。選択肢の9は奇数の1+3+5を足した読み違い、15は条件を無視して全てを足した読み違いです。答えだけでなく、どの誤読ならその値になるか逆算すると見直しが速くなります。

境界・更新順・出力を分けて読む

科目Bのトレースでは、まず初期値、次に反復範囲、条件、更新、戻り値の順に印を付けます。この例の「1から5まで」は1と5を含むので5回実行されます。sum ← sum + i は条件が真のときだけ実行され、return sum はループ終了後に一度だけ実行されます。

特に注意したいのが、更新前の値と更新後の値の混同です。代入文の右辺を古い値で計算してから、左辺を新しい値へ置き換えます。たとえばsumが2、iが4なら、右辺の2+4を先に計算し、その結果6をsumへ代入します。表の一つのセル内で暗算せず、「前→後」を分ければ取り違えを防げます。

while文では、条件判定の位置も確認します。whileは本体より先に判定するため、最初から条件が偽なら0回です。一方、問題文に後判定型の反復が示されていれば最低1回は本体が動きます。for・whileという名前だけで回数を決めず、開始値・終了条件・増分を具体的な数に置き換えてから表を作りましょう。

確認クイズ

上記の calc() 手続の戻り値はいくつか。

  1. 6
  2. 9
  3. 10
  4. 15
こたえを見る

正解: 1. 6

i = 1 (奇数・スキップ), i = 2 (偶数・sum=2), i = 3 (スキップ), i = 4 (偶数・sum=6), i = 5 (スキップ)。最終的な sum は 6 です。

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。