九九表の流れを ASCII 図で可視化 — 動きがわかる図解
では for のネスト(外側 i、内側 j) が九九表(1〜9 の掛け算表)をどのように動くか、「ポインタがどこを指してるか」 を段階的に見せます。
各フレームは「外側 i の値」「内側 j の値」「出力セル」を表します。動きを追うとループのイメージがつかみやすくなります。
ソースコード(おさらい)
for (int i = 1; i <= 9; i++) { // 外側ループ:段
for (int j = 1; j <= 9; j++) { // 内側ループ:掛ける数
System.out.print(i * j + "\t");
}
System.out.println();
}
Java全体イメージ(マトリクス)
行 = i(1〜9)、列 = j(1〜9)と見立てると、九九表はこうなります(抜粋):
j→ 1 2 3 4 5 6 7 8 9
i
1 1 2 3 4 5 6 7 8 9
2 2 4 6 8 10 12 14 16 18
3 3 6 9 12 15 18 21 24 27
...
9 9 18 27 36 45 54 63 72 81
フレーム式の動き(ポインタを ▶ で表示)
外側 i=1 のとき、内側 j が 1→9 まで動く。
そのあと外側が i=2 に進み、内側がまた 1→9 をなめるように進む――これがネストの基本動き。
フレーム 1:初期(i=1, j=1)
i=1 ▶ j=1: [▶1] 2 3 4 5 6 7 8 9
i=2 : 2 4 6 8 10 12 14 16 18
...
出力: 1
フレーム 2:i=1, j=2
i=1 ▶ j=2: 1 [▶2] 3 4 5 6 7 8 9
i=2 : 2 4 6 8 10 12 14 16 18
...
出力: 2
フレーム 3:i=1, j=3
i=1 ▶ j=3: 1 2 [▶3] 4 5 6 7 8 9
i=2 : 2 4 6 8 10 12 14 16 18
...
出力: 3
(この調子で j が 9 まで進む)
フレーム 9(内側終了):i=1, j=9
i=1 ▶ j=9: 1 2 3 4 5 6 7 8 [▶9]
i=2 : 2 4 6 8 10 12 14 16 18
...
出力: 9
内側ループ終了 → System.out.println() で改行 → 次フレームは i=2, j=1 に移る
フレーム 10:i=2, j=1(外側が増える)
i=1 : 1 2 3 4 5 6 7 8 9
i=2 ▶ j=1: [▶2] 4 6 8 10 12 14 16 18
i=3 : 3 6 9 12 15 18 21 24 27
...
出力: 2(2×1)
続きのイメージ
外側 i が 1→9 各値で、内側 j が 1→9 を全部回る。
視覚的に表すとこうなります(矢印はループの「スキャン方向」):
i=1: ▶→▶→▶→▶→▶→▶→▶ (j:1→9)
i=2: ▶→▶→▶→▶→▶→▶→▶
i=3: ▶→▶→▶→▶→▶→▶→▶
...
i=9: ▶→▶→▶→▶→▶→▶→▶
ステップ表(最初の 12 ステップを追う)
| ステップ | i | j | 出力 (i×j) | 備考 |
|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 外側開始、内側1回目 |
| 2 | 1 | 2 | 2 | 内側進行 |
| 3 | 1 | 3 | 3 | 〃 |
| … | 1 | 9 | 9 | 内側終了(改行) |
| 10 | 2 | 1 | 2 | 外側 i=2 開始、内側リセット |
| 11 | 2 | 2 | 4 | 〃 |
| 12 | 2 | 3 | 6 | 〃 |
視覚化(「指さし」アニメ風の短い流れ)
簡単な疑似アニメを4フレームで示す([ ] は現在処理中セル):
Frame A (i=1 start)
[1] 2 3 4 5 6 7 8 9
2 4 6 8 10...
Frame B (i=1, mid)
1 2 [3] 4 5 6 7 8 9
2 4 6 8 10...
Frame C (i=1 end)
1 2 3 4 5 6 7 8 [9]
2 4 6 8 10...
Frame D (i=2 start)
1 2 3 4 5 6 7 8 9
[2] 4 6 8 10...
これをループで繰り返すイメージです。
覚えておくべきポイント
- 外側
iが 1 回進むごとに、内側jは 最初から最後まで 回る(再スタートする)。 - 出力は行単位(i 固定)で並び、内側が終わるごとに改行される。
- ネストの深さが増えるほど「総ループ回数」は指数的に増える(ここでは 9×9 = 81 回の出力)。
練習(自分で確認してみる)
- 上のコードを実行して、実際にターミナルで出力を確認する。
System.out.printの代わりにSystem.out.println("i=" + i + " j=" + j + " -> " + (i*j));に変えて、ポインタの動きをログで見る。for (int i = 1; i <= 3; i++)とj <= 4に変えて、フレームを手で追ってみる(小さい表で動きがつかみやすい)。
