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等於Alpha減Beta 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)的結構方塊圖如右,這種語法的作用是
如果條件成立,則執行指令敘述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)的結構圖如下圖所示,其作用是「依待測敘述(Statement A)的值,決定應執行那一種狀態下的指令敘述。」
其中a、b、c、…為選擇狀態值;當待測敘述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=2或3時,執行AB = AB + 2。
當AB=5時,執行AB = AB/2。
當AB等於其他值時,執行AB = 0。
重複迴路結構的結構化流程圖如右圖所示,其作用是「如果滿足所定條件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迴路,設計一程式計算1到10的總和。
例2-4
程式204
計算1至10的和
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)。InputBox為Visual
Basic的標準輸入方塊,其中Prompt:=”How
many students?”會使對話方塊內顯示How many students?的提示。
條件式重複結構:若仍滿足所定條件,則繼續重複執行Block中的指令。其結構又可區分為Do-While-Loop及Do- 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
典型的實例可利用計算1到10的總和說明之。首先將總和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)}
將以上計算1到10的總和實例,以REPEAT-WHILE語法改寫如下。
Sum = 0
Do
Sum = Sum + I
I = I + 1
LOOP While I <= 10
Print Sum
類似的條件重複結構:若不能滿足所定條件,則繼續重複執行Statement中的指令。
其結構又可以分為Do-Until-Loop及Do-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