1 / 138

流程控制 ─ 重複執行同一段程式

第 7 章. 流程控制 ─ 重複執行同一段程式. 本章重點提要. 7-1 For-Next:計次執行的迴圈 7-2 While 與 Do-Loop:有條件執行的迴圈 7-3 直接跳出迴圈的敘述 7-4 巢狀迴圈 7-5 Timer 控制項:定時執行程式. 本章閱讀建議. 上一章我們介紹了 If 、 Select Case 等 『 選擇性執行 』 的流程控制 , 本章則要介紹 『 迴圈 』, 就是讓同一段程式不斷重複執行 , 直到某些條件發生變化為止。這二種流程控制都非常重要 , 如能善加應用 , 就能寫出更多變化且條理分明的程式。

eldon
Download Presentation

流程控制 ─ 重複執行同一段程式

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第 7 章 流程控制 ─重複執行同一段程式

  2. 本章重點提要 • 7-1 For-Next:計次執行的迴圈 • 7-2 While 與 Do-Loop:有條件執行的迴圈 • 7-3 直接跳出迴圈的敘述 • 7-4 巢狀迴圈 • 7-5 Timer 控制項:定時執行程式

  3. 本章閱讀建議 • 上一章我們介紹了 If、Select Case 等『選擇性執行』的流程控制, 本章則要介紹『迴圈』, 就是讓同一段程式不斷重複執行, 直到某些條件發生變化為止。這二種流程控制都非常重要, 如能善加應用, 就能寫出更多變化且條理分明的程式。 • 迴圈的原理其實不難, 請讀者先看完底下的重點介紹, 然後再往下學習時就能事半功倍。

  4. 本章閱讀建議 • 7-1 For-Next:計次執行的迴圈:最經典的例子就是由 1 加到 100, 若使用 For-Next 迴圈只需 3 行程式, 而不用真得去加 100 次!這就是迴圈的威力。 • 7-2 While 與 Do-Loop:有條件執行的迴圈:如果迴圈的次數不一定, 那麼就可改用 While 或 Do-Loop 敘述, 以便依照特定條件來決定是否繼續迴圈。

  5. 本章閱讀建議 • 7-3 直接跳出迴圈的敘述:在迴圈中可使用 Exit For、ExitWhile、Exit Do 等指令來直接跳出迴圈, 它們通常會搭配 If 來使用, 例如『If 某狀況發生 Then Exit For』。 • 7-4 巢狀迴圈:迴圈中還有迴圈, 就形成巢狀迴圈。巢狀迴圈可以輕鬆處理像是『九九乘法表』之類, 看似複雜但又有規則可循的問題。 • 7-5 Timer 控制項:定時執行程式:Timer 控制項可以定時觸發Tick 事件, 就好像時鐘會每秒鐘發出滴答聲 (Tick)一樣。最經典的例子是小時鐘程式, 因為我們可利用 Timer 控制項來每秒鐘更新一次時間。

  6. 7-1 For-Next:計次執行的迴圈 • 在寫程式時, 常常會遇到一些需要重複執行的動作, 此時如果知道要重複的次數, 那麼使用 For-Next 敘述最為方便。

  7. 簡單型的 For-Next 迴圈 • 在 For-Next 敘述中至少要包含『計數器』、『起始值』、與『終止值』, 例如底下由 1 加到 100 的範例:

  8. 簡單型的 For-Next 迴圈 • For 後面要接一個計數器 (i), 其計數範圍是 1 到 100 (i = 1 To100)。當第一次執行迴圈時, 計數器的值會等於 1 (起始值), 然後每執行一次迴圈計數器就加 1, 如此重複執行到計數器等於 100(終止值), 然後結束迴圈, 繼續執行迴圈之後的程式。

  9. 簡單型的 For-Next 迴圈

  10. 簡單型的 For-Next 迴圈 • 因此, 以上程式會執行 100 次迴圈, 第 1 圈時 (i=1) sum 會加 1, 第2 圈時 (i=2) sum 再加 2, 第 3 圈時 (i=3) sum 再加 3...:

  11. 簡單型的 For-Next 迴圈 • 撰寫一個由 9 加到 999 的程式。 • 請建立 Windows Form 應用程式專案 Ch07-01。

  12. 簡單型的 For-Next 迴圈 • 用滑鼠雙按表單, 然後在 Form1 的 Load 事件程序中加入以下程式:

  13. 簡單型的 For-Next 迴圈 • 請問前面的程式共會執行多少次迴圈? 999 - 9 + 1 = 991 次。

  14. 簡單型的 For-Next 迴圈 • 請寫程式計算由 5 乘到 15 的結果。(注意, 5x6x7x...x15 結果會是一個非常大的數值!)

  15. 簡單型的 For-Next 迴圈 • 以上我們宣告變數 m 來儲存相乘的結果, 但由於是計算乘法, 所以必須先將 m 的初值設為 1 (不指定初值時預設為 0, 而 0 乘任何數的結果仍為 0)。 • 另外, 如果在迴圈中不斷進行累加或累乘, 則有可能在不知不覺中產生很大的數值!像本例的計算結果就超出了整數可表達的範圍(-2147483648 ~ 2147483647), 因此我們特別將 m 宣告為 Long 型別。

  16. 簡單型的 For-Next 迴圈 • 如果是宣告為 Integer 型別, 那麼在執行時會出現如下的錯誤訊息:

  17. 指定增減量的 For-Next 迴圈 • 在前面的範例中, 都是讓計數器每執行完一迴圈就加 1, 這是 For-Next 的預設狀況。但有時我們會希望計數器每迴圈能加 2, 例如計算連續偶數的累加;或是每迴圈能減 1, 例如由 100 加到 1, 這時就可用 Step 來指定計數器的『增減量』:

  18. 指定增減量的 For-Next 迴圈 • 『增減量』就是用來控制每迴圈計數器要加多少或減多少, 如果起始值 < 終止值, 那麼增減量應為正值;反之,如果起始值 > 終止值(例如由 100 To 1), 那麼增減量應為負值。

  19. 指定增減量的 For-Next 迴圈 • 在表單中畫出金字塔, 如下圖所示。 • 請建立 Windows Form 應用程式專案 Ch07-02。

  20. 指定增減量的 For-Next 迴圈 • 加入一個 Label 控制項, 並設定屬性如下:

  21. 指定增減量的 For-Next 迴圈 • 在表單空白處雙按滑鼠, 然後在 Form1 的 Load 事件程序中加入以下程式:

  22. 指定增減量的 For-Next 迴圈 首先我們將 Label1 的 TextAlign (文字對齊) 屬性設為MiddleCenter (垂直水平均置中對齊), 然後利用迴圈來產生每一列所需的 $ 字串。 其中的 StrDup(n, s) 函式可以產生包含 n 個 s 的字串, 而 vbCrLf則為 VB 預先定義好的換行符號。

  23. 指定增減量的 For-Next 迴圈 • 在 StrDup(n, s) 函式中, 若 s 包含 2 個以上的字元, 則只會取出第一個字元來重複 n 次, 例如 StrDup(3, "ab") 的傳回值為 "aaa"。

  24. 指定增減量的 For-Next 迴圈 • 在表單中畫出倒三角形, 如下圖所示。

  25. 指定增減量的 For-Next 迴圈 所有的設定均與上題相同, 只須更改 For 的起始值、終止值、與增減量:

  26. 要避免『起始值、終止值、與增減量』的錯亂!要避免『起始值、終止值、與增減量』的錯亂! • VB 會依照增減量的正負, 來決定計數器如何與終止值比對。當增減量為正值時, 計數器必須小於或等於終止值, 否則結束迴圈;當增減量為負值時, 則計數器必須大於或等於終止值, 否則結束迴圈:

  27. 要避免『起始值、終止值、與增減量』的錯亂!要避免『起始值、終止值、與增減量』的錯亂!

  28. 要避免『起始值、終止值、與增減量』的錯亂!要避免『起始值、終止值、與增減量』的錯亂!

  29. 要避免『起始值、終止值、與增減量』的錯亂!要避免『起始值、終止值、與增減量』的錯亂! • 如果將起始值、終止值、與增減量的關係弄錯了, 例如: • 由於增減量為負數, 因此執行迴圈的條件是『i >= 5』, 但一開始時 i 的值為 1,所以會因不符條件而立即結束迴圈, 結果連一次迴圈都沒執行到!所以當我們使用負的增減量時, 一定要特別小心。

  30. 指定增減量的 For-Next 迴圈 • 在表單中畫出用數字拼出來的沙漏形狀, 如下圖所示。

  31. 指定增減量的 For-Next 迴圈 所有的設定與上題相同, 只須將程式改為 2 個迴圈 (分別畫出上、下二個三角形), 並利用計數器 (i) 來算出每行要顯示幾個字元:

  32. 指定增減量的 For-Next 迴圈 在以上程式中, 計數器是用來代表每行要顯示多少個字元;但由於每行要顯示的數字不同, 因此我們還要利用計數器來算出每行要顯示的數字 (7→1→7), 算法為『CStr(i \ 4 + 1)』, 其中 \ 是整數除法(會捨去餘數), 而 CStr() 函式則可將數值轉換為字串。 在本例中請不要用 Str() 函式來將數值轉為字串, 因為 Str() 轉出來的正數都會在前面加一個空白字元, 例如 8 會轉為 " 8", 而 StrDup(i, "8") 則只會重複 " 8" 中的第一個空白字元。

  33. 選誰來當計數器? • 在前面畫沙漏的練習中, 我們是以『每行要顯示多少個字元』做為計數器(25→1, 5→25), 其實也可以改用『每行要顯示的數字』做為計數器 (7→1,2→7):

  34. 選誰來當計數器?

  35. 就地宣告計數器 • 到目前為止, 我們都是使用已宣告好的變數來做為 For-Next 的計數器, 其好處是在迴圈之外也可使用該變數, 例如:

  36. 就地宣告計數器

  37. 就地宣告計數器 • 由上表可看出, 當迴圈執行 5 次之後, i 的值會再加 1 而變成 6, 此時就會因不符條件而結束迴圈, 然後執行迴圈後面的 MsgBox(i),結果輸出 6。

  38. 就地宣告計數器 • 不過, 通常我們並不需要在迴圈之外使用計數器, 此時就可直接在For-Next 中宣告計數器變數, 而不必事先用 Dim 宣告。例如:

  39. 就地宣告計數器 • 在 For-Next 中『就地宣告』的計數器變數, 只能在 For-Next 中使用, 在 For-Next 之外則無法存取。 • 而在不同 For-Next 中宣告的計數器變數, 彼此之間並不會有影響。

  40. 就地宣告計數器 • 但在For-Next 之外, 則不能再用 Dim 來重複宣告同名的變數, 例如:

  41. 就地宣告計數器 • 請使用 For-Next 就地宣告計數器的方式, 分別計算由 1 到 1000 之間,『3 的倍數的加總』與『7 的倍數的加總』, 並顯示結果如下:

  42. 就地宣告計數器

  43. 7-2 While 與 Do-Loop:有條件執行的迴圈 • While 與 Do-Loop 都是利用『條件式』來決定要繼續迴圈或結束迴圈。While 的寫法比較簡單, 底下我們先來介紹。

  44. While 迴圈 • While 迴圈是由 While 及 End While 所組成, 寫法如下:

  45. While 迴圈 • 當條件式為 True 時, 就會繼續執行迴圈, 直到條件式變成 False 為止。 • 底下我們用 While 迴圈來模擬『For i = 1 To 10』的功能:

  46. 小心無窮迴圈! • 以上程式最容易漏寫的是第 4 行『i = i ?+ 1』(因為在 For-Next 敘述中, 每當執行到 Next 時計數器就會自動增減, 而不用我們寫程式來增減), 一旦忘了寫, 那麼 i 的值就不會改變 (永遠為 1), 因此 i <= 10 的條件也永遠為 True, 如此迴圈會不斷執行, 而造成『無窮迴圈』!

  47. 小心無窮迴圈! • 由此可知, 如果迴圈的次數固定, 那麼還是使用 For-Next 迴圈比較好, 即簡單又不容易出錯:

  48. While 迴圈 • 請寫一個檢查登入帳號的程式, 除非使用者輸入 "Ken"、"Sue"、或"Joy", 否則就一直要求使用者重新輸入。

  49. While 迴圈 • 請建立 Windows Form 應用程式專案 Ch07-03。 • step 2 在表單上雙按滑鼠, 撰寫以下 Load 事件程序:

  50. While 迴圈 程式一開始會先宣告字串變數 id 並設定初值為 "na", 接著用 While迴圈來不斷要求使用者輸入, 只要使用者沒有輸入正確的帳號或空白 (按取消鈕也會傳回空白), 迴圈就會一直持續。 在迴圈結束之後, 則使用 If() 運算子來判斷 id 是否為空白 (空白表示取消輸入), 然後據以顯示不同的訊息。

More Related