11.程式控制流程

 
        程式敘述以其在程式中的順序依序被執行,但可使用條件敘述、非條件敘述等方式改變其執行順序。條件敘述有四種:IF...THEN...ELSE敘述SELECT...CASE敘述DO...LOOP敘述FOR...NEXT敘述。非條件敘述則是指GOTO及呼叫敘述
 
IF...THEN...ELSE敘述
        如果If敘述為「真」,則IF敘述之下的程式段將被執行;如果If敘述為「偽」,則ELSE敘述之下的程式段將被執行。另外可選擇使用ELESIF敘述,只要ELESIF為「真」,則Elesif敘述之下的程式段將被執行。任何被選擇執行的程式段執行完畢後,程式就結束IF...THEN...ELSE敘述的執行。        
 
 
        如果IF及ELSE的敘述都是單一敘述,則可合併成一行敘述。例如:
 
 

Sub Main()
   
Dim a,b,Max As Integer
   
Debugin "Enter the First Number:", a
   
Debugin "Enter the Second Number:", b
   
If a < b Then
        Max = b
   
Else
        Max = a
   
End If
   
Debug "Max is:", Max
End Sub

 

 
 
SELECT...CASE敘述
        SELECT...CASE可說是IF...THEN...ELSE的進階架構,它可以在許多可能中擇一執行。執行此敘述時,Select的值將與Case的值逐一比對,當某一個Case的值符合時,該Case之下的程式段將被執行。如果沒有任何一個Case的值符合,則Case Else之下的程式段將被執行。任何被選擇執行的程式段執行完畢後,程式就結束SELECT...CASE敘述的執行。
 
 
 
        以下為SELECT...CASE敘述的例子:
 
 

Sub Main()
   
Dim x As Byte
   
Do
       
Debugin"Enter a 1 to 7 to find the nth day of a week.", x, CR
       
Select Case x
       
Case 1
           
Debug "It's Sunday.", CR
       
Case 2
           
Debug "It's Monday.", CR
       
Case 3
           
Debug "It's Tuesday.", CR
       
Case 4
           
Debug "It's Wednesday.", CR
       
Case 5
           
Debug "It's Thursday.", CR
       
Case 6
           
Debug "It's Friday.", CR
       
Case 7
           
Debug "It's Saturday.", CR
       
Case Else
           
Debug "Wrong Number!", CR
       
End Select
   
Loop
End Sub

 

 
 
 
DO...LOOP 敘述
        程式中如果需要重覆執行一段程式,其中最有效率的方法之一則是使用DO...LOOP 敘述。
                        Do [{While | Until} condition]
                        [statements]
                        [Exit Do]
                        [statements]
                        Loop [{While | Until} condition]
        基本的DO...LOOP 命令會讓其中的程式段永遠不斷地執行。你可以在迴圈的開始或結束的地方加上WHILE敘述(但不能二處都加),如此當布林條件為「真」時,其下的程式段將被執行。如果WHILE被放在迴圈結束的地方,則程式段將至少被執行一次,然後才做布林條件的判斷。UNTIL的用法類似WHILE的用法,只是UNTIL是當布林條件為「真」時結束而不是繼續執行程式段。EXIT DO命令可放在程式段之中,用來立即離開LOOP迴圈。
 
 
 
        以下為DO...LOOP敘述的例子:
 
 

Sub Main()
   
Dim x As Short
    x =
1
   
Do While x<5
       
Debug "*"
        x+=
1 'display 4 asterisks
    Loop
   
Debug CR
    x =
1
   
Do
       
Debug "*"
        x+=
1 'display 4 asterisks
    Loop While x<5
   
Debug CR
    x =
5
   
Do Until x=0
       
Debug "*"
        x-=
1 'display 5 asterisks
    Loop
   
Debug CR
    x =
5
   
Do
       
Debug "*"
        x-=
1 'display 5 asterisks
    Loop Until x=0
End Sub

 

 
 
 
FOR...NEXT敘述
        如果一個程式要做一些已知次數的循環,則可使用FOR...NEXT敘述, 你可以利用一個迴圈變數的增加或減少來做循環控制。FOR...NEXT敘述需有一個迴圈變數、一個起始值、一個結束值和一個間距值。程式在FOR之後將以起始值代入迴圈變數開始執行,以後每執行一次程式段,變數值就以STEP後面的間距值增加或減少,直到變數值等於結束值才離開程式迴圈去執行NEXT之後的敘述。如果是要控制變數增加的迴圈,則STEP值必須是正數,而且結束值不可以小於起始值;相反的,如果是要控制變數減少的迴圈,則STEP值必須是負數,而且結束值不可以大於起始值,如果計數方向錯誤,則程式將不會執行。以下為FOR...NEXT的流程圖。
 
 
        請注意不同型態變數的值域範圍。例如SHORT變數的值域為-128到+127, BYTE變數的值域為0到+255。控制迴圈的變數須先宣告,且須為基本的數字型態(Byte、Short、Word、Integer、DWord、Long等)。例如:
 
 

Sub Main()
   
Dim Index As Byte
   
Dim Sum As Byte
    Sum=
0
   
For Index = 1 To 10 Step 1
        Sum+=Index
   
Next
   
Debug "1+2+...+10=",sum
End Sub

 

 
        FOR...NEXT迴圈控制變數不可以做為其內部嵌入的FOR...NEXT迴圈控制變數。Next敘述永遠與其內圍的尚未配對的For敘述配對。除非為了方便程式閱讀,通常位於NEXT之後的迴圈控制變數名稱可以省略。但是如果標示出NEXT之後的迴圈控制變數名稱,但卻沒有正確配對,則會於編譯時產生錯誤訊息。你可以使用關鍵字EXIT FOR跳出FOR...NEXT 迴圈,但不建議從迴圈外直接跳入迴圈,這樣可能會造成迴圈控制錯誤。
 
GOTO敘述
        GOTO命令將強迫程式跳到指定的程式段,而該程式段必須先給一個標籤名字。

        呼叫敘述是由關鍵字CALL來執行SUB程序或FUNCTION函數。程式跳到SUB或FUNCTION執行後再回到呼叫敘述的下一個敘述繼續執行。EVENT的功能類似SUB或FUNCTION程式的呼叫,只是它是在某一事件發生時自動執行的。細節請參考以下敘述。
        一個程式至少須有一個以“main”為命名的Sub程序。通常以“SubMain()”敘述來表示一個程式的開始,一直到Main()的最後結束。除了Main()程序之外,你可以加上其它的Sub程序,函數(Function)等,讓程式更具結構化,更有效率。
        SUB和FUNCTION副程式都可以有引數(Arguments),但只有FUNCTION副程式會有回傳值。通常,一段重複使用的程式會使用SUB副程式來減少程式空間及增加可讀性,FUNCTION副程式則用來執行一段運算,並將運算結果的值回傳主程式。
        Sub程序不回傳值。每次SUB被呼叫後即開始執行,直到End Sub出現為止。Sub Main()本身即是一個Sub敘述,也是一個程式的開始點。
 
 

Sub Main()
    Display()
End Sub

Sub Display()
   
Debug "Sub Procedure Display() has executed."
End Sub

 

 
 
Functions函數
        Function會有回傳值,通常用來求值、計算或轉換資料。宣告Function的方式與Sub類似。宣告時須有關鍵字“Function”。以下為如何使用Function的例子:
 
 

Function Max(I As Integer, J As Integer) As Integer
   
If I>J Then Return I Else Return J
End Function

Sub Main()
   
Dim X, Y, Z As Integer
   
Do
       
Debugin "Enter the First Number:", X
       
Debug X, CR
       
Debugin "Enter the Second Number:", Y
       
Debug Y, CR
        Z = Max(X,Y)
       
Debug "The Maximum value is ", Z, CR
   
Loop
End Sub

 

 
 
參數
        參數是代入SUB或FUNCTION程序的引數。在宣告SUB或FUNCTION程序時,參數被置於程序名字後面的括弧中。注意參數必須指定型態,且字串及陣列不可以為參數型態。
        有二種參數傳遞方式,包括傳址呼叫ByRef和傳值呼叫ByVal。如果沒有明確表示,系統預設為ByVal。宣告傳址呼叫時須在參數前加上ByRef。傳址呼叫的參數並不會佔用新的記憶體位置,而是延用先前呼叫它的引數的變數位置,改變參數內容將會同時改變引數的變數內容。以下的例子為傳址呼叫的應用:
 
 

Sub Swap(ByRef a As Integer, ByRef b As Integer)
   
Dim t As Integer = a
    a = b
    b = t
End Sub

Sub Main()
   
Dim x As Integer = 1
   
Dim y As Integer = 2
   
Debug "Before: x = ", x, ", y = ", y, CR
    Swap(x, y)
   
Debug "After: x = ", x, ", y = ", y, CR
End Sub

 

 
        程式的輸出為:
                Before : x = 1, y = 2
                After : x = 2, y = 1
 
 
        如需詳細說明,請參考InnoBasic內建指令介紹裡的
 
                                    IF...THEN...ELSE敘述
 
                                    SELECT...CASE敘述
 
                                        DO...LOOP敘述
 
                                        FOR...NEXT敘述
 
                                        GOTO及呼叫敘述