Do-Loop迴圈
Do-Loop為最基本結構的迴圈,用途廣泛,可任意取代While、For。是個結構明確,易懂易改的迴圈敘述。
凡是迴圈都是由「繞行迴圈」及「脫離迴圈或繼續執行的條件式」兩種敘述所組成的,以While-Wend為例:
While 條件式 ‘←脫離迴圈或繼續執行的條件式敘述
敘述區塊
Wend ‘←回到開頭While的繞行迴圈敘述
以For-Next為例:
For 計次變數 = 起始值 To 終止值 (Step 步進值) ‘←脫離迴圈或繼續執行的條件式敘述,判斷計次變數是否介於起始值和終止值之間
敘述區塊
Next (計次變數) ‘←回到開頭For的繞行迴圈敘述
繞行迴圈敘述的功用其實就類似GoTo,可以跳到迴圈的前頭。而脫離迴圈或繼續執行的條件式如果為True或False,則會繼續迴圈或是結束迴圈。了解這些迴圈結構後,我們來看看Do-Loop的基本結構吧!
最陽春的Do-Loop迴圈,事實上不包含「脫離迴圈或繼續執行的條件式」,結構如下:
Do
敘述區塊
Loop ‘←繞行迴圈敘述,回到開頭Do的位置
沒有脫離迴圈或繼續執行的條件式,那不就無法結束迴圈的嗎?是的,如此一來,Do-Loop迴圈確實成了永遠無法終止的無窮迴圈。因此,為了讓Do-Loop能夠結束迴圈,須加上While或是Until兩種敘述來當作脫離迴圈或繼續執行的條件判斷式。而其中While表示「只要…,就…」,也就是While後的判斷式成立,為True,便繼續執行Do-Loop迴圈;Until則表示「做…,直到…」,也就是Until後的判斷式成立,為True,便立刻跳出Do-Loop迴圈。While和Until放置的位置,與執行結果也會有很大的關係,千萬不能搞錯。
While
格式一:
Do While 條件式
敘述區塊
Loop
這種格式會在執行Do迴圈時,判斷While條件式是否為True,若為True,則繼續執行Do-Loop迴圈的敘述區塊;反之,則立刻跳出。
格式二:
Do
敘述區塊
Loop While 條件式
這種格式會在執行完Do迴圈時,判斷While條件式是否為True,若為True,則回到Do開頭的地方繼續執行Do-Loop迴圈的敘述區塊;反之,則立刻跳出。
以上Do-While-Loop和Do-Loop-While究竟差在哪?Do-While-Loop是先判斷再執行迴圈;Do-Loop-While是先執行迴圈再判斷,所以可以確定迴圈至少執行過一次。是比較下面程式碼的差異:
Do-While-Loop
1 2 3 4 5 6 7 8 |
Private Sub Do_While_Loop() Dim X As Integer X = 0 Do While X < 0 X = X + 1 Loop Print X End Sub |
Do-Loop-While
1 2 3 4 5 6 7 8 |
Private Sub Do_Loop_While() Dim X As Integer X = 0 Do X = X + 1 Loop While X < 0 Print X End Sub |
你猜?上面程式碼Do迴圈執行完後,X的值會為多少,會一樣嗎?結果證明,前者結果為0,後者結果為1。While X<0,一開始X便為0,迴圈敘述區塊為X = X + 1,所以這個條件絕對永遠不會成立,但後者為Do-Loop-While結構,一定是先X = X + 1後,也就是X=1時,再去判斷While條件式,才跳出迴圈,所以執行結果為X=1。
同樣的道理,我們來看看Until。
Until
格式一:
Do Until 條件式
敘述區塊
Loop
這種格式會在執行Do迴圈時,判斷Until條件式是否為True,若為True,則立刻終止執行Do-Loop迴圈的敘述區塊,並跳出迴圈;反之,則繼續執行。
格式二:
Do
敘述區塊
Loop Until 條件式
這種格式會在執行完Do迴圈時,判斷Until條件式是否為True,若為True,則立刻終止執行Do-Loop迴圈的敘述區塊,並跳出迴圈;反之,則會到Do開頭並繼續執行敘述區塊。
以上Do-Until-Loop和Do-Loop-Until差在:後者至少執行過敘述區塊一次。相信你已經很清楚了,我們直接來比較以下程式碼的差異。
Do-Until-Loop
1 2 3 4 5 6 7 8 |
Private Sub Do_Until_Loop() Dim X As Integer X = 0 Do Until X >= 0 X = X + 1 Loop Print X End Sub |
Do-Loop-Until
1 2 3 4 5 6 7 8 |
Private Sub Do_Loop_Until() Dim X As Integer X = 0 Do X = X + 1 Loop Until X >= 0 Print X End Sub |
以上程式碼,前者結果為0,後者結果為1,你比較出來了嗎?
Exit Do
再來說說Exit Do,Exit Do放在Do-Loop迴圈內,可以無須經過While或Until的判斷就脫離迴圈。如果你的脫離Do-Loop迴圈要加點額外的條件的話,就要使用If和Exit Do了。舉個例子吧!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Private Sub Example() Dim X As Integer, Y As Integer, K As Integer X = 0 Y = 1 K = 5 'K為X的加數,Y的乘數。K不能等於0或-1。 Do X = X + K Y = K * Y If Y > X And Y > 10 Then MsgBox "Y比X先大於10了!" Exit Do End If Loop Until X > 10 End Sub |
以上例子,迴圈執行結果會隨著K值不同,而有X、Y變數大小不同的情況。Do-Loop迴圈用途廣泛,熟練之後對於以後的程式生涯一定會事半功倍!