iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0
Software Development

程式基礎概念討論系列 第 11

[DAY 11] 讓程式重複指定次數的迴圈陳述式(下):for 迴圏

  • 分享至 

  • xImage
  •  

昨天我們了解了迴圈陳述式中的 while 迴圏,而今天我們則會討論另一種迴圈陳述式:for 迴圏 (For Loop)。不過,在開始今天的討論前,讓我們先複習一遍迴圈陳述式的主要構成部分:

  1. 迴圈的開始
  2. 用來檢查是否繼續執行迴圈的條件 (主要為布林值資料或比較運算式)
  3. 跳轉動作
  4. 重複執行的陳述式 (可多於一項)
  5. 能影響作為條件的變數或運算式的值的部分
  6. 迴圈的結束

for 迴圈陳述式

for 迴圈陳述式是 for 迴圈中最基本的架構。它的概念是在迴圈重複執行指定的行為的基礎下使用指定次數來取代使用條件來決定是否繼續執行迴圈內容。for 迴圈陳述式的基本架構如下:

for 建立整數類資料型態的變數, 條件 [比較變數的值], 自動改變變數的值:
    陳述式

當我們把構成部分放進去看時:

[迴圈的開始部分]
for 建立變數[建立作為條件的變數部分], 條件 [檢查條件部分, 條件為假時跳轉到迴圈的結束部分], 自動改變變數的值 [改變作為條件的變數部分]:
    陳述式 [重複執行部分]
    [跳轉到迴圈的開始部分]
[迴圈的結束部分]

如果我們以 while 迴圈的架構來表示 for 迴圈陳述式時:

建立變數
while 條件 [比較變數的值]:
    陳述式
    改變變數的值

我們可以發現它的架構跟一般的 while 迴圈的架構相比,最大的差別便是來自在迴圈中建立的整數類資料型態的變數。在 for 迴圈中,它的檢查條件部分跟改變作為條件的變數部分都是使用這個變數來控制。而這樣做的好處是由於作為條件的變數是迴圈自行控制及改變,因此能減少出現無限迴圈的可能性。不過,需要注意的是,那個變數在大多數的程式語言中都是屬於區域變數,這代表該變數在 for 迴圈結束後便會被刪除而不能在後續的程式中使用

另外,for 迴圈的架構有一點比較特別的是,當我們以 while 迴圈的架構來表示時我們可以發現它的 for 建立變數, 條件 [比較變數的值], 自動改變變數的值 句子中包含了三個在不同時間點執行的指令,分別為:

  1. 迴圈開始前建立變數
  2. 執行迴圈內容前檢查條件 [變數的值]
  3. 執行迴圈內容後自動改變變數的值

現在,就讓我們使用 for 迴圈陳述式來列出昨天 while 迴圈所使用的例子,九九乘法表:[C#]

using System;

public class HelloWorld
{
    public static void Main(string[] args)
    {
        for (int a = 1; a < 10; a++) { // for 迴圈 1 閞始:建立變數 a 並指定它的值為 1, 檢查條件:a < 10, 當迴圈內容執行結束時執行:a++ (a = a + 1)
            for (int b = 1; b < 10; b++) { // for 迴圈 2 閞始:建立變數 b 並指定它的值為 1, 檢查條件:b < 10, 當迴圈內容執行結束時執行:b++ (b = b + 1)
                Console.WriteLine(a.ToString() + " x " + b.ToString() + " = " + (a * b).ToString()); // 顯示: [a] x [b] = [a*b]
            }
            // for 迴圈 2 結束
        }
        // for 迴圈 1 結束
    }
}

在上面的例子中,由於九九乘法表的句子架構 [a] x [b] = [a*b] 使用了兩個變數 [a 跟 b] 來決定它運行的總次數,因此我們使用了兩層的巢狀結構。由於 for 迴圈的條件是使用自行建立及控制的變數,多層巢狀結構的 for 迴圈相對於多層巢狀結構的 while 迴圈更少出現錯誤,因此多層巢狀結構的 for 迴圈會比較常被使用。不過,需要注意的是,我們每增加一層的 for 迴圈,那一次的巢狀 for 迴圈運行的總次數便會大幅增加,如例子中便從第一層的 9 次增加至兩層的 81 次。

foreach 迴圈陳述式

foreach 迴圈陳述式是一個比較後期才出現的 for 迴圈陳述式的延伸變體。它的概念是不使用新建立的整數類資料型態的變數來決定重複執行的次數,而是使用資料集合 (Data Set) 的資料數來決定重複執行的次數。這樣做的好處是它能確保該集合中的所有資料都能在迴圈中被使用,因此它一般會配合資料集合,例如陣列,來使用。有趣的是,一部分的程式語言,如 Python,會直接以 foreach 迴圈陳述式的概念來取代 for 迴圈陳述式原來的概念。foreach 迴圈陳述式的基本架構如下:

foreach 元素/資料 in 資料集合:
    陳述式

當我們把構成部分放進去看時:

[迴圈的開始部分]
foreach/for 元素/資料 [代表正在使用的資料,也是改變作為條件的變數部分] in 資料集合:[檢查條件部分, 若還有未使用資料時繼續執行迴圈, 若已使用所有資料時跳轉到迴圈的結束部分]
    陳述式 [重複執行部分]
    [跳轉到迴圈的開始部分]
[迴圈的結束部分]

以下是 foreach 迴圈陳述式的一個簡單例子,跟陣列的配合部分應該會在之後介紹陣列的概念時再進行更多的討論:[Python]

for num in range(100): # foreach 迴圈閞始:從 0-99 的整數資料集合中使用每一個整數資料並暫時將其儲存在變數 num 來執行迴圈內容
    print(num) # 顯示:變數 num 的值

延伸討論:while 迴圈陳述式與 for 迴圈陳述式

我們可以發現,while 迴圈陳述式跟 for 迴圈陳述式又是一個通用型架構與特化型架構的例子。while 迴圈陳述式是可以靈活地應對不同類型的條件的通用型架構;for 迴圈陳述式則是只以重複次數為條件的特化型架構。不過,這一次卻是特化型架構的 for 迴圈陳述式比通用型架構的 while 迴圈陳述式更常在程式設計時被使用。這是因為我們大多數在使用迴圈時的情況都是只需要重複指定的次數,因此針對控制重複次數的概念設計的 for 迴圈陳述式在使用上便會比 while 迴圈陳述式更為方便與簡潔。


上一篇
[DAY 10] 讓重複的事情不用一提再提的迴圈陳述式 (上):while 迴圈
下一篇
[DAY 12] 改變程式流程的跳躍陳述式
系列文
程式基礎概念討論30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言