Semorphe

多層迴圈

迴圈裡面再放一個迴圈。 · ⏱ 約 25 分鐘

你會學到三件事

  1. 迴圈可以套在另一個迴圈裡面
  2. 內圈會跑完整輪,外圈才走一格
  3. 內圈的次數可以跟著外圈變

開始之前

🎯 從這一課起,版面預設是「程式碼」——而那不是因為積木不好用了。 到這裡你讀得懂前面每一課的程式碼了,試試看直接在程式碼那邊寫; 卡住的時候再切回積木,它一直都在。

⚠️ 這是這條軌道最後一次動預設——積木是輔助輪,而輔助輪是拿來拆的

九九乘法表、棋盤、圖片的每一個像素—— 這些東西都有兩個方向:第幾列、第幾行。

一個迴圈只能走一個方向。所以要兩個。

先試試看

先印九九乘法表的第一列就好:1 2 3 4 5 6 7 8 9

這個你會:一個 forj 從 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}
1319變數i變數j×" "印出換行印出計數j到(含)重複0回傳計數i到(含)重複定義函式 回傳型別int(整數)main使用命名空間std引入函式庫iostream(輸入輸出)123456810

到編輯器照著做一次:跟著做

換你了

把它變成整張九九乘法表——九列。

🔴 你只要改一個數字。回頭看「先試試看」那一段:那時候要改九個地方。

到編輯器做這一題:練習:整張九九乘法表

再一個

把上面那個星星塔自己寫一遍,印出四列。

到編輯器做這一題:練習:印一個星星塔

做一個

用星號印一棵聖誕樹。讀進一個數字 n(樹有幾層),印出來長這樣(n = 5):

    *
   ***
  *****
 *******
*********

每一列有兩件事要算,而兩件都跟列號 i 有關:

前面幾個空白    n - i
中間幾顆星      2i - 1

🔴 先別急著寫。拿紙筆把 i = 1, 2, 3 三列的空白數與星星數寫下來, 確認那兩個公式對得上,再開始寫程式。

🔴 做完之後,自己設計一個圖案,把規則用一句話講給旁邊的人聽, 讓他照你的描述寫出來。講得清楚,比畫得漂亮難。

到編輯器做這一題:做一個:一棵聖誕樹

這一課你做了什麼

如果卡住了

你看到 多半是因為
全部擠在一行 cout << endl; 放到外圈外面了
每個數字都換行 cout << endl; 放進內圈了
結果完全不對 兩層迴圈變數同名了
星星塔每列一樣長 內圈條件寫成固定數字,要用外圈的 i
聖誕樹歪一邊 空白那一段漏了,或是空白印成了 " "(兩格)
在編輯器打開這一課 →