練習 - 建立 do-while 反覆運算迴圈
表面上,do-while
和 while
陳述式不過是「另一個」反覆項目陳述式,可讓您逐一查看程式碼區塊,並變更您程式碼的執行流程。 不過,一旦我們檢查每個陳述式的運作方式,就可以更清楚地識別每個反覆項目陳述式的微妙差異,以及其使用時機。
什麼是 do-while 陳述式?
當指定的布林運算式評估為 True 時,do-while
陳述式便會執行陳述式或陳述式區塊。 因為運算式會在每次迴圈執行後評估,所以 do-while 迴圈會執行一或多次。
do
{
// This code executes at least one time
} while (true);
執行流程會從大括號內開始。 程式碼至少會執行一次,然後便會評估 while
關鍵字旁邊的布林運算式。 若布林運算式傳回 true
,程式碼區塊便會再次執行。
藉由將布林運算式硬式編碼為 true
,我們建立了無限迴圈,即永遠不會結束的迴圈 (至少以目前的撰寫方式)。 我們需要一種方式來在程式碼區塊的內部中斷迴圈。 我們將稍微討論 do-while
的允出準則。
好的,現在讓我們準備撰寫程式碼環境,並開始檢查實作 do-while
陳述式的程式碼範例。
準備您的撰寫程式碼環境
本課程模組包含實際操作活動,可引導您完成建置及執行示範程式碼的程序。 我們鼓勵您使用 Visual Studio Code 做為開發環境來完成這些活動。 針對這些活動使用 Visual Studio Code,可協助您更熟悉在全球專業人員使用的開發人員環境中撰寫及執行程式碼。
打開 Visual Studio Code。
您可以使用 Windows [開始] 功能表 (或另一個作業系統的對等資源) 來開啟 Visual Studio Code。
在 Visual Studio Code 的 [檔案] 功能表上,選取 [開啟資料夾]。
在 [開啟資料夾] 對話方塊中,瀏覽至 Windows Desktop 資料夾。
如果您在不同的資料夾位置中保留程式碼專案,您可以改用該資料夾位置。 針對本訓練,請務必使用容易找到並記住的位置。
在 [開啟資料夾] 對話方塊中,選取 [選取資料夾]。
如果您看到詢問您是否信任作者的安全性對話方塊,請選取 [是]。
在 Visual Studio Code 的 [終端] 功能表上,選取 [新增終端]。
請注意,終端面板中的命令提示字元會顯示目前資料夾的資料夾路徑。 例如:
C:\Users\someuser\Desktop>
注意
如果您是在自己的電腦上工作,而不是在沙箱或託管環境中工作,且您已完成此 C# 系列中的其他 Microsoft Learn 課程模組,您可能已針對程式碼範例建立專案資料夾。 如果是這種情況,您可以略過下一個步驟,這個步驟會用來在 TestProject 資料夾中建立主控台應用程式。
在終端命令提示字元中,若要在指定的資料夾中建立新的主控台應用程式,請輸入 dotnet new console -o ./CsharpProjects/TestProject,然後按 Enter 鍵。
這個 .NET CLI 命令會使用 .NET 程式範本,在指定的資料夾位置中建立新的 C# 主控台應用程式專案。 這個命令會為我們建立 CsharpProjects 和 TestProject 資料夾,並使用 TestProject 做為
.csproj
檔案的名稱。在 [總管] 面板中,展開 CsharpProjects 資料夾。
您應該會看到 TestProject 資料夾和兩個檔案:名為 Program.cs 的 C# 應用程式檔案,以及名為 TestProject.csproj 的 C# 專案檔。
在 [總管] 面板中,若要在 [編輯器] 面板中檢視程式碼檔案,請選取 [Program.cs]。
刪除現有的程式碼。
您將使用此 C# 主控台專案,在本課程模組期間建立、建置及執行程式碼範例。
關閉 [終端] 面板。
撰寫 do-while 陳述式,在產生特定隨機數字時中斷
讓我們撰寫程式碼,在 1 和 10 之間不斷產生隨機數字,直到產生數字 7 為止。 只需一次反覆運算即可取得 7,或可能需要數十次反覆運算。
請確定您已開啟 Visual Studio Code,並在 [編輯器] 面板中顯示 Program.cs。
注意
Program.cs 應該是空的。 如果不是,請選取並刪除所有程式碼。
在 Visual Studio Code 編輯器中輸入下列程式碼。
Random random = new Random(); int current = 0; do { current = random.Next(1, 11); Console.WriteLine(current); } while (current != 7);
在 Visual Studio Code 的 [檔案] 功能表上,選取 [儲存]。
在建置或執行程式碼之前,必須先儲存 Program.cs 檔案。
在 [總管] 面板中,若要在 TestProject 資料夾位置開啟 [終端],請以滑鼠右鍵按一下 [TestProject],然後選取 [在整合式終端機中開啟]。
[終端] 面板隨即開啟。 終端應該包含命令提示字元,顯示已對 TestProject 資料夾位置開啟終端。
在終端命令提示字元中,若要執行程式碼,請輸入 dotnet run,然後按 Enter 鍵。
注意
如果您看到訊息指出「找不到要執行的專案」,請確定終端命令提示字元會顯示預期的 TestProject 資料夾位置。 例如:
C:\Users\someuser\Desktop\csharpprojects\TestProject>
檢閱您的輸出。
由於數字是隨機產生的,因此您的結果會有所不同。 但是,
7
值將會是顯示的最後一個數字,因為當產生 7 時,布林運算式會評估為false
,且執行流程將結束程式碼區塊。2 5 8 2 7
請花幾分鐘檢閱您的程式碼。
第一個工作的重點是了解
do-while
迴圈的程式碼區塊至少會執行一次。 其可能會逐一查看非常多次,且我們不太可能事先知道有多少反覆運算存在。此外也請務必注意,程式碼區塊中的程式碼會影響是否要繼續逐一查看程式碼區塊。 影響允出準則的程式碼區塊是選取
do-while
或while
陳述式,而不是選取另一個反覆運算陳述式的主要原因。foreach
和for
都仰賴程式碼區塊外部的因素,以判斷程式碼區塊反覆運算的數目。
撰寫 while 陳述式,只在隨機數字大於一些值時逐一查看
現在,我們來看一下 while
陳述式。
使用 Visual Studio Code 編輯器來更新程式碼,如下所示:
Random random = new Random(); int current = random.Next(1, 11); /* do { current = random.Next(1, 11); Console.WriteLine(current); } while (current != 7); */ while (current >= 3) { Console.WriteLine(current); current = random.Next(1, 11); } Console.WriteLine($"Last number: {current}");
注意
在此情況中,我們會將
while
關鍵字和布林運算式置於程式碼區塊之前。 這會變更程式碼的意義並作為「閘道」,只在布林運算式評估為 True 時允許執行流程進入。儲存您的程式碼檔案,然後使用 Visual Studio Code 來執行程式碼。
從終端命令提示字元輸入
dotnet run
,以執行您的程式碼。檢閱所列出的輸出值。
由於數字是隨機的,因此您的程式碼會產生不同的序列。
9 7 5 Last number: 1
請花幾分鐘檢閱您的程式碼。
在頂端程式碼中,我們會使用
random
來初始化名為current
的int
變數。 下一個使用中的程式碼是while
陳述式。我們的
while
陳述式會根據布林運算式(current >= 3)
逐一查看。 我們不知道將指派哪些值給current
,但有可能會影響while
迴圈:- 若
current
初始化為大於或等於3
的值,則布林運算式會傳回true
,且執行流程將會進入程式碼區塊。 在程式碼區塊內,我們所做的第一件事是將current
的值寫入主控台。 接下來,還是在程式碼區塊內,我們會使用新的隨機值來更新current
的值。 此時,控制權會回到評估布林運算式的while
陳述式頂端。 此程序會繼續執行,直到布林運算式傳回false
,而執行流程會中斷程式碼區塊。 - 如果
current
初始化 (在程式碼頂端) 為小於3
的值,則布林運算式會傳回false
,且程式碼區塊永遠不會執行。
最後的程式碼會將
current
的值寫入主控台。 無論反覆運算程式碼區塊是否執行,此程式碼都會執行,且這個程式碼讓我們有機會將current
的最終值寫入主控台。- 若
使用 continue 陳述式來直接進入布林運算式
在某些情況中,我們會想要繞過程式碼區塊中程式碼的剩餘部分,並繼續前往下一個反覆項目。 我們可以使用 continue
陳述式來執行該操作。
使用 Visual Studio Code 編輯器來更新程式碼,如下所示:
Random random = new Random(); int current = random.Next(1, 11); do { current = random.Next(1, 11); if (current >= 8) continue; Console.WriteLine(current); } while (current != 7); /* while (current >= 3) { Console.WriteLine(current); current = random.Next(1, 11); } Console.WriteLine($"Last number: {current}"); */
請花幾分鐘檢閱您的程式碼。
請注意,我們已切換回
do-while
。do-while
可確保迴圈至少會逐一查看一次。我們在程式碼區塊內執行的第一件事,是將新的隨機值指派給
current
。 接下來,我們會檢查current
是否大於或等於8
。 如果這個運算式傳回true
,則continue
關鍵字會將控制權轉送至程式碼區塊的結尾,而while
將會評估(current != 7)
。 因此,只要current
的值不等於7
,迴圈就會繼續逐一查看。此練習步驟的重點是包含
continue
關鍵字的程式碼:if (current >= 8) continue;
由於將
current
的值寫入主控台的程式碼位於if (current >= 8) continue;
之後,因此我們的程式碼可確保大於或等於8
的current
值永遠不會寫入輸出視窗。讓我們試試看。
儲存您的程式碼檔案,然後使用 Visual Studio Code 來執行程式碼。
從終端命令提示字元輸入
dotnet run
,以執行您的程式碼。檢閱所列出的輸出值。
5 1 6 7
您可能會看到與以下顯示不同的結果。 但是,在程式碼執行以值
7
結束前,您將不會在輸出視窗中看到任何8
或以上的值。請考慮
continue
與break
陳述式之間的差異。如您在最後一個步驟中所見,
continue
陳述式會將執行轉送至目前反覆運算的結尾。 此行為與我們在break
陳述式中看到的行為不同。break
陳述式會終止反覆運算 (或switch
),並將控制權轉送到終止陳述式後面的陳述式。 如果終止陳述式之後沒有陳述式,則控制權會轉送至檔案或方法的結尾。
概括回顧
在本單元中,有幾個您應擷取的重要想法:
do-while
陳述式會逐一查看程式碼區塊至少一次,並可能會根據布林運算式繼續逐一查看。 布林運算式評估通常取決於程式碼區塊內部產生或擷取的某些值。while
陳述式會先評估布林運算式,並在布林運算式評估為true
時繼續逐一查看程式碼區塊。continue
關鍵字會立即進入布林運算式。