概要
ループは 入れ子 にできる。for の中にもう 1 つ for を書くと、外側が 1 回回るたびに内側のループが最初から最後まで全部回る、という二重構造になる。これは「表のような 2 次元データ」を扱うときに必須のテクニックで、九九表 (9 行 × 9 列)、星のピラミッド (行ごとに違う数の *)、行列演算、画像のピクセル走査など、現実のプログラミングで出てくる場面は数えきれない。
文法的には外側のループのカウンタを $i、内側を $j にする慣習がある。これは「i と j で区別がつきやすい」「両方とも $i だと内側が外側のカウンタを破壊して バグになる」という実害から来ている。3 重ループになれば $k、それ以上は名前を意味のあるもの ($row / $col / $layer 等) に切り替える、と段階的にスケールしていく。
入れ子で必ず意識すべきが 計算量 だ。外側が N 回・内側が M 回回るループは、本体が合計 N × M 回 実行される。N = M = 1000 なら 100 万回、10000 なら 1 億回。N が増えるほど一気に重くなるので、「これは本当に N × M 必要か」「片方は N 回で済まないか」を常に問う癖が、後の配列・アルゴリズムの章で効いてくる。入れ子ループは強力だが、雑に書くと簡単に重いコードになるという両刃の剣だと覚えておくと良い。
学習目標
- ループの中にループを書ける
- 内側のループが「外側 1 回ごとに最後まで回る」と理解する
- 表 (行 × 列) や図形を出力できる
ドリル
| no | 内容 |
|---|---|
| 01 | 1×1 から 9×9 までの九九表 (81 行) を出力 |
| 02 | 入力 N で N 段の星 (*) のピラミッドを出力 |
📝 演習: ドリル 01 — 九九表 (1×1 〜 9×9)
問題
入れ子ループを使って、1 x 1 = 1 から 9 x 9 = 81 までの九九を 1 行ずつ全て (81 行) 出力してください。
出力の形は A x B = C (空白区切り)。
期待される出力 (先頭抜粋):
1 x 1 = 1
1 x 2 = 2
...
1 x 9 = 9
2 x 1 = 2
2 x 2 = 4
...
9 x 9 = 81ヒント
- 外側
for ($i = 1; $i <= 9; $i++) - 内側
for ($j = 1; $j <= 9; $j++) - 内側で
echo "$i x $j = " . ($i * $j) . "\n";
📝 演習: ドリル 02 — 星のピラミッド (左寄せ)
問題
標準入力で整数 N を 1 行受け取り、左寄せの星 (*) のピラミッドを N 段出力してください。
入力例:
4
期待される出力:
*
**
***
****ヒント
$n = (int) trim(fgets(STDIN));で N を読む- 外側
for ($i = 1; $i <= $n; $i++)で行数 - 内側
for ($j = 1; $j <= $i; $j++)で星の数 ($i個) - 内側で
echo "*";、内側を抜けたらecho "\n";