slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
流程控制 ─ 重複執行同一段程式 PowerPoint Presentation
Download Presentation
流程控制 ─ 重複執行同一段程式

Loading in 2 Seconds...

play fullscreen
1 / 138

流程控制 ─ 重複執行同一段程式 - PowerPoint PPT Presentation


  • 88 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '流程控制 ─ 重複執行同一段程式' - eldon


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide2
本章重點提要
  • 7-1 For-Next:計次執行的迴圈
  • 7-2 While 與 Do-Loop:有條件執行的迴圈
  • 7-3 直接跳出迴圈的敘述
  • 7-4 巢狀迴圈
  • 7-5 Timer 控制項:定時執行程式
slide3
本章閱讀建議
  • 上一章我們介紹了 If、Select Case 等『選擇性執行』的流程控制, 本章則要介紹『迴圈』, 就是讓同一段程式不斷重複執行, 直到某些條件發生變化為止。這二種流程控制都非常重要, 如能善加應用, 就能寫出更多變化且條理分明的程式。
  • 迴圈的原理其實不難, 請讀者先看完底下的重點介紹, 然後再往下學習時就能事半功倍。
slide4
本章閱讀建議
  • 7-1 For-Next:計次執行的迴圈:最經典的例子就是由 1 加到 100, 若使用 For-Next 迴圈只需 3 行程式, 而不用真得去加 100 次!這就是迴圈的威力。
  • 7-2 While 與 Do-Loop:有條件執行的迴圈:如果迴圈的次數不一定, 那麼就可改用 While 或 Do-Loop 敘述, 以便依照特定條件來決定是否繼續迴圈。
slide5
本章閱讀建議
  • 7-3 直接跳出迴圈的敘述:在迴圈中可使用 Exit For、ExitWhile、Exit Do 等指令來直接跳出迴圈, 它們通常會搭配 If 來使用, 例如『If 某狀況發生 Then Exit For』。
  • 7-4 巢狀迴圈:迴圈中還有迴圈, 就形成巢狀迴圈。巢狀迴圈可以輕鬆處理像是『九九乘法表』之類, 看似複雜但又有規則可循的問題。
  • 7-5 Timer 控制項:定時執行程式:Timer 控制項可以定時觸發Tick 事件, 就好像時鐘會每秒鐘發出滴答聲 (Tick)一樣。最經典的例子是小時鐘程式, 因為我們可利用 Timer 控制項來每秒鐘更新一次時間。
7 1 for next
7-1 For-Next:計次執行的迴圈
  • 在寫程式時, 常常會遇到一些需要重複執行的動作, 此時如果知道要重複的次數, 那麼使用 For-Next 敘述最為方便。
for next
簡單型的 For-Next 迴圈
  • 在 For-Next 敘述中至少要包含『計數器』、『起始值』、與『終止值』, 例如底下由 1 加到 100 的範例:
for next1
簡單型的 For-Next 迴圈
  • For 後面要接一個計數器 (i), 其計數範圍是 1 到 100 (i = 1 To100)。當第一次執行迴圈時, 計數器的值會等於 1 (起始值), 然後每執行一次迴圈計數器就加 1, 如此重複執行到計數器等於 100(終止值), 然後結束迴圈, 繼續執行迴圈之後的程式。
for next3
簡單型的 For-Next 迴圈
  • 因此, 以上程式會執行 100 次迴圈, 第 1 圈時 (i=1) sum 會加 1, 第2 圈時 (i=2) sum 再加 2, 第 3 圈時 (i=3) sum 再加 3...:
for next4
簡單型的 For-Next 迴圈
  • 撰寫一個由 9 加到 999 的程式。
  • 請建立 Windows Form 應用程式專案 Ch07-01。
for next5
簡單型的 For-Next 迴圈
  • 用滑鼠雙按表單, 然後在 Form1 的 Load 事件程序中加入以下程式:
for next6
簡單型的 For-Next 迴圈
  • 請問前面的程式共會執行多少次迴圈?

999 - 9 + 1 = 991 次。

for next7
簡單型的 For-Next 迴圈
  • 請寫程式計算由 5 乘到 15 的結果。(注意, 5x6x7x...x15 結果會是一個非常大的數值!)
for next8
簡單型的 For-Next 迴圈
  • 以上我們宣告變數 m 來儲存相乘的結果, 但由於是計算乘法, 所以必須先將 m 的初值設為 1 (不指定初值時預設為 0, 而 0 乘任何數的結果仍為 0)。
  • 另外, 如果在迴圈中不斷進行累加或累乘, 則有可能在不知不覺中產生很大的數值!像本例的計算結果就超出了整數可表達的範圍(-2147483648 ~ 2147483647), 因此我們特別將 m 宣告為 Long 型別。
for next9
簡單型的 For-Next 迴圈
  • 如果是宣告為 Integer 型別, 那麼在執行時會出現如下的錯誤訊息:
for next10
指定增減量的 For-Next 迴圈
  • 在前面的範例中, 都是讓計數器每執行完一迴圈就加 1, 這是 For-Next 的預設狀況。但有時我們會希望計數器每迴圈能加 2, 例如計算連續偶數的累加;或是每迴圈能減 1, 例如由 100 加到 1, 這時就可用 Step 來指定計數器的『增減量』:
for next11
指定增減量的 For-Next 迴圈
  • 『增減量』就是用來控制每迴圈計數器要加多少或減多少, 如果起始值 < 終止值, 那麼增減量應為正值;反之,如果起始值 > 終止值(例如由 100 To 1), 那麼增減量應為負值。
for next12
指定增減量的 For-Next 迴圈
  • 在表單中畫出金字塔, 如下圖所示。
  • 請建立 Windows Form 應用程式專案 Ch07-02。
for next13
指定增減量的 For-Next 迴圈
  • 加入一個 Label 控制項, 並設定屬性如下:
for next14
指定增減量的 For-Next 迴圈
  • 在表單空白處雙按滑鼠, 然後在 Form1 的 Load 事件程序中加入以下程式:
for next15
指定增減量的 For-Next 迴圈

首先我們將 Label1 的 TextAlign (文字對齊) 屬性設為MiddleCenter (垂直水平均置中對齊), 然後利用迴圈來產生每一列所需的 $ 字串。

其中的 StrDup(n, s) 函式可以產生包含 n 個 s 的字串, 而 vbCrLf則為 VB 預先定義好的換行符號。

for next16
指定增減量的 For-Next 迴圈
  • 在 StrDup(n, s) 函式中, 若 s 包含 2 個以上的字元, 則只會取出第一個字元來重複 n 次, 例如 StrDup(3, "ab") 的傳回值為 "aaa"。
for next17
指定增減量的 For-Next 迴圈
  • 在表單中畫出倒三角形, 如下圖所示。
for next18
指定增減量的 For-Next 迴圈

所有的設定均與上題相同, 只須更改 For 的起始值、終止值、與增減量:

slide26
要避免『起始值、終止值、與增減量』的錯亂!要避免『起始值、終止值、與增減量』的錯亂!
  • VB 會依照增減量的正負, 來決定計數器如何與終止值比對。當增減量為正值時, 計數器必須小於或等於終止值, 否則結束迴圈;當增減量為負值時, 則計數器必須大於或等於終止值, 否則結束迴圈:
slide27
要避免『起始值、終止值、與增減量』的錯亂!要避免『起始值、終止值、與增減量』的錯亂!
slide28
要避免『起始值、終止值、與增減量』的錯亂!要避免『起始值、終止值、與增減量』的錯亂!
slide29
要避免『起始值、終止值、與增減量』的錯亂!要避免『起始值、終止值、與增減量』的錯亂!
  • 如果將起始值、終止值、與增減量的關係弄錯了, 例如:
  • 由於增減量為負數, 因此執行迴圈的條件是『i >= 5』, 但一開始時 i 的值為 1,所以會因不符條件而立即結束迴圈, 結果連一次迴圈都沒執行到!所以當我們使用負的增減量時, 一定要特別小心。
for next19
指定增減量的 For-Next 迴圈
  • 在表單中畫出用數字拼出來的沙漏形狀, 如下圖所示。
for next20
指定增減量的 For-Next 迴圈

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

for next21
指定增減量的 For-Next 迴圈

在以上程式中, 計數器是用來代表每行要顯示多少個字元;但由於每行要顯示的數字不同, 因此我們還要利用計數器來算出每行要顯示的數字 (7→1→7), 算法為『CStr(i \ 4 + 1)』, 其中 \ 是整數除法(會捨去餘數), 而 CStr() 函式則可將數值轉換為字串。

在本例中請不要用 Str() 函式來將數值轉為字串, 因為 Str() 轉出來的正數都會在前面加一個空白字元, 例如 8 會轉為 " 8", 而 StrDup(i, "8") 則只會重複 " 8" 中的第一個空白字元。

slide33
選誰來當計數器?
  • 在前面畫沙漏的練習中, 我們是以『每行要顯示多少個字元』做為計數器(25→1, 5→25), 其實也可以改用『每行要顯示的數字』做為計數器 (7→1,2→7):
slide35
就地宣告計數器
  • 到目前為止, 我們都是使用已宣告好的變數來做為 For-Next 的計數器, 其好處是在迴圈之外也可使用該變數, 例如:
slide37
就地宣告計數器
  • 由上表可看出, 當迴圈執行 5 次之後, i 的值會再加 1 而變成 6, 此時就會因不符條件而結束迴圈, 然後執行迴圈後面的 MsgBox(i),結果輸出 6。
slide38
就地宣告計數器
  • 不過, 通常我們並不需要在迴圈之外使用計數器, 此時就可直接在For-Next 中宣告計數器變數, 而不必事先用 Dim 宣告。例如:
slide39
就地宣告計數器
  • 在 For-Next 中『就地宣告』的計數器變數, 只能在 For-Next 中使用, 在 For-Next 之外則無法存取。
  • 而在不同 For-Next 中宣告的計數器變數, 彼此之間並不會有影響。
slide40
就地宣告計數器
  • 但在For-Next 之外, 則不能再用 Dim 來重複宣告同名的變數, 例如:
slide41
就地宣告計數器
  • 請使用 For-Next 就地宣告計數器的方式, 分別計算由 1 到 1000 之間,『3 的倍數的加總』與『7 的倍數的加總』, 並顯示結果如下:
7 2 while do loop
7-2 While 與 Do-Loop:有條件執行的迴圈
  • While 與 Do-Loop 都是利用『條件式』來決定要繼續迴圈或結束迴圈。While 的寫法比較簡單, 底下我們先來介紹。
while
While 迴圈
  • While 迴圈是由 While 及 End While 所組成, 寫法如下:
while1
While 迴圈
  • 當條件式為 True 時, 就會繼續執行迴圈, 直到條件式變成 False 為止。
  • 底下我們用 While 迴圈來模擬『For i = 1 To 10』的功能:
slide46
小心無窮迴圈!
  • 以上程式最容易漏寫的是第 4 行『i = i ?+ 1』(因為在 For-Next 敘述中, 每當執行到 Next 時計數器就會自動增減, 而不用我們寫程式來增減), 一旦忘了寫, 那麼 i 的值就不會改變 (永遠為 1), 因此 i <= 10 的條件也永遠為 True, 如此迴圈會不斷執行, 而造成『無窮迴圈』!
slide47
小心無窮迴圈!
  • 由此可知, 如果迴圈的次數固定, 那麼還是使用 For-Next 迴圈比較好, 即簡單又不容易出錯:
while2
While 迴圈
  • 請寫一個檢查登入帳號的程式, 除非使用者輸入 "Ken"、"Sue"、或"Joy", 否則就一直要求使用者重新輸入。
while3
While 迴圈
  • 請建立 Windows Form 應用程式專案 Ch07-03。
  • step 2 在表單上雙按滑鼠, 撰寫以下 Load 事件程序:
while4
While 迴圈

程式一開始會先宣告字串變數 id 並設定初值為 "na", 接著用 While迴圈來不斷要求使用者輸入, 只要使用者沒有輸入正確的帳號或空白 (按取消鈕也會傳回空白), 迴圈就會一直持續。

在迴圈結束之後, 則使用 If() 運算子來判斷 id 是否為空白 (空白表示取消輸入), 然後據以顯示不同的訊息。

while5
While 迴圈
  • 修改前面程式 (或開啟範例專案 Ch07-03ok), 當使用者輸入錯誤超過 3 次, 即結束程式。
while6
While 迴圈

我們在程式中多加了一個 cnt 來計算次數, cnt 預設為 0, 使用者每輸入一次就將 cnt 加 1。當 cnt 到達 3 次時, 就強制將 id 設為空白, 如此便可結束迴圈並顯示 "再見!"。

do loop
Do-Loop 迴圈
  • Do-Loop 的功能和 While 類似, 但在寫法上更有彈性, 可分為下面 3 種:
    • 沒有條件式的迴圈
    • 先判斷條件再執行迴圈
    • 先執行迴圈, 再判斷條件
slide55
沒有條件式的迴圈
  • 這是最陽春的 Do-Loop 迴圈, 由於沒有條件限制, 因此會不斷地執行迴圈, 而變成『無窮迴圈』!效果相當於 While 迴圈:
  • 我們有時也會使用到『無窮迴圈』, 但一定會在迴圈中搭配 Exit Do 或 Exit While 來跳離迴圈。
slide56
先判斷條件再執行迴圈
  • 這種寫法的效果和 While 迴圈相同:
slide57
先判斷條件再執行迴圈
  • 不過請注意, Do While 的『While』(當...) 還可變形為『Until』(直到...), 二者的意義恰好相反:
slide58
先判斷條件再執行迴圈
  • 舉例來說, 底下二段程式的執行結果完全相同 (都會顯示 15):
slide60
先執行迴圈, 再判斷條件
  • 有時我們會希望先執行一次迴圈, 然後才判斷條件, 看要不要繼續下一迴圈。此時可將 While (或 Until) 放在 Loop 之後:
slide62
先執行迴圈, 再判斷條件
  • 例如前面檢查登入帳號的程式, 就有這種需要:
slide63
先執行迴圈, 再判斷條件
  • 以上程式雖然可以正常運作, 但若改成下面的寫法, 將更能符合邏輯:
slide64
先執行迴圈, 再判斷條件
  • 當然, 您也可以將 Loop While改成相反的 Loop Until 寫法, 雖然邏輯不同, 但結果是一樣的:
slide65
先執行迴圈, 再判斷條件
  • 以上 Loop While 與 Loop Until 的條件式剛好相反。不過要注意,當條件式相反時, And 會變成 Or 喔!反之亦然。例如:
while until
即然有 While 了, 為什麼還要 Until 呢?
  • Do-Loop 的 While 和 Until 其實只需要一種就夠用了, 為什麼要設計二種呢?
  • 這就是 VB 體貼初學者的地方, 因為有些情況適合 Until, 有些情況則適合 While,若硬要轉換則容易頭腦打結!就以前面檢查帳號的範例 (Ch07-03) 來說, 題目是這樣出的:
while until1
即然有 While 了, 為什麼還要 Until 呢?
  • 『除非使用者輸入 "Ken"、"Sue"、或"Joy", 否則就一直要求使用者重新輸入。』
  • 此時就適合使用 Until 的邏輯:
do loop1
Do-Loop 迴圈
  • 寫一程式來展示『蟑螂爬行的英姿』, 如下圖所示:
do loop3
Do-Loop 迴圈
  • 請建立 Windows Form 應用程式專案Ch07-04。
  • 在表單中加入一個 Button ( 更名為 play) 及 PictureBox( 更名為 roach) 控制項, 並設定如下:
do loop5
Do-Loop 迴圈
  • 雙按 play 按鈕, 建立 play.Click 事件程序:
do loop6
Do-Loop 迴圈

我們先將 roach 控制項 (以下簡稱蟑螂) 設為隱藏, 這樣無論使用者如何放大視窗, 蟑螂在尚未播放時都不會被看到。另外, 我們在play 按鈕上也顯示蟑螂圖片 (以圖片靠左、文字靠右的方式), 由於『蟑螂.gif』是動畫圖片, 因此按鈕上的蟑螂是會動的喔!

do loop7
Do-Loop 迴圈

當使用者按下 play 按鈕時, 程式會先將按鈕隱藏起來, 然後把蟑螂搬移到左邊界之外, 並設為可看見。接著就進入迴圈, 讓蟑螂不斷向右爬, 直到爬出右邊界為止;最後則將蟑螂隱藏起來, 然後再讓按鈕顯示出來。

do loop8
Do-Loop 迴圈

控制項的 Left、Top 屬性就是其左上角的 x、y 座標, 意義和Location 的 x、y 子屬性 (在 4-2 節介紹過) 相同, 但 Left、Top 只能用程式存取 (在屬性窗格中找不到), 並且可以直接設定而不用先建立 Point 物件。

do loop9
Do-Loop 迴圈

程式一開始會將蟑螂的 Left 屬性設為『0 - roach.Size.Width』, 由於蟑螂的寬度為 44, 因此 Left 會變成 -44, 也就是在表單左邊界再往左 44 點的地方。至於爬行的終點, 則是當 Left 超過表單的右邊界時:

do loop10
Do-Loop 迴圈

在爬行的過程中, 每一迴圈都將蟑螂的 Left 屬性加 1, 因此蟑螂會往右爬一點。但由於程式執行的速度太快, 還沒看清楚就爬完了!所以必須讓蟑螂每爬一步就休息一下, 方法如下:

do loop11
Do-Loop 迴圈

以上二行都是 .NET Framework 的功能, 我們可以直接拿來使用。如果想讓蟑螂爬慢一點, 則可讓蟑螂多休息一下, 例如將參數 1 改為 3, 則每爬一次就休息 3/1000 秒。

do loop12
Do-Loop 迴圈
  • 接續前例 (或開啟範例專案 Ch07-04ok), 將程式改為『Do...LoopUntil』的寫法, 並想辦法讓蟑螂在爬行時會上下晃動, 而非一直線呆板地前進, 以提高真實感。
do loop13
Do-Loop 迴圈
  • 我們可以讓蟑螂每爬 10 步, 就隨機產生一個介於 -3 到 3 的亂數, 來改變蟑螂的 y 座標 (Top 屬性), 讓蟑螂可能往上 1~3 點、不動、或往下移動 1~3 點。產生亂數的公式為:
do loop14
Do-Loop 迴圈
  • 如果想取得介於 A 到 B 之間的隨機整數, 則公式為:CInt(Int((B - A + 1) * Rnd() + A))。
slide83
7-3 直接跳出迴圈的敘述
  • 無論是 For、While、或 Do 迴圈, 都可用對應的 Exit For、ExitWhile、或 Exit Do 來直接跳出迴圈, 例如:
slide84
直接跳出迴圈的敘述
  • 請寫一程式, 可計算指定範圍內所有整數的乘積 (相乘的結果), 但在計算過程中如果乘積大於一億, 就停止計算並顯示訊息:
slide85
直接跳出迴圈的敘述
  • 請開啟範例專案 Ch07-05, 我們已準備好所需的控制項:
slide86
直接跳出迴圈的敘述
  • 在 上雙按, 建立『計算.Click』事件程序如下:
slide87
直接跳出迴圈的敘述

由於 100000000 (一億) 太長了容易寫錯, 所以我們改用比較易讀的 10 ^ 8 來表示, 這二種寫法的執行結果與執行效率完全相同。另外, Format() 函式可將資料格式化:

slide88
直接跳出迴圈的敘述
  • ”#”代表要顯示一個 0~9 的數字, 但若該位置沒有數字則不顯示;"0" 的意義和 "#" 相同, 但若該位置沒有數字則顯示 0, 例如Format(2, "00") 會傳回 "02"。在數字之間加逗號, 則表示格式化數字時要加千位符號。
slide89
在 For 迴圈中, 可以自行更改計數器的值嗎?
  • 在 For 迴圈中, 我們也可以自行更改計數器的值。例如:
slide90
在 For 迴圈中, 可以自行更改計數器的值嗎?
  • 以上迴圈只會執行一次!因為當執行完第一圈時, i 的值已經是 100 了, 在進入一下迴圈之前會先加 1 而變成 101, 此時由於已超過終止值 100, 所以會立即結束迴圈。
  • 我們雖然可以任意更改計數器的值, 甚至利用這種方法來跳離迴圈, 但由於可讀性較差, 又容易出錯, 因此最好盡量少用這種寫法。
slide91
直接跳出迴圈的敘述
  • 接續前例 (或開啟範例專案 Ch07-05ok), 請修改程式為只計算偶數的乘積。
continue
跳過本次迴圈:Continue ...
  • VB 除了 Exit 外, 還提供了 Continue 指令, 如果想要跳過本次迴圈中尚未執行的敘述, 而直接開始下一迴圈, 則可使用 Continue For、Continue While、或 ContinueDo 指令。例如:
continue1
跳過本次迴圈:Continue ...
  • 例如當我們只要處理偶數時, 即可用 Continue 來略過奇數值:
  • 一般來說, 使用 If...Then... 就可以達到 Continue 的功能, 因此讀者只要知道有這個指令就好, 倒不必用它來增加程式的複雜度。
slide95
7-4 巢狀迴圈
  • 上一章我們介紹過巢狀的 If 結構, 就是在 If...End If 之內還可以有If...End If。其實不管是 If、For-Next、或是 While、Do-Loop 等,彼此之間都可以相互形成巢狀結構, 而且沒有層數的限制。例如:
slide96
巢狀迴圈
  • 請繪製以數字排出的三角形, 如下圖所示:
slide97
巢狀迴圈
  • 請開啟範例專案 Ch07-06 , 我們已加入 Label 控制項並設好相關屬性:
slide98
巢狀迴圈
  • 在表單空白處雙按滑鼠, 然後在表單的 Load 事件程序中加入以下程式:
slide99
巢狀迴圈

在巢狀的 For-Next 結構中, 內圈的迴圈次數常會隨著外圈的計數器而變化。以本例來說, 外圈的 i 是代表目前顯示三角形的是第幾層 (共有 1~9 層), 而內圈就是要實地跑 i 次以串接出 1~i 的字串,例如在第 3 層時, 內圈就要跑 3 次以組出 "123" 的字串。

slide101
巢狀迴圈
  • 將前面程式 (可開啟 Ch07-06ok 來使用) 改為畫出 10 層的倒三角形, 且最下的數字為 0。另外, 請讓程式在執行第一次迴圈時不要串接換行符號, 如下圖所示。
slide103
巢狀迴圈
  • 繪出九九乘法表, 如下圖所示:
slide104
巢狀迴圈
  • 建立 Windows Form 應用程式專案Ch07-07。
  • 在表單中加入 Label 控制項, 並如下設定:
slide105
巢狀迴圈
  • 在表單空白處雙按滑鼠, 撰寫表單 Load 事件程序:
slide106
巢狀迴圈

外圈的 i 代表左乘數, 內圈的 j 則為右乘數 (即 i x j)。外圈每跑一次, 內圈就會跑 9 次, 因而產生 9 個乘項;例如在顯示第 3 排(i=3) 時, 內圈會跑 9 次而產生 “3x1= 3 3x2= 6 3x3=9... 3x9=27”等 9 個乘項。

slide107
巢狀迴圈

這個程式比較要注意的是『上下對齊』的問題:

  • 有些乘積為個位數, 有些則為二位數, 因此如果是個位數則要在前面多加一個空白, 以便和二位數的乘積對齊。
  • Label 控制項的字型預設為『新細明體』, 這是一種非固定寬度的字型, 也就是每個字母的寬度可能不同, 例如 "W" 會比 "i" 寬很多, 另外還會壓縮空白字元, 以增加美觀性:
slide108
巢狀迴圈

為了達到上下對齊的效果, 我們必須選用『固定寬度的字型』才行, 例如『細明體』。

slide109
巢狀迴圈
  • 接續前例 (或開啟 Ch07-07ok), 為了讓比較小的小朋友背誦, 請將九九乘法表轉正, 並讓乘積大於 30 的乘項不要顯示出來, 如下圖所示:
slide110
巢狀迴圈

先將 Label1 的 TextAlign 屬性改為 MiddleLeft (垂直置中、水平靠左對齊), 然後把迴圈內『i & "x" & j』對調為『j & "x" & i』, 最後再加一行程式 (下面灰底的敘述) 即可

7 5 timer
7-5 Timer 控制項:定時執行程式
  • Timer 控制項就像計時器一樣, 可以每隔固定的時間就引發 Tick(滴答聲) 事件, 例如我們設定 2 秒滴答一次, 那麼每 2 秒就會執行Tick 事件程序一次。使用 Timer 控制項的流程如下:
  • 將 加到表單中:
timer1
Timer 控制項:定時執行程式
  • 在 Timer 控制項的Interval 屬性設定 Tick 的時間間隔( 單位是毫秒, 即千分之一秒), 並將 Enabled屬性設為 True 來開啟定時功能。
timer2
Timer 控制項:定時執行程式
  • 撰寫 Timer 控制項的 Tick 事件程序 ( 雙按 Timer 控制項即可自動加入以下的程式):
timer3
Timer 控制項:定時執行程式
  • 製作一個電子時鐘, 如下圖所示:
  • 請建立 Windows Form 應用程式專案 Ch07-08。
timer4
Timer 控制項:定時執行程式
  • 在表單中加入一個 Label 及一個 Timer 控制項, 並如下設定:
timer6
Timer 控制項:定時執行程式
  • 在 Timer1 上雙按滑鼠, 然後建立 Timer1.Tick 事件程序:
timer7
Timer 控制項:定時執行程式
  • 按[F5] 鍵測試看看:
timer8
Timer 控制項:定時執行程式
  • 在程式視窗上方分別選取 及

,然後輸入 Form1 的 Load 事件程序, 讓程式一開始執行就更新一次時間:

timer9
Timer 控制項:定時執行程式
  • 接續前例 (或開啟 Ch07-08ok), 繼續加入以下功能:
timer10
Timer 控制項:定時執行程式

請先在表單中加入 2 個 CheckBox 控制項, 並如下設定:

timer12
Timer 控制項:定時執行程式
  • 利用 Timer 控制項製作『會反彈的足球』。
timer13
Timer 控制項:定時執行程式
  • 請建立 Windows Form 應用程式專案 Ch07-09。
  • 在表單中加入一個 PictureBox 及一個 Timer 控制項, 並如下設定:
timer15
Timer 控制項:定時執行程式
  • 在 Timer1 上雙按滑鼠, 建立 Timer1.Tick 事件程序:
timer17
Timer 控制項:定時執行程式

先我們在事件程序的外面宣告X位移與Y位移變數, 讓變數的值可以一直保存著 (直到表單關閉), 不會因事件程序的結束而消失。

接著在每 0.001 秒就執行一次的 Timer1.Tick 事件程序中, 將足球往水平及垂直方向各移動 1 點, 並檢查足球是否已到達視窗的邊界:如果到達左或右邊界, 就反轉X位移變數;如果到達上或下邊界, 則反轉Y位移變數。

timer19
Timer 控制項:定時執行程式
  • 接續前例 (或開啟 Ch07-09ok), 在表單右下角加入 3 個 Label 控制項, 並分別取名為快、慢、及速度表, 其功能與設定如下:
timer20
Timer 控制項:定時執行程式
  • 如果要減慢足球的速度, 只要增加 Timer1 的 Interval 屬性即可 ( 例如每次增加 20 毫秒);但若要加快足球的速度, 由於Interval 最小值為 1, 而且不可是小數, 因此必須改用『增加移動量』的辦法:
timer22
Timer 控制項:定時執行程式
  • 接著撰寫快及慢的 Click 事件程序。由於我們同時使用『Timer1.Interval 屬性』及『N變數』來控制速度, 所以必須同時考慮這二個因素, 例如先減慢一次 ( 將 Interval 加 20) 之後再加快, 則只須還原減慢的效果即可 ( 將Interval減 20), 而不必增加N。
timer24
Timer 控制項:定時執行程式
  • 在設計視窗中雙按足球, 輸入 ball.Click 事件程序:
  • 在執行時, 控制項如果重疊在一起, 則後加入的控制項會在上層 ( 越晚加入的控制項會在越上層):
timer25
Timer 控制項:定時執行程式

我們希望足球可以在上面, 因此請到設計視窗中如下操作: