結構化程式設計

循序控制  條件式選擇  多重選擇  重複迴路   條件式重複  

Visual Basic基本上並非結構化的程式語言,但只要在程式設計時作適當處理,即可使程式結構變成簡潔、有條理、易於維護。

在本書中所使用的流程圖稱為結構化流程圖(Top-Down Design),基本上是由幾種含有基本指令的結構方塊堆疊而成,用以說明各個指令的執行順序。在撰寫程式時,可依據結構化流程圖很輕易的編寫程式碼。

傳統程式設計通常採用大量GOTO指令,非常容易造成邏輯混淆的困擾﹔因此,在本書所有程式實例中,為了維護程式邏輯的簡單明確,我們完全捨棄GOTO指令,改成完全遵照以下所說明的五種基本控制結構來撰寫:

循序控制結構、

條件式選擇結構(If-Then-Else)

多重選擇結構(Select Case)

重複迴路結構(For-Next)

條件式重複結構(Do-Loop While)

以下簡要說明各種基本控制結構及其基本語法。

循序控制結構

循序控制結構是最基本的程式組構元素,是由指令敘述區塊依序堆疊而成,其結構方塊圖如下圖所示。

循序控制結構的作用是先執行完指令敘述1後,

接著執行指令敘述2

其中指令敘述1及指令敘述2可以是任何基本敘述或指令。

 

 

循序控制結構典型的例子如下:

 

2-1 程式201

 

Private Sub Form_Click()                      'Form開始執行

Alpha = Val(InputBox("Alpha = "))           '利用InputBox輸入Alpha字串,再取其數值

Beta = Val(InputBox("Beta = "))              '利用InputBox輸入Beta字串,再取其數值

Debug.Print "Alpha = "; Alpha                '在即時運算視窗顯示

Debug.Print "Beta = "; Beta                 '在即時運算視窗顯示

AB = Alpha + Beta                         'AB等於Alpha加上Beta

AD = Alpha - Beta                          'AD等於AlphaBeta

Print "Alpha + Beta  = ";                    '列印; ""

Print Format(AB, "  0.0000E+00")           '0; 0#; 的格式印出AB

Print "Alpha - Beta = ";                      '列印; ""

Print Format(AD, "  0.0000E+00");          '0; 0#; 的格式印出AD

End Sub

 

 

條件式選擇結構(IF-THEN-ELSE)

條件式選擇結構(IF- THEN- ELSE)的結構方塊圖如右,這種語法的作用是

 

如果條件成立,則執行指令敘述1

否則就執行指令敘述2

      

        IF (Condition) THEN

                Statement Block 1

        ELSE

                Statement Block 2

        END IF

其中指令敘述1及指令敘述2可以是任何單一或多個基本敘述或指令。

 

2-2  程式202

 

Private Sub Form_Click()

X1 = Val(InputBox("X1 = "))  

Y = Val(InputBox("Y ="))    

Delta = Abs((X1 - Y) / X1)  

If (Delta >1.E-5) Then  

    Delta = X1 - X2       

    X1 = X1 + Y       

Else                    

    Delta = (X1 - 2 * X2)   

    X1 = X1 - Y       

End If              

Print "New X1 = ";

Print X1

End Sub

 

對應的Top-Down Design方塊圖為

利用條件式選擇結構(IF-THEN-ELSE),可以進一步組合成多重條件式選擇結構。其基本語法如下:

                IF (Condition 1) THEN

                                (Statement Block 1)

                ELSEIF (Condition 2) THEN

                                (Statement Block 2)

                ELSEIF (Condition 3) THEN

                                (Statement Block 3)

                ELSE

                        (Statement Block 4)

                ENDIF

對應的Top-Down Design方塊圖為

 

多重選擇結構(SELECT CASE)

多重選擇結構(SELECT CASE)的結構圖如下圖所示,其作用是「依待測敘述(Statement A)的值,決定應執行那一種狀態下的指令敘述。」

其中abc為選擇狀態值;當待測敘述Statement A的值等於a時,執行指令敘述1;當Statement A的值等於b時,執行指令敘述2…..;若Statement A的值與各狀態均不同,則執行指令敘述n。指令敘述1、指令敘述2、指令敘述n可為任何一個或多個基本敘述或指令。

基本語法:

Select Case TestExpression

     Case value1, value2,...

             [statements]

     Case value3 to value4

             [statements]

     Case Else

             [statements]

End Select

應用實例如下所示。

2-3  程式203

 

Private Sub Form_Click()

Alpha = Val(InputBox("Alpha = "))    

Beta = Val(InputBox("Beta = "))     

AB = Alpha + Beta      

AB = Int(AB / 10)    

Select Case AB    

Case 1      

    AB = AB + 1   

Case 2, 3    

    AB = AB + 2     

Case 5       

    AB = AB / 2

Case Else  

    AB = 0     

End Select     

Print " AB = ";

Print Format(AB, " 0.0000E+00")

End Sub

 

在此例中,程式需先計算AB值,當AB=1時,執行AB = AB + 1

AB=23時,執行AB = AB + 2

AB=5時,執行AB = AB/2

AB等於其他值時,執行AB = 0

 

重複迴路結構(FOR – NEXT)

重複迴路結構的結構化流程圖如右圖所示,其作用是「如果滿足所定條件For Count. Variable = Initial.Value to Final.Value step Var,則重複執行指令敘述中的指令。」FOR–NEXT重複迴路之基本語法如下所示,其作用是針對變異數Count.Variable,由起始值Initial.Value開始,每次增量(Step)Var,其中Var可以為正值或負值﹔直到變異數Count.Variable達到終點值Final.Value為止,重複執行FOR-NEXT間的指令。要中途脫離FOR–NEXT重複迴路,可以利用Exit For指令脫離。

FOR Count.Variable = Initial.Value TO Final.Value (STEP Var)

                Block Statement

                (Exit For)

                Block Statement

NEXT Count.Variable

FOR–NEXT重複迴路典型的實例如下,為利用FOR-NEXT迴路,設計一程式計算110的總和。

2-4  程式204  計算110的和

 

Private Sub Form_Click()

Sum = 0                        

For I = 1 To 10 Step 1  

    Sum = Sum + I      

Next I                 

Print "Sum of Integer from 1 to 10 = ";

Print Sum     

End Sub

 

FOR-NEXT重複迴路在矩陣及重複計算上,是一非常重要的指令。當一個以上的FOR-NEXT迴路組合在一起,可構成巢式迴路。典型的例子如下。

 

2-5  程式205  巢式迴路

 

Private Sub Form_Click()

For I = 1 To 10        

    Sum = 0             

    For J = 1 To 100          

        Sum = Sum + I * J    

    Next J      

    Print "I = ";

    Print I;        

    Print "   Sum = ";

    Print Sum     

Next I      

End Sub

 

Visual Basic語言由於可以接受長變數名稱,因此,為了提昇程式的可讀性,通常採用可對應實際意義的名稱撰寫程式。典型的實例如下:

intNumStudents = InputBox(prompt:="How many students?")

For intCounter = 1 To intNumStudents

sglScore = CSng (InputBox (prompt:= "Enter score"))

sglTotalScore = sglTotalScore + sglScore

Next intCounter

  sglAverage = sglTotalScore /intNumStudents

其中int表示整數(integer)sgl表示單準實數(single)InputBoxVisual Basic的標準輸入方塊,其中Prompt:=”How many students?”會使對話方塊內顯示How many students?的提示。

條件式重複結構 

 

條件式重複結構:若仍滿足所定條件,則繼續重複執行Block中的指令。其結構又可區分為Do-While-LoopDo- Loop–While兩種。其中Do-While條件式重複結構的基本語法為:

        DO {While (Condition)}

                Statements 1

                {Exit DO}

                Statements 2

        LOOP

簡單實例如下:

Dim strPasswordTry As String

Const PASSWORD As String = "CHEER"

PasswordCount = 0

Do While strPasswordTry <> PASSWORD

     If Password Count = 0 then

    strPasswordTry = InputBox ("Enter password")

     Elseif PasswordCount >3 then

       Print "Password Input Error"

       Exit Do

     Else

    strPasswordTry = InputBox ("Password Error, Enter password")

     End If

     PasswordCount = PasswordCount +1

Loop

典型的實例可利用計算110的總和說明之。首先將總和SUM歸零,在I<=10條件下,讓總和SUM逐次累加I值,加總完後,讓I值增加一個增量1;直到I >10不滿足重複結構之條件後,將總和SUM列印出。讀者可以仿照例2-4,將程式作如下之修改。

        Sum = 0

        Do While I <= 10

                Sum = Sum + I

                I = I + 1

        LOOP

        Print Sum

另一種條件式重複結構DO-LOOP-WHILE,基本上語法與DO-WHILE- LOOP極為相似,作用也相同。其基本語法結構為:

        DO

                Block 1

                {Exit DO}

                Block 2

        LOOP {While (Condition)}

將以上計算110的總和實例,以REPEAT-WHILE語法改寫如下。

        Sum = 0

        Do

                Sum = Sum + I

                I = I + 1

        LOOP While I <= 10

        Print Sum

類似的條件重複結構:若不能滿足所定條件,則繼續重複執行Statement中的指令

其結構又可以分為Do-Until-LoopDo-Loop–Until兩種。

其中Do-Until-Loop條件式重複結構的基本語法為:

Do

     [statements]

Loop Until [condition]

Do Until condition

     [statements]

Loop

其實例如:

Do Until EndOfFile = True

[Read and process next line in file]

[Set EndOfFile to True if end of file is encountered]

Loop

Dim intLoopCount As Integer

 

Do

    intLoopCount = intLoopCount + 1

Loop Until MsgBox("Loop?", vbYesNo) = vbNo

 

再進玄機閣       修練內功心法

 製成報表    VB內建函數    工具程式  VB多一點了解