Semorphe

for 迴圈

把迴圈的三樣東西寫在同一行。 · ⏱ 約 25 分鐘

你會學到三件事

  1. for 就是 while 的三樣東西寫在一起,而什麼時候用哪一個
  2. break 跳出整個迴圈,continue 只跳過這一圈
  3. 為什麼大家幾乎都從 0 開始數

開始之前

上一課的迴圈,三樣東西散在三個地方:

int n = 1;          // ① 在上面
while (n <= 5) {    // ② 在這裡
    ...
    n = n + 1;      // ③ 在最後一行,很容易忘
}

for 把它們放在同一行,所以你不可能漏掉第三樣。

🟢 先把編輯器打開,跟著下面一起做:跟著做

一、for

同一件事用 for 寫起來是這樣——照著打上:

1for (int i = 1; i <= 5; i++) {2    cout << i << endl;3}
15變數i換行印出計數i從到(含)重複使用命名空間std引入函式庫iostream(輸入輸出)12

分號隔開的三段,就是上一課那三樣東西:

for ( int i = 1 ;  i <= 5 ;  i++ ) {
       ① 起點      ② 條件     ③ 變動

執行順序:起點跑一次 → 問條件 → 做內容 → 變動 → 回去問條件 → …

積木盤上這一顆寫著「計數 … 從 … 到 …」——那三段就填在它的格子裡。

⚠️ i 只活在這個迴圈裡。 迴圈結束之後 i 就不存在了, 想在外面用到它的值,要另外宣告一個變數。

二、同一支程式,兩種寫法

上一課那支「印 1 到 5」,兩種寫法逐字對照。while 的寫法:

1int n = 1;2while (n <= 5) {3    cout << n << endl;4    n = n + 1;5}
1變數n5≤變數n換行變數n變數n1+把設成印出當持續執行宣告int(整數)變數n=使用命名空間std引入函式庫iostream(輸入輸出)1234

for 的寫法:

1for (int i = 1; i <= 5; i++) {2    cout << i << endl;3}
15變數i換行印出計數i從到(含)重複使用命名空間std引入函式庫iostream(輸入輸出)12
int n = 1;     ←→   int i = 1      ① 起點
n <= 5         ←→   i <= 5         ② 條件
n = n + 1      ←→   i++            ③ 變動

一模一樣的三樣東西,只是換了擺法。跑出來的結果逐字相同。

i++ 是 i = i + 1 的簡寫。積木上那一顆是一個變數配一個下拉,選 加 1(++)。

那什麼時候用哪一個?

判準只有一句話:你講得出「第幾次」嗎?

你心裡想的是 用
「跑 10 次」「第 i 個」「從 0 到 n-1」——有編號 for
「一直讀到 0 為止」「一直除到剩 1」——不知道要跑幾次 while

上一課的兩題正好各站一邊:

印出前五項           有編號(第 1 項到第 5 項)        →  for
一直除到剩 1         不知道要幾步(那正是那題要問的)  →  while

⚠️ 兩種永遠可以互換:for 寫得出來的 while 也寫得出來,反過來也是。 這不是能不能的問題,是哪一個讀起來比較誠實。

三、跳出去 vs 跳過這圈

把剛才那一段改成這樣,中間會跳過一次:

1for (int i = 1; i <= 5; i++) {2    if (i == 3) continue;      // 這一圈剩下的不做,直接做「變動」3    cout << i << endl;4}
15變數i3=跳至下一次變數i換行印出如果則計數i從到(含)重複使用命名空間std引入函式庫iostream(輸入輸出)123

印出 1 2 4 5——3 被跳過了。

做什麼
continue 這一圈剩下的不做,跳到「變動」,繼續下一圈
break 整個迴圈結束,跳到大括號後面

積木盤上它們寫著「跳至下一次」與「跳出迴圈」。

⚠️ 兩個都只影響最靠近的那一層迴圈。多層迴圈的時候要注意 (第 16 課會遇到)。

四、為什麼大家從 0 開始

上面的例子從 1 開始,因為我們要印 1 到 5。

而處理資料的時候幾乎都這樣寫:

for (int i = 0; i < n; i++) {

0 開始、< 而不是 <=。原因是一條你從下一批課程開始會一直碰到的規則: 位置從 0 開始數,所以 n 個東西的位置是 0 到 n-1。

寫成 i = 0; i < n 的話,i 正好走過每一個位置,一個不多一個不少。 ⚠️ 寫成 i <= n 會多跑一圈,而多的那一圈碰到的是不存在的東西。

這個形狀從第 13 課的陣列開始會一直出現,先把它記成一個整體。

完成的樣子

這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。

1#include <iostream>2using namespace std;3int main() {4    for (int i = 1; i <= 5; i++) {5        if (i == 3) continue;6        cout << i << endl;7    }8    return 0;9}
15變數i3=跳至下一次變數i換行印出如果則0回傳計數i從到(含)重複定義函式 回傳型別int(整數)main使用命名空間std引入函式庫iostream(輸入輸出)1234586

把積木打散,自己排回去:排回去:把剛才那支程式的積木排好

換你了

把 continue 改成 break,執行看看差在哪。

(會印 1 2 就停——break 是整個迴圈結束,不是跳過一圈。)

到編輯器做這一題:練習:把 continue 換成 break

再一個:把上一課那題改寫成 for

上一課的「找出公式」那一題,你用 while 印出了 1, 3, 5, 7, 9。 現在用 for 寫一遍,輸出要逐字相同。

🔴 改完之後把兩支程式並排看一眼:哪一支比較容易看出「它會跑五次」?

到編輯器做這一題:練習:把上一課的 while 改寫成 for

做一個

數出 1 到 100 之間,是 3 的倍數、而不是 5 的倍數的數字有幾個。

🔴 這一題規定要用 continue,不准用 && 把兩個條件併成一個。 做完之後再用 && 寫一次,兩個答案要一樣,它們是同一件事的兩種說法。

到編輯器做這一題:做一個:3 的倍數,但不是 5 的倍數

這一課你做了什麼

如果卡住了

你看到 多半是因為
迴圈外面用 i 說沒宣告 i 只活在迴圈裡。要在外面用就在外面宣告
多跑了一圈 i <= n 應該是 i < n
for (...) ; 什麼都沒做 多了一個分號——和 if 同一個錯
break 沒跳出全部 它只跳出最靠近的那一層
在編輯器打開這一課 →