多層迴圈
迴圈裡面再放一個迴圈。 · ⏱ 約 25 分鐘
你會學到三件事
- 迴圈可以套在另一個迴圈裡面
- 內圈會跑完整輪,外圈才走一格
- 內圈的次數可以跟著外圈變
開始之前
🎯 從這一課起,版面預設是「程式碼」——而那不是因為積木不好用了。
到這裡你讀得懂前面每一課的程式碼了,試試看直接在程式碼那邊寫;
卡住的時候再切回積木,它一直都在。
⚠️ 這是這條軌道最後一次動預設——積木是輔助輪,而輔助輪是拿來拆的。
九九乘法表、棋盤、圖片的每一個像素——
這些東西都有兩個方向:第幾列、第幾行。
一個迴圈只能走一個方向。所以要兩個。
先試試看
先印九九乘法表的第一列就好:1 2 3 4 5 6 7 8 9。
這個你會:一個 for,j 從 1 跑到 9,印 1 * j。
到編輯器試試看:先試試看:印出九九乘法表的第一列
寫完之後問自己一句:那第二列呢?
把整段複製起來、把 1 改成 2——好,那第三列、第九列呢?
你會複製九遍,而改錯一個不會有人告訴你。
一、套起來
複製九遍這件事,本身就是「同一件事做九次」——而那正是迴圈。
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 9; j++) {
cout << i * j << " ";
}
cout << endl;
}
執行順序是這樣:
i = 1 → j = 1, 2, 3 ... 9 印 1 2 3 ... 9 然後換行
i = 2 → j = 1, 2, 3 ... 9 印 2 4 6 ... 18 然後換行
i = 3 → j = 1, 2, 3 ... 9 印 3 6 9 ... 27 然後換行
外圈走一格,內圈跑完一整輪。
所以總共跑了 3 × 9 = 27 次。這是多層迴圈的代價:
兩層各 1000 圈的話,裡面那行會跑一百萬次。
⚠️ cout << endl; 的位置很重要:它在內圈外面、外圈裡面。
放進內圈的話每個數字都換行;放到外圈外面的話全部擠成一行。
⚠️ 兩個迴圈變數不能同名。都叫 i 的話,內圈會把外圈的 i 蓋掉,
而那是一個很難看出來的錯。習慣上外圈用 i、內圈用 j。
二、內圈的次數可以跟著外圈變
到目前為止內圈都是固定的 9 次。但它不必是。
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= i; j++) { // ← 跑 i 次,不是固定次數
cout << "*";
}
cout << endl;
}
*
**
***
****
內圈的條件裡可以放外圈的變數——這一句是後面所有圖案題的鑰匙。
完成的樣子
這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。
1#include <iostream>2using namespace std;3int main() {4 for (int i = 1; i <= 3; i++) {5 for (int j = 1; j <= 9; j++) {6 cout << i * j << " ";7 }8 cout << endl;9 }10 return 0;11}
到編輯器照著做一次:跟著做
換你了
把它變成整張九九乘法表——九列。
🔴 你只要改一個數字。回頭看「先試試看」那一段:那時候要改九個地方。
到編輯器做這一題:練習:整張九九乘法表
再一個
把上面那個星星塔自己寫一遍,印出四列。
到編輯器做這一題:練習:印一個星星塔
做一個
用星號印一棵聖誕樹。讀進一個數字 n(樹有幾層),印出來長這樣(n = 5):
*
***
*****
*******
*********
每一列有兩件事要算,而兩件都跟列號 i 有關:
前面幾個空白 n - i
中間幾顆星 2i - 1
🔴 先別急著寫。拿紙筆把 i = 1, 2, 3 三列的空白數與星星數寫下來,
確認那兩個公式對得上,再開始寫程式。
🔴 做完之後,自己設計一個圖案,把規則用一句話講給旁邊的人聽,
讓他照你的描述寫出來。講得清楚,比畫得漂亮難。
到編輯器做這一題:做一個:一棵聖誕樹
這一課你做了什麼
- 你把一個迴圈套進了另一個迴圈
- 你知道外圈走一格、內圈跑一整輪
- 你讓內圈的次數跟著外圈變,印出了會長大的圖案
如果卡住了
| 你看到 |
多半是因為 |
| 全部擠在一行 |
cout << endl; 放到外圈外面了 |
| 每個數字都換行 |
cout << endl; 放進內圈了 |
| 結果完全不對 |
兩層迴圈變數同名了 |
| 星星塔每列一樣長 |
內圈條件寫成固定數字,要用外圈的 i |
| 聖誕樹歪一邊 |
空白那一段漏了,或是空白印成了 " "(兩格) |
在編輯器打開這一課 →