第 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 | 要元素本身,不要下標 | 求和、列印集合 |