C# 入門指南

單元 7 - 迴圈

~~學習進度表~~

程式 (program) 中的迴圈 (loop) 就是在特定程式區塊 (block) 中,重複執行相同的工作

迴圈 → 區塊 → 結束迴圈

C# 中有四種迴圈,一種是 while 迴圈 (while loop) ,另一種則是 for 迴圈 (for loop) ,還有一種是 do-while 迴圈 (do-while loop) ,最後一種是 foreach-in 迴圈 (foreach loop) 。 whilefor 兩種迴圈屬於前測試迴圈,可以互相替代,端視自己喜歡用哪一種!至於 do-while 迴圈屬於後測試迴圈, foreach-in 迴圈則逐項取得複合資料型態物件中的元素。

前測試迴圈是在迴圈主體開始前,先進行迴圈結束的條件測試,後測試迴圈則相反,在進行完迴圈主體的工作後,才進行迴圈結束的條件測試。

我們先來看看 while 迴圈的寫法

int i = 10; // 設定控制變數
while (i > 0) // 結束條件測試
{
    // 迴圈工作區
    Console.WriteLine(i);
    i--; // 調整控制變數值
}

這個迴圈所進行的工作很簡單,先在命令列上印出 10 ,然後一路倒數到 1 為止。迴圈有三個地方要注意

  1. 設定控制變數
  2. 結束條件測試
  3. 調整控制變數

while 迴圈的控制變數 (control variable) 必須在 while 之前就先設定好,此例中將控制變數 i 設定為 10 。然後進入 while 的地方,結束條件 (condition) 就在 while 之後的小括弧中,此例中為當控制變數 i 大於 0 時,迴圈便會重複執行。迴圈工作區,也就是 while 底下用大括弧圍住的程式區塊,這裡,我們只有簡單的印出控制變數 i 的值,迴圈工作區的最後需要有調整控制變數值的地方。

我們先寫成完整的範例,來執行看看結果吧!

using System;

namespace LoopDemo01
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 10; // 設定控制變數
            while (i > 0) // 結束條件測試
            {
                // 迴圈工作區
                Console.WriteLine(i);
                i--; // 調整控制變數值
            }
        }
    }
}

//《程式語言教學誌》的範例程式
// http://kaiching.org/
// 專案:LoopDemo01
// 檔名:Program.cs
// 功能:示範 C# 的 while 陳述
// 作者:張凱慶

執行結果如下

C:\LoopDemo01> dotnet run
10
9
8
7
6
5
4
3
2
1
C:\LoopDemo01>

當我們明確知道重複次數的時候,我們得利用控制變數來記錄 while 迴圈所進行次數,這樣 while 迴圈才會有結束的一天,不然若是三個與控制變數相關的部份,漏了任一部份時,就有可能導致無窮迴圈 (infinite loop) 的發生,例如

int i = 10; // 設定控制變數
while (i > 0) // 結束條件測試
{
    // 迴圈工作區
    Console.WriteLine(i);
    // 沒有調整控制變數值
}

這樣一來,控制變數 i 永遠大於 0 ,所以迴圈會一直重複執行,此例會不斷的在命令列印出 10 ,直到強制結束程式的執行為止。

以上的 while 迴圈是介紹有明確重複次數的用法,若是迴圈沒有明確重複次數,那就得另行設計結束迴圈的方式,例如控制變數等於某一個值之時,再利用 break 跳出迴圈。

另外一個 for 迴圈則是把控制變數的設定、迴圈結束條件測試、控制變數的調整全都寫在小括弧之中,如下

for (int i = 10; i > 0; i--)
{
    Console.WriteLine(i);
}

for 之後的小括弧用兩個分號區隔三個項目,依序是控制變數的設定、迴圈結束條件、控制變數的調整。這個 for 迴圈與上面的 while 迴圈功能完全相同,寫成完整的範例程式,如下

using System;

namespace LoopDemo02
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 10; i > 0; i--)
            {
                Console.WriteLine(i);
            }
        }
    }
}

//《程式語言教學誌》的範例程式
// http://kaiching.org/
// 專案:LoopDemo02
// 檔名:Program.cs
// 功能:示範 C# 的 for 陳述
// 作者:張凱慶

for 迴圈習慣上會把控制變數的宣告直接放進小括弧中,當然也可以在小括弧外先宣告,然後才在小括弧裡設定初值。

執行結果如下

C:\LoopDemo02> dotnet run
10
9
8
7
6
5
4
3
2
1
C:\LoopDemo02>

小括弧中的兩個分號與條件是必須的,因此如果寫成

int i = 1;
for (; i > 0;) 
{
    Console.WriteLine(i);
}

這會使 for 迴圈變成一個無窮迴圈。

習慣上, for 迴圈通常用於具有明確重複次數的迴圈,因為全部的控制機制都放在 for 之後的小括弧中, while 迴圈用於沒有明確重複次數的迴圈,例如接收使用者輸入的迴圈,當使用者輸入結束指令的時候,迴圈才會結束,不然程式會一直等待使用者的輸入。

倒是提醒一點, for 迴圈可以用 while 迴圈替代,反之亦然,自己偏好哪一種也就可以用哪一種囉!

至於 do-while 迴圈,這是把結束條件放在最後,其餘跟 while 迴圈相同,也就是說,進入 do-while 迴圈是先做第一次,然後才進行條件測試,例如把上面的倒數計時程式改寫成 do-while 迴圈

int i = 10; // 設定控制變數
do {
    // 迴圈工作區
    Console.WriteLine(i);
    i--; // 調整控制變數值
} while (i > 0); // 結束條件測試

大多數的 do-while 也能夠用 while 替代,這方面視情況再選擇用後測試迴圈或前測試迴圈囉!

最後還有個 foreach-in 迴圈,這用在複合資料型態的物件,下一單元介紹字串 (string) 與陣列 (array) 的時候一併介紹 foreach-in 迴圈。

相關教學影片

上一頁 單元 6 - 選擇
回 C# 入門指南首頁
下一頁 單元 8 - 陣列與字串
回 C# 教材首頁
回程式語言教材首頁
中英文術語對照
陣列array
程式區塊block
條件condition
控制變數control variable
do-while 迴圈do-while loop
foreach-in 迴圈foreach loop
for 迴圈for loop
無窮迴圈infinite loop
迴圈loop
程式program
字串string
while 迴圈while loop
參考資料
1. C# 參考 | Microsoft Docs - do
2. C# 參考 | Microsoft Docs - for
3. C# 參考 | Microsoft Docs - foreach 、 in
4. C# 參考 | Microsoft Docs - while
重點整理
1. 迴圈是只在特定的程式區塊進行重複工作。
2. C# 中有四種迴圈,分別是 while 迴圈 、 for 迴圈、 do-while 迴圈、 foreach-in 迴圈。
3. 迴圈基本三要件:設定控制變數、結束條件測試、調整控制變數。
4. while 迴圈與 do-while 迴圈都需要設置迴圈三要素,兩者的差別是 while 迴圈是前測試迴圈, do-while 迴圈事後測試迴圈。
5. for 迴圈是把迴圈三要素寫在 for 之後的小括弧中,通常用於固定次數的迴圈。
6. foreach-in 迴圈用於複合資料型態的物件,逐一取得每一個元素。
7. 無窮迴圈是不會結束的迴圈,因此在無窮迴圈中要自行設定結束方式,通常是用 break 跳出迴圈。
問題與討論
1. 很多情況都需要 while true 迴圈,這不是無窮迴圈嗎?那為什麼 還要 while true 迴圈呢?
2. while 迴圈與 for 迴圈要如何互相替代?
3. while 迴圈與 do-while 迴圈要如何互相替代?
4. 遞迴是一種用於重複工作的演算法,遞迴跟迴圈有什麼不同呢?
練習
1. 建立一個新專案 Exercise0701 ,利用迴圈計算 1 到 1000 的總和。
2. 承上題,另建立一個專案 Exercise0702 ,改成接受使用者輸入,計算 1 到使用者輸入整數的總和。
3. 迴圈中若有其他迴圈稱之為巢狀迴圈,利用巢狀迴圈及 '*' 建立一個專案 Exercise0703,印出一個高 5 、底 5 的等腰直角三角形。
4. 承上題,另建立一個專案 Exercise0704 ,將三角形倒過來印。
5. 承上題,另建立一個專案 Exercise0705 ,改成接收使用者輸入邊長。
6. 建立一個專案 Exercise0706 ,利用巢狀迴圈印出九九乘法表。
7. 建立一個專案 Exercise0707 ,在 while true 迴圈中接受使用者的輸入,當使用者輸入 'e' 的時候利用 break 跳出迴圈。
8. 建立一個專案 Exercise0708 ,計算 10 的階層,也就是從正整數 1 乘以正整數 2 ,一路乘到正整數 10 。
9. 承上題,另建立一個專案 Exercise0709 ,改成接受使用者輸入,計算使用者輸入的階層數。
10. 費氏數列為 011235813 .... ,也就是後面的數字為前兩個數字的總和,建立一個專案 Exercise0710 ,計算出第 20 個數字。
11. 承上題,建立一個專案 Exercise0711 ,改成接受使用者輸入,計算使用者輸入的第幾個費氏數。