1.38k likes | 1.56k Views
流程控制 ─ 重複執行同一段程式. 第 7 章. 本章重點提要. 7-1 For-Next:計次執行的迴圈 7-2 While 與 Do-Loop:有條件執行的迴圈 7- 3 巢狀迴圈 7- 4 直接跳出迴圈的敘述 7-5 Timer 控制項:定時執行程式. 本章閱讀建議. 上一章我們介紹了 If 、 Select Case 等 『 選擇性執行 』 的流程控制 , 本章則要介紹 『 迴圈 』, 就是讓同一段程式不斷重複執行 , 直到某些條件發生變化為止。這二種流程控制都非常重要 , 如能善加應用 , 就能寫出更多變化且條理分明的程式。
E N D
流程控制 ─重複執行同一段程式 第 7 章
本章重點提要 • 7-1 For-Next:計次執行的迴圈 • 7-2 While 與 Do-Loop:有條件執行的迴圈 • 7-3 巢狀迴圈 • 7-4 直接跳出迴圈的敘述 • 7-5 Timer 控制項:定時執行程式
本章閱讀建議 • 上一章我們介紹了 If、Select Case 等『選擇性執行』的流程控制, 本章則要介紹『迴圈』, 就是讓同一段程式不斷重複執行, 直到某些條件發生變化為止。這二種流程控制都非常重要, 如能善加應用, 就能寫出更多變化且條理分明的程式。 • 迴圈的原理其實不難, 請讀者先看完底下的重點介紹, 然後再往下學習時就能事半功倍。
本章閱讀建議 • 7-1 For-Next:計次執行的迴圈:最經典的例子就是由 1 加到 100, 若使用 For-Next 迴圈只需 3 行程式, 而不用真得去加 100 次!這就是迴圈的威力。 • 7-2 While 與 Do-Loop:依條件執行的迴圈:如果迴圈的次數不一定, 那麼就可改用 While 或 Do-Loop 敘述, 以便依照特定條件來決定是否繼續迴圈。
本章閱讀建議 • 7-3 巢狀迴圈:迴圈中還有迴圈, 就形成巢狀迴圈。巢狀迴圈可以輕鬆處理像是『九九乘法表』之類, 看似複雜但又有規則可循的問題。 • 7-4 直接跳出迴圈的敘述:在迴圈中可使用 Exit For、ExitWhile、Exit Do 等指令來直接跳出迴圈, 它們通常會搭配 If 來使用, 例如『If 某狀況發生 Then Exit For』。 • 7-5 Timer 控制項:定時執行程式:Timer 控制項可以定時觸發Tick 事件, 就好像時鐘會每秒鐘發出滴答聲 (Tick)一樣。最經典的例子是小時鐘程式, 因為我們可利用 Timer 控制項來每秒鐘更新一次時間。
7-1 For-Next:計次執行的迴圈 • 在寫程式時, 常常會遇到一些需要重複執行的動作, 此時如果知道要重複的次數, 那麼使用 For-Next 敘述最為方便。
簡單型的 For-Next 迴圈 • 在 For-Next 敘述中至少要包含『計數器』、『起始值』、與『終止值』, 例如底下由 1 加到 100 的範例:
簡單型的 For-Next 迴圈 • For 後面要接一個計數器 (i), 其計數範圍是 1 到 100 (i = 1 To100)。當第一次執行迴圈時, 計數器的值會等於 1 (起始值), 然後每執行一次迴圈計數器就加 1, 如此重複執行到計數器等於 100(終止值), 然後結束迴圈, 繼續執行迴圈之後的程式。
簡單型的 For-Next 迴圈 • 因此, 以上程式會執行 100 次迴圈, 第 1 圈時 (i=1) sum 會加 1, 第2 圈時 (i=2) sum 再加 2, 第 3 圈時 (i=3) sum 再加 3...:
簡單型的 For-Next 迴圈 • 撰寫一個由 9 加到 999 的程式。 • 請建立 Windows Form 應用程式專案 Ch07-01。
簡單型的 For-Next 迴圈 • 用滑鼠雙按表單, 然後在 Form1 的 Load 事件程序中加入以下程式:
簡單型的 For-Next 迴圈 • 請問前面的程式共會執行多少次迴圈? 999 - 9 + 1 = 991 次。
請簡單型的 For-Next 迴圈 寫程式計算由 5 乘到 15 的結果。(注意, 5x6x7x...x15 結果會是一個非常大的數值!)
簡單型的 For-Next 迴圈 以上我們宣告變數 m 來儲存相乘的結果, 但由於是計算乘法, 所以必須先將 m 的初值設為 1 (不指定初值時預設為 0, 而 0 乘任何數的結果仍為 0)。 另外, 如果在迴圈中不斷進行累加或累乘, 則有可能在不知不覺中產生很大的數值!像本例的計算結果就超出了整數可表達的範圍(-2147483648 ~ 2147483647), 因此我們特別將 m 宣告為 Long 型別。
簡單型的 For-Next 迴圈 如果是宣告為 Integer 型別, 那麼在執行時會出現如下的錯誤訊息:
指定增減量的 For-Next 迴圈 在前面的範例中, 都是讓計數器每執行完一迴圈就加 1, 這是 For-Next 的預設狀況。但有時我們會希望計數器每迴圈能加 2, 例如計算連續偶數的累加;或是每迴圈能減 1, 例如由 100 加到 1, 這時就可用 Step 來指定計數器的『增減量』:
指定增減量的 For-Next 迴圈 • 『增減量』就是用來控制每迴圈計數器要加多少或減多少, 如果起始值 < 終止值, 那麼增減量應為正值;反之,如果起始值 > 終止值(例如由 100 To 1), 那麼增減量應為負值。
指定增減量的 For-Next 迴圈 在表單中畫出金字塔, 如下圖所示。 • 請建立 Windows Form 應用程式專案 Ch07-02。
指定增減量的 For-Next 迴圈 • 加入一個 Label 控制項, 並設定屬性如下:
指定增減量的 For-Next 迴圈 • 在表單空白處雙按滑鼠, 然後在 Form1 的 Load 事件程序中加入以下程式:
指定增減量的 For-Next 迴圈 首先我們將 Label1 的 TextAlign (文字對齊) 屬性設為 MiddleCenter (垂直水平均置中對齊), 然後利用迴圈來產生每一列所需的 $ 字串。 其中的 StrDup(n, s) 函式可以產生包含 n 個 s 的字串, 而 vbCrLf 則為 VB 預先定義好的換行符號。
指定增減量的 For-Next 迴圈 • 在 StrDup(n, s) 函式中, 若 s 包含 2 個以上的字元, 則只會取出第一個字元來重複 n 次, 例如 StrDup(3, "ab") 的傳回值為 "aaa"。
指定增減量的 For-Next 迴圈 • 在表單中畫出倒三角形, 如下圖所示。
指定增減量的 For-Next 迴圈 所有的設定均與上題相同, 只須更改 For 的起始值、終止值、與增減量:
要避免『起始值、終止值、與增減量』的錯亂!要避免『起始值、終止值、與增減量』的錯亂! • VB 會依照增減量的正負, 來決定計數器如何與終止值比對。當增減量為正值時, 計數器必須小於或等於終止值, 否則結束迴圈;當增減量為負值時, 則計數器必須大於或等於終止值, 否則結束迴圈:
要避免『起始值、終止值、與增減量』的錯亂!要避免『起始值、終止值、與增減量』的錯亂!
要避免『起始值、終止值、與增減量』的錯亂!要避免『起始值、終止值、與增減量』的錯亂!
要避免『起始值、終止值、與增減量』的錯亂!要避免『起始值、終止值、與增減量』的錯亂! • 如果將起始值、終止值、與增減量的關係弄錯了, 例如: • 由於增減量為負數, 因此執行迴圈的條件是『i >= 5』, 但一開始時 i 的值為 1,所以會因不符條件而立即結束迴圈, 結果連一次迴圈都沒執行到!所以當我們使用負的增減量時, 一定要特別小心。
指定增減量的 For-Next 迴圈 在表單中畫出用數字拼出來的沙漏形狀, 如下圖所示。
指定增減量的 For-Next 迴圈 所有的設定與上題相同, 只須將程式改為 2 個迴圈 (分別畫出上、下二個三角形), 並利用計數器 (i) 來算出每行要顯示幾個字元:
指定增減量的 For-Next 迴圈 • 在以上程式中, 計數器是用來代表每行要顯示多少個字元;但由於每行要顯示的數字不同, 因此我們還要利用計數器來算出每行要顯示的數字 (7→1→7), 算法為『CStr(i \ 4 + 1)』, 其中 \ 是整數除法(會捨去餘數), 而 CStr() 函式則可將數值轉換為字串。 • 在本例中請不要用 Str() 函式來將數值轉為字串, 因為 Str() 轉出來的正數都會在前面加一個空白字元, 例如 8 會轉為 " 8", 而 StrDup(i, "8") 則只會重複 " 8" 中的第一個空白字元。
選誰來當計數器? • 在前面畫沙漏的練習中, 我們是以『每行要顯示多少個字元』做為計數器(25→1, 5→25), 其實也可以改用『每行要顯示的數字』做為計數器 (7→1,2→7):
就地宣告計數器 • 到目前為止, 我們都是使用已宣告好的變數來做為 For-Next 的計數器, 其好處是在迴圈之外也可使用該變數, 例如:
就地宣告計數器 • 由上表可看出, 當迴圈執行 5 次之後, i 的值會再加 1 而變成 6, 此時就會因不符條件而結束迴圈, 然後執行迴圈後面的 MsgBox(i),結果輸出 6。
就地宣告計數器 • 不過, 通常我們並不需要在迴圈之外使用計數器, 此時就可直接在For-Next 中宣告計數器變數, 而不必事先用 Dim 宣告。例如:
就地宣告計數器 • 在 For-Next 中『就地宣告』的計數器變數, 只能在 For-Next 中使用, 在 For-Next 之外則無法存取。 • 而在不同 For-Next 中宣告的計數器變數, 彼此之間並不會有影響。
就地宣告計數器 • 但在For-Next 之外, 則不能再用 Dim 來重複宣告同名的變數, 例如:
就地宣告計數器 請使用 For-Next 就地宣告計數器的方式, 分別計算由 1 到 1000 之間,『3 的倍數的加總』與『7 的倍數的加總』, 並顯示結果如下:
7-2 While 與 Do-Loop:依條件執行的迴圈 • While 與 Do-Loop 都是利用『條件式』來決定要繼續迴圈或結束迴圈。While 的寫法比較簡單, 底下我們先來介紹。
While 迴圈 • While 迴圈是由 While 及 End While 所組成, 寫法如下:
While 迴圈 • 當條件式為 True 時, 就會繼續執行迴圈, 直到條件式變成 False 為止。 • 底下我們用 While 迴圈來模擬『For i = 1 To 10』的功能:
小心無窮迴圈! • 以上程式最容易漏寫的是第 4 行『i = i ?+ 1』(因為在 For-Next 敘述中, 每當執行到 Next 時計數器就會自動增減, 而不用我們寫程式來增減), 一旦忘了寫, 那麼 i 的值就不會改變 (永遠為 1), 因此 i <= 10 的條件也永遠為 True, 如此迴圈會不斷執行, 而造成『無窮迴圈』!
小心無窮迴圈! • 由此可知, 如果迴圈的次數固定, 那麼還是使用 For-Next 迴圈比較好, 即簡單又不容易出錯:
While 迴圈 請寫一個檢查登入帳號的程式, 除非使用者輸入 "Ken"、"Sue"、或"Joy", 否則就一直要求使用者重新輸入。
While 迴圈 • 請建立 Windows Form 應用程式專案 Ch07-03。 • step 2 在表單上雙按滑鼠, 撰寫以下 Load 事件程序:
While 迴圈 程式一開始會先宣告字串變數 id 並設定初值為 "na", 接著用 While迴圈來不斷要求使用者輸入, 只要使用者沒有輸入正確的帳號或空白 (按取消鈕也會傳回空白), 迴圈就會一直持續。 在迴圈結束之後, 則使用 If() 運算子來判斷 id 是否為空白 (空白表示取消輸入), 然後據以顯示不同的訊息。