トラック3・🔍人間がコンピュータになる訓練

ループをトレースする

読む目安 約14分・ゴール:繰り返しの1周ごとに条件判定・本体・更新を追い、ループ終了後の値まで正しく求められる

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

トレースの本番はここです。繰り返しが入るとトレース表は一気に縦へ伸びますが、やることは今までと1ミリも変わりません。1行ずつ書くだけです。

1周は3つの部分でできている

繰り返しは、次の3つが順番に回っています。

  1. 条件判定 — 続けるか、抜けるか
  2. 本体 — 中身の処理
  3. 更新 — 次の周に向けて値を変える
int i = 1;
int sum = 0;
while (i <= 3) {
    sum = sum + i;
    i = i + 1;
}

このプログラムを、下のビジュアライザで1ステップずつ追ってみてください。条件判定に戻るたび、i が増えているのが見えます。

🧪 メモリの図解:この図はアプリ内で1行ずつ動かせます。アプリでこのトピックを開く

周回番号の列を足すと迷わない

ループのトレース表には、「何周目か」の列を足すと見通しが良くなります。

周 | 行 | i | sum | 条件
---+----+---+-----+------
 1 |  3 | 1 |  0  | 真
 1 |  4 | 1 |  1  |
 1 |  5 | 2 |  1  |
 2 |  3 | 2 |  1  | 真
 2 |  4 | 2 |  3  |

同じ行番号が何度も出てくるのがループの特徴です。周の列があると、どこを見ているか見失いません。

ビット同じ行が何回も出てくるけど、値は毎回ちがう。そこが面白いところだよ。

最重要: 抜けた瞬間の値

トレース問題でいちばん狙われるのが、ループを抜けたあとの変数の値です。上の例では、i が4になったところで 4 <= 3 が偽になり、ループを抜けます。

つまり終了後の i は3ではなく4です。「3回まわったから3」と答えてしまう人が非常に多い箇所です。条件を偽にした値まで進んでいるからこそ、ループが終わったのだと考えてください。

繰り返しの回数を数え間違える罠

1つずれる間違いは、プログラミングで最も多いバグの一つで、英語圏では「オフ・バイ・ワン誤り」という専用の名前まで付いています。迷ったら数えず、トレース表を3行だけ書く。それが最短の解決法です。

全部書かなくてよい

100周するループを100行書く必要はありません。実務でも次のようにします。

  1. 最初の2〜3周をきちんと書く(始まり方を確かめる)
  2. 途中は「同じことが続く」と判断して飛ばす
  3. 最後の1〜2周と、抜けた直後を必ず書く(終わり方を確かめる)

バグは、たいてい始まりと終わりに潜んでいます。真ん中の繰り返しは、最初の数周が正しければ同じ形が続くだけです。この省略ができるようになると、トレースは驚くほど速くなります。

終わらないループの見つけ方

表を書いていて、何周しても条件の値が変わらないことに気づいたら、それは無限ループです。原因はほぼ決まっていて、更新(i = i + 1)を書き忘れたか、更新の向きが条件と逆かのどちらかです。実行する前に、紙の上で発見できます。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

whileループのトレースです。空欄を埋めましょう(条件の欄は「真」または「偽」)。

int i = 1;
int sum = 0;
while (i <= 3) {
    sum = sum + i;
    i = i + 1;
}
周行isum条件
1310真
1411
1521
2321真
242?
2533
3333?
3436
35?6
4346?
答えを見る

空欄の答え(上から順に):3、真、4、偽

2周目の4行目は sum = 1 + 2 で3になります。3周目の判定は 3 <= 3 で、等号を含むので真です(ここを偽と答える人が多い箇所です)。3周目の5行目で i は4になり、4周目の判定 4 <= 3 が偽になってループを抜けます。つまり抜けた時点の i は3ではなく4。合計は 1+2+3 = 6 です。

確認問題 2

5から1ずつ減らしながら掛け算を繰り返すプログラムです。1周ごとの状態をトレースして、空欄を埋めましょう。

int n = 5;
int kai = 1;
while (n > 1) {
    kai = kai * n;
    n = n - 1;
}
周判定前のn条件周の終わりのkai周の終わりのn
15真54
24真203
33真?2
42真120?
51?1201
答えを見る

空欄の答え(上から順に):60、1、偽

3周目は kai = 20 * 3 で60、4周目は kai = 60 * 2 で120、そして n は1になります。5周目の判定 1 > 1 は偽(等しいだけでは大きくない)なので、ここでループを抜けます。結果は 5×4×3×2 = 120。ループを抜けたあとの n が1で止まっていることも確認してください。条件を n > 0 にしていたら、最後に1を掛ける1周が余分に増えます。

「人間がコンピュータになる訓練」の目次

  1. トレース表とは——実行を目で見る道具
  2. 代入をトレースする
  3. 分岐をトレースする
  4. ループをトレースする
  5. バグを見つける思考法——仮説と検証
  6. ラバーダック・デバッグ
  7. エラーメッセージは敵ではない
  8. 総仕上げ——紙上プログラム実行

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版