第 4 課 · 約 14 分鐘 · ← 第 3 課

迴圈:for、while、do-while、foreach

四種迴圈,一個心智模型:條件成立就重複執行一段程式碼。區別只在計數放在哪、以及你在遍歷什麼。

for:知道要跑幾次

頭部三個子句——起點、繼續條件、步進:

for (int i = 1; i <= 5; i++)   // i 從 1 起;只要 i <= 5 就重複;每輪後 i++
{
    Console.Write(i * 2 + " ");
}
Console.WriteLine();

迴圈變數 i 生於 for、死於 for——迴圈結束後想用它就是 CS0103。

累加器模式

最有用的迴圈形狀:變數宣告在迴圈前,每一輪更新:

int sum = 0;                    // 累加器從 0 起步——永遠
int count = 0;
for (int i = 1; i <= 5; i++)
{
    sum += i;                   // 把每個值摺進來
    count++;
}
Console.WriteLine($"sum: {sum}, count: {count}");

while:不知道要跑幾次

// 翻倍一個數直到超過 10——跑幾輪?事先不知道
int n = 1;
while (n <= 10)
{
    Console.WriteLine(n);
    n = n * 2;          // 沒有這行:無限迴圈(見下)
}

規則:迴圈體內必須有東西把條件推向假。本站的引擎有步數看門狗,失控迴圈會被攔下而不是凍死標籤頁——在 Visual Studio 裡,無限迴圈就那麼跑著。

do-while:後檢查,至少跑一次

輸入校驗的經典——先問,再決定要不要再問:

string[] attempts = { "abc", "-5", "42" };
int pos = 0;
int value;

do
{
    int.TryParse(attempts[pos], out value);   // 試著解析下一個輸入
    pos++;
} while (value <= 0);                        // 沒拿到正數就再來一輪

Console.WriteLine("accepted: " + value);

普通 while 先檢查——條件一開始就為假的話,迴圈體一次都不跑。do-while 保證至少跑一次。這正是數位數用 do-while 解決 n = 0 邊界的原因。

foreach:遍歷集合,完全不用數

int[] scores = { 72, 95, 88 };

foreach (int s in scores)        // "對每個元素,叫它 s"
{
    Console.WriteLine("score: " + s);
}

Console.Write("letters in Ada: ");
foreach (char c in "Ada")        // 字串是 char 的序列
{
    Console.Write(c + " ");
}
Console.WriteLine();

break 和 continue:從內部駕馭

int[] scores = { 72, 95, 88 };

// break:整個迴圈當場退出(第一個命中)
for (int i = 0; i < scores.Length; i++)
{
    if (scores[i] > 90)
    {
        Console.WriteLine($"found {scores[i]} at index {i}");
        break;
    }
}

// continue:只跳過本輪剩下的部分
for (int i = 1; i <= 5; i++)
{
    if (i % 2 == 0) continue;   // 跳過偶數
    Console.Write(i + " ");
}

巢狀迴圈:乘法表的一角

for (int row = 1; row <= 3; row++)
{
    for (int col = 1; col <= 3; col++)
    {
        Console.Write(row * col + " ");
    }
    Console.WriteLine();       // 每行結束換行——注意它待的位置
}

外層每走一步,內層完整跑一遍:3 × 3 = 9 次列印。新手經典 bug 是把 WriteLine() 放進內層(每個數字一行)或放到兩個迴圈外面(全擠一行)——跑一遍,挪一挪,直到形狀講得通。

哪個迴圈,什麼時候?

迴圈什麼時候用招牌動作
for知道次數(或範圍)計數:for (int i = 0; i < n; i++)
while重複到條件變化;可能一次不跑哨兵:"直到輸入合法"
do-while同樣,但至少一次選單 / 重試提示
foreach要元素本身,不要下標求和、列印集合

現在就練