Semorphe

多層迴圈

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

你會學到三件事

  1. 迴圈可以套在另一個迴圈裡面
  2. 內圈會跑完整輪,外圈才前進一格
  3. 二維陣列:用兩個位置指一格

開始之前

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

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

一、套起來

for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        cout << i * j << " ";
    }
    cout << endl;
}

執行順序是這樣:

i = 1  →  j = 1, 2, 3   印 1 2 3   然後換行
i = 2  →  j = 1, 2, 3   印 2 4 6   然後換行
i = 3  →  j = 1, 2, 3   印 3 6 9   然後換行

外圈走一格,內圈跑完一整輪。

所以總共跑了 3 × 3 = 9 次。這是多層迴圈的代價: 兩層各 1000 圈的話,裡面那行會跑一百萬次。

⚠️ cout << endl; 的位置很重要:它在內圈外面、外圈裡面。 放進內圈的話每個數字都換行;放到外圈外面的話全部擠成一行。

二、兩個位置指一格

int g[2][3] = {{1, 2, 3}, {4, 5, 6}};

讀法:「2 列,每列 3 個」。

        [0]  [1]  [2]
   [0]   1    2    3
   [1]   4    5    6

g[1][2]6——第一個方括號是列,第二個是行

大括號的巢狀對應到形狀:{{一列}, {另一列}}

三、走過整張

for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
        cout << g[i][j] << " ";
    }
    cout << endl;
}

外圈走列、內圈走行——和陣列的形狀完全一樣,只是做了兩次

⚠️ 兩個迴圈變數不能同名。都叫 i 的話,內圈會把外圈的 i 蓋掉, 而那是一個很難看出來的錯。習慣上外圈用 i、內圈用 j

完成的樣子

int main() {
    int g[2][3] = {{1, 2, 3}, {4, 5, 6}};
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            cout << g[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

換你了

印一個星星塔:

*
**
***
****

提示:外圈 i 從 1 到 4,內圈跑 i 次—— 內圈的條件可以用外圈的變數

這一課你做了什麼

如果卡住了

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