- Visual Basic學習手冊
- 鞏建華 孫秀梅 安劍等編著
- 2793字
- 2018-12-27 17:51:22
第4章 掌握算法和程序控制結構
(名師課堂:1小時47分)
要使計算機能完成人們預定的工作,首先必須為如何完成預定的工作設計一下算法,然后再根據算法編寫程序。算法是問題求解過程的精確描述,因此掌握算法是學習程序設計的基礎,也可以說是程序設計的入門知識,可以幫助用戶更好、更快地掌握編程思想及編程方法。本章將簡要地介紹算法,使讀者初步了解算法,為日后編程打下良好的基礎。學好程序的基本控制結構是結構化程序設計的基礎,本章還詳細地介紹了程序常用的三種控制結構,講解過程中為了便于讀者理解結合了大量的舉例。
通過學習本章,讀者可以達到以下學習目的:
初步了解算法;
掌握順序結構程序設計方法中的基本語句、輸入/輸出語句的使用;
掌握賦值語句“=”的使用方法;
掌握選擇結構中If語句的使用方法;
掌握If語句的嵌套;
掌握選擇結構中Select Case語句的使用方法;
掌握循環結構中For…Next循環語句的使用方法;
掌握循環結構中Do…Loop循環語句的使用方法;
掌握多重循環的使用方法;
掌握選擇結構與循環結構的嵌套。
4.1 了解算法
專題講座:光盤文件\MR\Video\4\算法.exe
視頻速遞:詳細講解什么是算法及算法的特點
算法是學習程序設計的基礎,也可以說是程序設計的入門知識,掌握算法可以幫助讀者快速理清程序設計的思路,找出多種解決方法,從而選擇最合適的解決方案。
本節將介紹什么是算法、算法的特點、算法的描述方法以及構成算法的基本結構。
4.1.1 什么是算法
人們使用計算機,就是要利用計算機處理各種不同的問題,而要解決問題,就必須事先對各類問題進行分析,確定采用的方法和步驟。為解決某一個問題所采取的方法和步驟稱為“算法”。
實例位置:光盤文件\MR\ Instance\4\4.1
【例4.1】 例如,設計一個計算1~5的整數連乘的算法,并根據算法編寫程序。
首先,需要定義兩個整型變量intSum和i,其中intSum用來存放每次乘積的值和最后的計算結果,其初始值為1,而i用于存放1~5的整數,初始值為0,用intSum=intSum*i來完成每次連乘后的結果。算法可以表述如下。
將存放每次乘積的值和最后計算結果的變量intSum初始化為1。
將用于乘積運算的依次遞增的整型變量i初始化為0。
整型變量i為1~5的整數。
計算變量intSum與i的乘積,并將結果存入intSum,即intSum=intSum*i。
輸出變量intSum。
有了上述算法,就可以在Visual Basic中編寫程序了,程序代碼如下:
Private Sub Command1_Click() Dim intSum As Integer,i As Integer '定義整型變量 intSum=1:i=0 '給變量賦初值 For i=1 To 5 '計算1~5的連乘結果 intSum = intSum * i Next i Debug.Print intSum ' 輸出最后的計算結果 End Sub
4.1.2 熟悉算法的特點
一個算法應該具有以下的特點。
(1)有窮性:一個算法必須在執行有窮多個計算步驟后終止。
(2)確定性:一個算法給出的每個計算步驟,必須是有精確定義、無二義性。
(3)有效性:算法中的每一個步驟必須有效地執行,并能得到確定的結果。
(4)輸入:一個算法中可以沒有輸入,也可以有一個或者多個輸入信息。這些輸入信息是算法所需的初始數據。
(5)輸出:一個算法應該有一個或者多個輸出,一個算法得到的結果(中間結果或最后結果)就是算法的輸出,沒有輸出的算法是沒有意義的。
4.1.3 算法的描述方法
為了讓算法清晰易懂,需要選擇一種好的描述方法。算法的描述方法有很多,有自然語言、傳統流程圖、N-S結構化流程圖等。自然語言就是用人們日常使用的語言描述解決問題的方法和步驟,例如4.1.1節中設計計算1~5的整數連乘的算法中所闡述的。這種描述方法通俗易懂,但比較煩瑣,并且對程序流向等描述不明了、不直觀。針對這些缺點產生了傳統流程圖和N-S結構化流程圖。
下面分別介紹這兩種流程圖。
1.傳統流程圖
傳統流程圖,使用不同的幾何圖形來表示不同性質的操作,使用流程線來表示算法的執行方向,具有直觀形象、邏輯清楚、易于理解等特點,但它占用篇幅較大,流程隨意轉向,較大的流程圖不易讀懂。
傳統流程圖的基本符號及說明如表4.1所示。
表4.1 流程圖符號及說明

2.N-S結構化流程圖
N-S結構化流程圖是美國學者I·Nassi和B·Shneiderman在1973年首次提出的一種描述算法的圖形方法。N-S結構化流程圖將傳統流程圖中的流程線去掉,將全部算法寫在一個矩形框里,這個框包含其他從屬于它的從屬框。當程序算法比較煩瑣時,一般采用N-S結構化流程圖。另外,N-S結構化流程圖更有利于程序設計的結構化。
以上介紹的兩種流程圖各有特點,但對于初學者和編寫較小的程序時,筆者建議使用傳統流程圖來描述算法。
4.1.4 了解程序三種控制結構
在程序設計中,構成算法的基本結構有三種:順序結構、選擇結構和循環結構。合理使用這些控制結構可以使程序結構清晰,易讀性強,并且易于查錯和排錯。
1.順序結構
順序結構是最簡單、最基本的結構方式,各流程框依次按順序執行。其傳統流程圖的表示方式與N-S結構化流程圖的表示方式分別如圖4.1和圖4.2所示。其執行順序為:開始→語句1→語句2→……→結束。

圖4.1 順序結構傳統流程圖

圖4.2 順序結構N-S結構化流程圖
2.選擇(分支)結構
選擇結構就是對給定條件進行判斷,條件為True時執行一個分支,條件為False時執行另一個分支。雙分支和單分支選擇結構的傳統流程圖表示方式與N-S結構化流程圖表示方式如圖4.3和圖4.4所示。

圖4.3 雙分支選擇結構的兩種流程圖

圖4.4 單分支選擇結構的兩種流程圖
3.循環結構
循環結構可以按照需要多次重復執行一行或者多行代碼。循環結構分為兩種:當型循環和直到型循環。
當型循環,先判斷后執行。當條件為True時反復執行語句或語句塊,條件為False時,跳出循環,繼續執行循環后面的語句,流程圖如圖4.5所示。

圖4.5 當型循環流程圖
直到型循環,先執行后判斷。先執行語句或語句塊,再進行條件判斷,直到條件為False時,跳出循環,繼續執行循環后面的語句,否則一直執行語句或語句塊,流程圖如圖4.6所示。

圖4.6 直到型循環流程圖
4.2 學習使用順序結構
專題講座:光盤文件\MR\Video\4\順序結構.exe
視頻速遞:詳細講解賦值語句和輸入、輸出
順序結構是程序中最簡單、最常用的結構,在該結構中各語句按出現的先后次序執行。它是任何程序的主體基本結構。
一般的程序設計語言中,順序結構的語句主要包括賦值語句、輸入/輸出語句等,Visual Basic 6.0也不例外,其中輸入/輸出可以通過文本框控件、標簽控件、InputBox函數、MsgBox函數以及Print方法來實現。
4.2.1 使用賦值語句給變量賦值
賦值語句是將表達式的值賦給變量或屬性,通過Let關鍵字使用賦值運算符“=”給變量或屬性賦值。
語法:
[Let] <變量名> = <表達式>
Let:可選的參數。顯式使用的Let關鍵字是一種格式,通常都省略該關鍵字。變量名:必需的參數。變量或屬性的名稱,變量命名遵循標準的變量命名約定。表達式:必需的參數。賦給變量或屬性的值。
例如,定義一個長整型變量,給這個變量賦值2205,代碼如下:
Dim a As Long Let a = 2205
上述代碼中可以省略關鍵字Let。
例如,在文本框中顯示文字,代碼如下:
Text1.Text="mingrisoft"
賦值語句看起來簡單,但使用時也要注意以下幾點。
(1)賦值號與表示等于的關系運算符都用“=”表示,Visual Basic 6.0系統會自動區分,即在條件表達式中出現的是等號,否則是賦值號。
(2)賦值號左邊只能是變量,不能是常量、常數符號和表達式。下面均是錯誤的賦值語句:
X+Y=1 '左邊是表達式 Visual Basic 6.0Black=myColor '左邊是常量,代表黑色 10=abs(s)+x+y '左邊是常量
(3)當表達式為數值型并與變量精度不同時,需要強制轉換左邊變量的精度。
例如:
n%=4.6 'n為整型變量,轉換時四舍五入,值為5
(4)當表達式是數字字符串,左邊變量是數值型時,右邊值將自動轉換成數值型再賦值。如果表達式中有非數字字符或空字符串,則會出錯。
n%="123" '將字符串123轉換為數值數據123
下列情況會出現運行時錯誤。
n%="123mr" n%=""
(5)當邏輯值賦值給數值型變量時,True轉換為?1,False轉換為0,反之當數值賦給邏輯型變量時,非0轉換為True,0轉換為False。
實例位置:光盤文件\MR\ Instance\4\4.2
【例4.2】 在“立即”窗口中將單選按鈕被選擇的狀態賦值給整型變量。
新建一個工程,在Form1窗體中添加一個CommandButton控件和兩個Option Button控件。
在代碼窗口中編寫如下代碼:
Private Sub Command1_Click() Dim a As Integer,b As Integer '定義整型變量 a=Option1.Value ' 將邏輯值賦給整型變量a b=Option2.Value ' 將邏輯值賦給整型變量b Debug.Print "Opt1的值:"&a '輸出結果 Debug.Print "Opt2的值:"&b End Sub
按【F5】鍵運行程序,結果如圖4.7所示。

圖4.7 在“立即”窗口中顯示OptionButton控件的返回值
(6)任何非字符型的值賦值給字符型變量,自動轉換為字符型。
為了保證程序的正常運行,一般利用類型轉換函數將表達式的類型轉換成與左邊變量匹配的類型。
4.2.2 將用戶數據輸入到應用程序
在程序設計時,通常使用文本框(TextBox控件)或InputBox函數來輸入數據。當然,也可以使用其他對象或函數來輸入數據。
1.文本框
利用文本框控件的Text屬性可以獲得用戶從鍵盤輸入的數據,或將計算的結果輸出。
實例位置:光盤文件\MR\ Instance\4\4.3
【例4.3】 在兩個文本框中分別輸入“單價”和“數量”,然后通過Label控件顯示金額,代碼如下:
Private Sub Command1_Click() Dim mySum As Single ' 定義單精度浮點型變量 mySum=Val(Text1.Text)*Val(Text2.Text) '計算“單價”和“數量”相乘 Label1.Caption ="金額為:"&mySum ' 顯示計算結果 End Sub
按【F5】鍵運行程序,結果如圖4.8所示。

圖4.8 在標簽控件顯示金額
2.輸入對話框InputBox函數
InputBox函數提供了一個簡單的對話框供用戶輸入信息,如圖4.9所示。在該對話框中有一個輸入框和兩個命令按鈕。顯示對話框后,將等待用戶輸入。當用戶單擊“確定”按鈕后返回輸入的內容。InputBox函數的介紹如下。

圖4.9 InputBox輸入框
語法:
InputBox (prompt[, title] [, default] [, xpos][, ypos])
InputBox函數語法中的參數說明如表4.2所示。
表4.2 InputBox函數語法中的參數說明

InputBox輸入函數有兩種表達方式,一種為帶返回值的,另一種為不帶返回值的。(1)帶返回值
帶返回值的輸入函數的使用方法舉例如下:
MyValue = InputBox("請輸入電話號碼", , 4978981)
上述語句中InputBox函數其后的一對圓括號不能省略,其中各參數之間用逗號隔開。(2)不帶返回值
不帶返回值的輸入函數的使用方法舉例如下:
InputBox "請輸入電話號碼", 4978981
學習手冊
注意 ① InputBox函數中各項參數的順序必須一一對應,除第一項參數“提示”不能省略外,其余參數均可省略,省略可選參數時其后的逗號不可省。
② 由InputBox函數返回的數據類型為字符類型數據,如果要得到數值類型數據,則必須用Val函數進行類型轉換。
4.2.3 將指定信息顯示給用戶
輸出數據可以通過Label控件、輸出對話框函數MsgBox和Print方法等。通過Label控件輸出數據較簡單,這里就不介紹了,下面僅介紹MsgBox函數和Print方法。
1.MsgBox函數
MsgBox函數的功能是在對話框中顯示消息,如圖4.10所示,等待用戶單擊按鈕,并返回一個整數告訴系統用戶單擊的是哪一個按鈕。

圖4.10 MsgBox對話框
另外,在使用該函數時,可以通過設置其中的可用參數,在消息框中顯示信息、按鈕、圖標或警告聲音。
語法:
MsgBox(prompt[,buttons][,title])
MsgBox函數語法中的參數說明如表4.3所示。
表4.3 MsgBox函數語法中的參數說明

buttons參數用于指定對話框中按鈕的數目及形式、圖標樣式、默認按鈕等,它的取值如表4.4所示。
表4.4 buttons參數的取值

MsgBox函數支持命名參數。返回一個整數,表示關閉對話框前哪一個按鈕被單擊,具體意義如表4.5所示。
表4.5 MsgBox函數的返回值

表4.4和表4.5中列出的符號常量是Visual Basic 6.0定義的常量,可以在程序中的任何地方使用,這些符號常量所對應的值就是表中“值”列中的數。
MsgBox函數有兩種表達方式,一種為帶返回值的,另一種為不帶返回值的。
(1)帶返回值
帶返回值的函數的使用方法舉例如下:
myvalue=MsgBox("注意:請輸入數值型數據",2+Visual Basic 6.0Exclamation,"錯誤提示") If myvalue=3 Then End
上述語句中MsgBox函數其后的一對圓括號不能省略,其中各參數之間用逗號隔開。
(2)不帶返回值
不帶返回值的輸入函數的使用方法舉例如下:
MsgBox "請輸入數值型數據!", , "提示"
2.Print方法
Print是輸出數據、文本的一個重要方法,其格式如下:
窗體名稱.Print[<表達式>[,|;[<表達式>]…]]
參數說明:
<表達式>:可以是數值或字符串表達式。對于數值表達式,先計算表達式的值,然后輸出;而字符串則原樣輸出。如果表達式為空,則輸出一個空行。
當輸出多個表達式時,各表達式用分隔符(逗號、分號或空格)隔開。若用逗號分隔將以14個字符位置為單位把輸出行分成若干個區段,每個區段輸出一個表達式的值。而表達式之間用分號或空格作為分隔符,則按緊湊格式輸出。
一般情況下,每執行一次Print方法將自動換行,可以通過在末尾加上逗號或分號的方法使輸出結果在同一行顯示。
學習手冊
注意 Print方法除了可以作用于窗體外,還可以作用于其他多個對象,如立即窗口(Debug)、圖片框(PictureBox)、打印機(Printer)等。如果省略“對象名”,則在當前窗體上輸出。
實例位置:光盤文件\MR\ Instance\4\4.4
【例4.4】 使用Print方法在窗體中輸出圖書排行數據,代碼如下:
Private Sub Form_Click() Print '輸出空行 Font.Size=14 '設置字體 Font.Name ="華文行楷" Print Tab(45);Year(Date)&"年"&Month(Date)&"月份圖書銷售排行" '打印標題 CurrentY =700 Font.Size =9 Font.Name ="宋體" Print Tab(15);"書名";Tab(55);"出版社";Tab(75);"銷售數量" Print Tab(14);String(75,"-") ' 輸出線 '打印內容 Print Tab(15);"Visual Basic經驗技巧寶典";Tab(55);"人民郵電出版社";Tab(75);10 Print Tab(15);"Visual Basic數據庫系統開發案例精選";Tab(55);"人民郵電出版社";Tab(75);6 Print Tab(15);"Delphi數據庫系統開發案例精選";Tab(55);"人民郵電出版社";Tab(75);8 End Sub
代碼說明:
Tab(n):內部函數,用于將指定表達式從窗體第n列開始輸出。
Spc(n):內部函數,用于在輸出表達式前插入n個空格。
Print:如果Print后面沒有內容,則輸出空行。
按【F5】鍵,運行工程,單擊窗體,效果如圖4.11所示。

圖4.11 使用Print語句在窗體中輸出數據
4.3 學習使用選擇結構
專題講座:光盤文件\MR\Video\4\選擇結構.exe
視頻速遞:詳細講解If語句和Select Case語句
選擇結構屬于分支結構中的一種,也可以稱為判定結構。程序通過判斷所給的條件和判斷條件的結果執行不同的程序段。
4.3.1 單分支If…Then語句
If…Then語句用于判斷表達式的值,滿足條件時執行其包含的一組語句,執行流程如圖4.12所示。

圖4.12 If…Then語句執行流程圖
If…Then語句有兩種形式,即單行和塊形式。
1.單行形式
顧名思義,單行形式的If…Then語句只能在一行內書寫完畢,即不能一行超過255個字符的限制。
語法:
If條件表達式 Then 語句
If和Then都是關鍵字。“條件表達式”應該是一個邏輯表達式,或者其值是可以轉換為邏輯值的其他類型表達式。
當程序執行到此語句時,首先檢查“條件表達式”,以確定下一步的流向。如果“條件”為True,則執行Then后面的語句;如果“條件”為False,則不執行“語句”中的任何語句,直接跳到下一條語句執行。
下面是一條單行形式的If…Then語句:

2.塊形式
塊形式的If…Then語句是以連續數條語句的形式給出的。
語法:
If條件表達式Then 語句塊 End If
其中“語句塊”可以是單個語句,也可以是多個語句。多個語句可以寫在多行中,也可以寫在同一行中,并用冒號“:”隔開。
當程序執行到此語句時,首先檢查“條件表達式”,以確定下一步的流向。如果“條件”為True,則執行Then后面的語句塊;如果“條件”為False則跳過Then后面的語句或語句塊。如果邏輯表達式為數值表達式,計算結果為非0時表示True,計算結果為0時表示False。
學習手冊
注意 塊形式的If…Then…End If語句必須使用End If關鍵字作為語句的結束標志,否則會出現語法錯誤或邏輯錯誤。
實例位置:光盤文件\MR\ Instance\4\4.5
【例4.5】 判斷“密碼”文本框中的值是否為“111”,如果是則提示用戶登錄成功,代碼如下:

按【F5】鍵,運行工程,單擊窗體,效果如圖4.13所示。

圖4.13 用戶登錄
4.3.2 雙分支If…Then…Else語句
在If…Then…Else語句中,可以有若干組語句塊,根據實際條件只執行其中的一組,其執行流程如圖4.14所示。

圖4.14 If…Then…Else語句執行流程圖
If…Then…Else語句也分為單行形式和塊形式。
1.單行形式
語法:
If 條件表達式 Then 語句塊1 Else 語句塊2
當條件滿足時(即“條件表達式”的值為True),執行“語句塊1”,否則執行“語句塊2”,然后繼續執行If語句下面的語句。
例如,下面就是一個單行形式的If…Then…Else語句:

2.塊形式
如果單行形式的兩個語句塊中的語句較多,則寫在單行不易讀,且容易出錯,這時就應該使用塊形式的If…Then…Else語句。
語法:
If條件表達式T hen 語句塊1 Else 語句塊2 End If
塊形式的If…Then…Else…End If語句與單行形式的If…Then…Else語句功能相同,只是塊形式更便于閱讀和理解。
另外,塊形式中的最后一個End If關鍵字不能省略,它是塊形式的結束標志,如果省略會出現編譯錯誤,如圖4.15所示。

圖4.15 省略最后一個End If出現錯誤
實例位置:光盤文件\MR\ Instance\4\4.6
【例4.6】 下面用塊形式判斷用戶輸入的密碼,如果“密碼”文本框中的值為“111”,則提示用戶登錄成功,否則提示用戶“密碼錯誤,請重新輸入!”,代碼如下:
Private Sub Command1_Click() If Text1.Text="111"Then '判斷"密碼"文本框中的值是否為"111" MsgBox"登錄成功!",,"提示" '提示登錄成功 Else MsgBox"密碼錯誤,請重新輸入!",,"提示" ' 否則提示密碼錯誤 End If End Sub
4.3.3 If語句的嵌套
一個If語句的“語句塊”中可以包括另一個If語句,這種就是“嵌套”。在Visual Basic 6.0中允許If語句嵌套。
下面語句就是If語句的嵌套形式:
If條件表達式1 Then ' 最外層If語句 語句塊1 If條件表達式2 Then ' 內層If語句 語句塊2 Else If條件表達式4 Then …語句塊3 Else …語句塊4 ' 最內層If語句 End If '內層If結束語句 語句塊5 Else '最外層If語句 語句塊6 If條件表達式3 Then ' 內層If語句 語句塊7 End If '內層If結束語句 語句塊8 End If '最外層If結束語句
上面的語句看起來不太直觀,下面用流程圖來表示,如圖4.16所示。

圖4.16 If語句嵌套執行流程圖
對于這種結構,書寫時應該采用縮進形式,這樣可以使程序代碼看上去結構清晰,增強代碼的可讀性,便于日后修改調試。另外,Else或End If必須與它相關的If語句相匹配,構成一個完整的If結構語句。
實例位置:光盤文件\MR\ Instance\4\4.7
【例4.7】 下面通過一個典型的“用戶登錄”實例,介紹If語句的嵌套在實際項目開發中的應用,設計步驟如下。
新建一個工程,在Form1窗體中添加Label控件、ComboBox控件和TextBox等控件,如圖4.17所示。

圖4.17 用戶登錄界面設計效果
設置窗體和控件的相關屬性,設置結果如表4.6所示。
表4.6 各窗體和控件的主要設置

在代碼窗口中編寫如下代碼:
Option Explicit Public intMyTimes As Integer Const MaxTimes As Integer = 3 Private Sub Form_Load() intMyTimes=1 '給變量賦初值 '窗體載入時,將用戶添加到ComboBox控件中 cboUserName.AddItem "管理員" cboUserName.AddItem "操作員1" cboUserName.AddItem "操作員2" End Sub Private Sub cmdOK_Click() If cboUserName.Text<>""Then '如果操作員不為空 If txtPassword.Text=""Then '判斷密碼是否為空 MsgBox "請輸入密碼!", , "提示窗口" txtPassword.SetFocus Exit Sub End If If txtPassword.Text<>"11"Then '如果密碼不是"11" If intMyTimes>MaxTimes Then '密碼輸入次數大于3次,則退出程序 MsgBox "您無權使用該軟件!", , "提示窗口" End Else '否則提示密碼輸入不正確 intMyTimes=intMyTimes+1 '每輸入一次錯誤的密碼,變量intMyTimes就加1 MsgBox "密碼不正確,請重新輸入!", , "提示窗口" txtPassword.SetFocus End If Else '否則登錄成功 MsgBox "登錄成功!", , "提示窗口" End If Else: '提示用戶操作員不能為空 MsgBox "操作員不能為空!", , "提示窗口" Exit Sub End If End Sub Private Sub cmdCancel_Click() End '退出程序 End Sub
按【F5】鍵,運行工程。選擇操作員,輸入密碼,單擊“確定”按鈕,如圖4.18所示。

圖4.18 操作員為空
具體執行過程如下。
① 判斷操作員是否為空,如果操作員為空則提示用戶,如圖4.18所示,否則執行②。
② 判斷密碼是否為空,如果密碼為空則提示用戶,如圖4.19所示,否則執行③。

圖4.19 密碼為空
③ 判斷密碼輸入是否正確,如果正確則提示“登錄成功”,如圖4.20所示,否則執行④。

圖4.20 登錄成功
④ 判斷密碼輸錯的次數是否大于3次,如果大于3次,則提示用戶無權使用,如圖4.21所示,然后退出程序,否則執行⑤。

圖4.21 密碼輸錯次數大于3次
⑤ 每輸入一次錯誤的密碼,變量intMyTimes就加1,并提示用戶密碼輸入有誤,如圖4.22所示。

圖4.22 提示用戶密碼有誤
4.3.4 多分支If…Then…ElseIf語句
只有塊形式的寫法,語句格式為:
If條件表達式1 Then 語句塊1 ElseIf條件表達式2 Then 語句塊2 ElseIf條件表達式3 Then 語句塊3 …… ElseIf條件表達式n Then 語句塊n …… [Else 語句塊n+1] End If
該語句的作用是根據不同的條件確定執行哪個語句塊,其執行順序為條件表達式1、條件表達式2、……,一旦條件表達式的值為True,則執行該條件下的語句塊。
多分支If…Then…ElseIf語句的執行流程如圖4.23所示。

圖4.23 多分支If…Then…ElseIf語句執行流程圖
在Visual Basic 6.0中,該語句中的條件表達式和語句塊的個數沒有具體限制。另外,書寫時應注意,關鍵字ElseIf中間沒有空格。
實例位置:光盤文件\MR\ Instance\4\4.8
【例4.8】 下面通過一個實例,介紹多分支If語句的應用。將輸入的分數做不同程度的分類,即“優”、“良”、“及格”和“不及格”,先判斷分數是否等于100,再判斷是否>=80,是否>=60,……以此類推。程序設計步驟如下。
啟動Visual Basic 6.0,新建工程,在新建的Form1窗體中添加一個文本框(Text1)、3個標簽(Label1、Label2和Label3)和一個命令按鈕(Command1)。
在代碼窗口中編寫如下代碼:
Private Sub Command1_Click() Dim a As Integer ' 定義一個整型變量 a=Val(Text1.Text) '給變量a賦值 If a = 100 Then lblResult.Caption = "優" ElseIf a >= 80 Then lblResult.Caption = "良" ElseIf a >= 60 Then lblResult.Caption = "及格" Else lblResult.Caption = "不及格" End If End Sub
按【F5】鍵,運行工程,在第一個文本框中輸入一個整數,單擊“判斷”按鈕,程序會在第二個文本框中顯示判斷結果,如圖4.24所示。

圖4.24 多分支If實例運行效果圖
4.3.5 利用Select Case語句處理多分支控制結構
當選擇的情況較多時,使用If語句實現就會很麻煩,而且不直觀,而Visual Basic 6.0中提供的Select Case語句可以方便、直觀地處理多分支的控制結構。
語法:
Select Case測試表達式 Case表達式1 語句塊1 Case表達式2 語句塊2 …… Case表達式n 語句塊n [Case Else 語句塊n+1] End Select
Select Case語句的執行流程如圖4.25所示。

圖4.25 Select Case語句的執行流程圖
執行過程說明。
首先計算“測試表達式”的值。
然后用這個值與Case后面表達式1,表達式2,……中的值比較。
若有相匹配的,則執行Case表達式后面的語句塊,執行完該語句塊則結束Select Case語句,不再與后面的表達式比較。
當“測試表達式”的值與后面所有表達式的值都不相匹配時,若有Case Else語句,則執行Case Else后面的語句塊n+1,若沒有Case Else語句,則直接結束Select Case語句。
在Select Case語句中“表達式”通常是一個具體的值(如Case 1),每一個值確定一個分支。“表達式”的值稱為域值,有以下4種方法可以設定該值。
(1)表達式列表為表達式,例如:X+100。
Case X+100 '表達式列表為表達式
(2)一組值(用逗號隔開),例如:
Case 1,4,7 '表示條件在1、4、7范圍內取值
(3)表達式1To表達式2,例如:
Case 50 To 60 '表示條件取值范圍為50~60
(4)Is關系表達式,例如:
Case Is<4 '表示條件在小于4的范圍內取值
實例位置:光盤文件\MR\ Instance\4\4.9
【例4.9】 將4.3.4節中的多分支If語句的應用實例改寫為Select Case語句形式,代碼如下:
Private Sub Command1_Click() Dim a As Integer ' 定義一個整型變量 a=Val(Text1.Text) '給變量a賦值 Select Case a Case Is = 100 lblResult.Caption = "優" Case Is >= 80 lblResult.Caption = "良" Case Is >= 60 lblResult.Caption = "及格" Case Else lblResult.Caption = "不及格" End Select End Sub
比較二者之間的區別,可以看出,在多分支選擇的情況下,使用Select Case語句,結構更清晰。當然,若只有兩個分支或分支數很少的情況下,直接使用If…Then語句更好一些。
4.3.6 使用IIf函數簡化程序
在使用Visual Basic 6.0設計程序時,往往會遇到一個變量或屬性與另一個變量或屬性進行比較的情況,根據這個比較的條件(大于、小于、等于、大于等于、小于等于等),將之前的變量或屬性重新賦予一個新值。如果使用If…Then…Else等語句實現,程序的代碼就比較煩瑣,而使用IIf函數就比較簡單了。
IIf函數的作用是根據表達式的值,返回兩部分中其中一個的值或表達式。
語法:
IIf(<表達式>,<值或表達式1>, <值或表達式2>)
參數說明:
表達式:必要參數。用來判斷值的表達式。
值或表達式1:必要參數。如果表達式為True,則返回這個值或表達式。
值或表達式2:必要參數。如果表達式為False,則返回這個值或表達式。
學習手冊
注意 如果表達式1與值或表達式2中任何一個在計算時發生錯誤,那么程序就會發生錯誤。
實例位置:光盤文件\MR\ Instance\4\4.10
【例4.10】 將4.3.1節中的實例,即如果“密碼”文本框中的值為“111”,則提示用戶輸入正確,否則提示用戶“密碼不正確,請重新輸入!”,分別使用If…Then…Else語句與IIf函數實現,比較它們用法的區別。
1.使用If…Then…Else語句實現
Private Sub Command1_Click() If Text1.text="111"Then ' 判斷“密碼”文本框中的值是否為“111” MsgBox"輸入正確!",,"提示" '是“111”則提示用戶輸入正確 Else MsgBox"密碼不正確,請重新輸入!",,"提示" '否則提示用戶密碼不正確 End If End Sub
2.使用IIf函數實現
Private Sub Command1_Click()
Dim str As String '定義字符型變量
str = IIf(Text1.Text = "111", "輸入正確!", "密碼不正確,請重新輸入!")
MsgBox str, , "提示"
End Sub
4.3.7 情景應用——十進制轉換為其他進制
開發項目時,經常會遇到進制間的相互轉換。下面通過一個實例講解如何實現十進制轉換為其他進制功能。
實例位置:光盤文件\MR\ Instance\4\4.11
【例4.11】 這里介紹的是將一個十進制整數轉換成二至十六任意進制的數值,進制轉換的算法思想是:將十進制正整數n不斷除進制數r取余數,直到商為零,將得到的值反序連接,即最后得到的余數在最高位。本例實現將十進制整數轉換成二至十六任意進制的字符串。程序設計步驟如下。
新建一個標準工程。
在工程中添加一個窗體,窗體的名稱使用其默認名稱,Caption屬性設置為“進制轉換”,StartUpPosition屬性設置為“2-屏幕中心”。
在窗體上添加4個Label控件,前兩個Label控件用于顯示提示信息,后兩個Label控件用于顯示最大公約數和最小公倍數的值。
在窗體上添加兩個TextBox控件,名稱使用默認名稱,用于輸入兩個自然數;在窗體上添加一個CommandButton控件,Caption屬性設置為“計算”,用于執行計算命令。
程序的運行代碼如下。
Private Sub Command1_Click() If Text1.Text = "" Or Text2.Text = "" Then MsgBox "請輸入正確數值!", vbInformation, "信息提示" Exit Sub End If Te xt3.Text=TrDec(Text1.Text,Text2.Text) '獲取轉換后的數值 End Sub Private Function TrDec(idec As Integer, ibase As Integer) As String Dim strDecR$,iDecR% strDecR = "" Do While idec<>0 iDecR =idec Mod ibase '用十進制數除以轉換進制數取余數 If iDecR>=10 Then strDecR=Chr$(65+iDecR-10)&strDecR ' Else strDecR = iDecR & strDecR End If idec =idec\ibase Loop TrDec = strDecR End Function
程序的運行結果如圖4.26所示。

圖4.26 進制轉換程序運行界面
4.4 學習使用循環結構
專題講座:光盤文件\MR\Video\4\循環結構.exe
視頻速遞:詳細講解For語句、Do語句、Do…While語句用法
當程序中有重復的工作要做時,就需要用到循環結構。循環結構是指程序重復執行循環語句中一行或多行代碼。例如,在窗體上輸出10次1,每個1單獨一行。如果使用順序結構實現,就需要書寫10次“Print 1”這樣的代碼,而使用循環語句則簡單多了,使用For…Next語句實現的代碼如下:
For i = 1 To 11 Print 1 Next i
在上述代碼中i是一個變量,用來控制循環次數。
Visual Basic 6.0提供了3種循環語句來實現循環結構:For…Next、Do…Loop和While…Wend,下面分別進行介紹。
4.4.1 For…Next循環語句
當循環次數確定時,可以使用For…Next語句。
語法:
For循環變量= 初值To終值[S tep步長] 循環體 [Exit For] 循環體 Next循環變量
For…Next語句執行過程如圖4.27所示。

圖4.27 For語句的執行流程圖
(1)如果不指定“步長”,則系統默認步長為1;當“初值<終值”時,“步長”為0;當“初值>終值”時,“步長”應小于0。
(2)Exit For用來退出循環,執行Next后面的語句。
(3)如果出現循環變量的值總是不超出終值的情況,則會產生死循環。此時,可按【Ctrl+Break】組合鍵,強制終止程序的運行。
(4)循環次數N=Int((終值-初值)/步長+1)。
(5)Next后面的循環變量名必須與For語句中的循環變量名相同,并且可以省略。
實例位置:光盤文件\MR\ Instance\4\4.12
【例4.12】 在ComboBox下拉列表控件中添加1~12個月,代碼如下:
Private Sub Form_Load() Dim i% '定義一個整型變量 For i = 1 To 12 Combo1.AddItem i&"月" Next i End Sub
按【F5】鍵,運行工程,效果如圖4.28所示。

圖4.28 For語句的簡單應用
如果只顯示2、4、6等偶數月份,則應將上述代碼改為:
Private Sub Form_Load() Dim i% For i = 1 To 12 Step 2 Combo1.AddItem i+1&"月 Next i End Sub
如果只顯示1、3、5等奇數月份,則只需要將上述代碼中的Combo1.AddItem i + 1 & "月"改為Combo1.AddItem i & "月"。
另外,For循環中的計數還可以是倒數,只要把間隔值設為負值(即間隔值小于0),而令初始值大于終止值就可以了。這時,循環的停止條件將會變成當計數值小于終止值時停止。
例如,在窗體上輸出10~1的整數,代碼如下:
Private Sub Form_Click() Dim i% For i = 10 To 1 Step -1 Print i Next i End Sub
4.4.2 For Each…Next循環語句
For Each…Next語句用于依照一個數組或集合中的每個元素,循環執行一組語句。
語法:
For Each數組或集合中元素In數組或集合 循環體 [Exit For] 循環體 Next數組或集合中元素
學習手冊
說明 ①“數組或集合中元素”:必要參數,是用來遍歷集合或數組中所有元素的變量。對于集合,可能是一個Variant類型變量、一個通用對象變量或任何特殊對象變量;對于數組,這個變量只能是一個Variant類型變量。
②“數組或集合”:必要參數,對象集合或數組的名稱(不包括用戶定義類型的數組)。
③ 循環體:可選參數,循環執行的一條或多條語句。
實例位置:光盤文件\MR\ Instance\4\4.13
【例4.13】 單擊窗體時使用For Each…Next語句列出窗體上所有控件名稱,代碼如下:
Private Sub Form_Click() Dim Myctl As Control For Each Myctl In Me.Controls ' 遍歷窗體中的控件 Print Myctl.Name Next Myctl End Sub
按【F5】鍵,運行工程,效果如圖4.29所示。

圖4.29 在窗體中顯示所有控件名稱
4.4.3 Do…Loop循環語句
對于那些循環次數難以確定,但控制循環的條件或循環結束的條件已知的情況下,常常使用Do…Loop語句。Do…Loop語句是最常用、最有效、最靈活的一種循環結構,它有以下4種不同的形式。
1.Do While…Loop
使用While關鍵字的Do…Loop循環稱為“當型循環”,是指當循環條件的值為True時執行循環。
語法:
Do While <循環條件> 循環體1 <Exit Do> 循環體2 Loop
該語句的執行流程如圖4.30所示。

圖4.30 Do While…Loop語句執行流程圖
從流程圖可以看出,Do While…Loop語句的執行過程如下。
<循環條件>定義了循環的條件,是邏輯表達式,或者能轉換成邏輯值的表達式。當程序執行到Do While…Loop語句時,首先判斷While后面的<循環條件>,如果其值為True,則由上到下執行“循環體”中的語句,當執行到Loop關鍵字時,返回到循環開始處再次判斷While后面的<循環條件>是否為True。如果為True,則繼續執行循環體中的語句,否則跳出循環,執行Loop后面的語句。
實例位置:光盤文件\MR\ Instance\4\4.14
【例4.14】 下面使用Do While…Loop語句計算1+2+3+…+50的值,代碼如下:
Private Sub Form_Click() Dim i%,mySum% '定義整型變量 Do While i < 50 i=i+1 '每循環一次,變量i就加1 mySum=mySum+i '每循環一次,變量mySum就加變量i Loop Print mySum '輸出計算結果 End Sub
結果為:1225
2.Do…Loop While
這是“當型循環”的第二種形式,它與第一種形式的區別在于While關鍵字與<循環條件>在Loop關鍵字后面。
語法:
Do 循環體1 <Exit Do> 循環體2 Loop While <循環條件>
該語句的執行流程如圖4.31所示。

圖4.31 Do…Loop While語句執行流程圖
從流程圖可以看出,Do…Loop While語句的執行過程為:
當程序執行Do…Loop While語句時,首先執行一次循環體,然后判斷While后面的<循環條件>,如果其值為True,則返回到循環開始處再次執行循環體,否則跳出循環,執行Loop后面的語句。
實例位置:光盤文件\MR\ Instance\4\4.15
【例4.15】 下面使用Do…Loop While語句計算1+2+3+…+myVal的值,myVal值通過InputBox輸入對話框輸入,代碼如下:
Private Sub Form_Click() Dim i%,mySum%,myVal% ' 定義整型變量 my Val=Val(InputBox("請輸入一個數:")) ' 得到輸入的值 Do While i < myVal i=i+1 '每循環一次,變量i就加1 my Sum=mySum+i '每循環一次,變量mySum就加變量i Loop Print mySum '輸出計算結果 End Sub
上述代碼中,如果myVal的值大于等于256時,程序會出現“溢出錯誤”,因為代碼中變量myVal定義的是整型,整型的有效范圍是?32768~32768,因此出現錯誤。
解決辦法有兩種:一種是將變量myVal定義為長整型,這樣輸入值的有效范圍會大些;另一種就是在代碼i = i + 1后面加上代碼If myVal >= 256 Then Exit Do,判斷如果變量myVal的值大于等于256,則使用Exit Do語句退出循環。
3.Do Until…Loop
使用Until關鍵字的Do…Loop循環被稱為“直到型循環”。
語法:
Do Until <循環條件> 循環體1 <Exit Do> 循環體2 Loop
該語句的執行流程如圖4.32所示。

圖4.32 Do Until…Loop語句執行流程圖
從流程圖可以看出,用Until關鍵字代替While關鍵字的區別在于,當循環條件的值為False時才進行循環,否則退出循環。
實例位置:光盤文件\MR\ Instance\4\4.16
【例4.16】 下面使用Do Until…Loop語句計算階乘n!,n值通過InputBox輸入對話框輸入,代碼如下:
Private Sub Form_Click() Dim i%,n%,mySum& '定義整型和長整型變量 n =Val(InputBox("請輸入一個數:")) ' 得到輸入的值 mySum=1 '給變量mySum賦初值 Do Until i = n i=i+1 '每循環一次,變量i就加1 mySum=mySum*i '每循環一次,變量mySum就乘以變量i If n>12 Then Exit Do '如果輸入數大于12,就退出循環 Loop Print mySum '輸出計算結果 End Sub
4.Do…Loop Until
Do…Loop Until語句是“直到型循環”的第二種形式。
語法:
Do 循環體1 <Exit Do> 循環體2 Loop Until <循環條件>
該語句的執行流程如圖4.33所示。

圖4.33 Do…Loop Until流程圖
從流程圖可以看出,Do…Loop Until語句的執行過程為:
當程序執行Do…Loop Until語句時,首先執行一次循環體,然后判斷Until后面的<循環條件>,如果其值為False,則返回到循環開始處再次執行循環體;否則跳出循環,執行Loop后面的語句。
學習手冊
注意 因為浮點數和精度問題,兩個看似相等的值實際上可能不精確相等,所以,在構造Do…Loop循環條件時要注意,如果測試的是浮點類型的值,要避免使用相等運算符“=”,應盡量使用運算符“>”或“<”進行比較。
4.4.4 掌握While…Wend循環語句
While…Wend語句只要指定的條件為True,就會重復執行一行或多行語句。可以嵌套使用,但要注意每個Wend語句都與前面最近的While語句匹配。
語法:
While <循環條件> 循環體 Wend
當循環條件的值為True時,執行循環體,否則退出循環,執行Wend后面的語句。While…Wend語句是早期Basic語言的循環語句,它的功能已經完全被Do…Loop語句包括,所以建議實際開發中盡量不用它。
4.4.5 在應用程序中使用多重循環
在一個循環體內又包含了循環結構稱為多重循環或循環嵌套。循環嵌套對For…Next語句、Do…Loop語句均適用。在Visual Basic 6.0中,對嵌套的層數沒有限制,可以嵌套任意多層。嵌套一層稱為二重循環,嵌套兩層稱為三重循環。
學習手冊
說明 ① 外循環必須完全包含內循環,不可以出現交叉現象。
② 內循環與外循環的循環變量名稱不能相同。
下面介紹幾種合法且常用的二重循環形式,如表4.7所示。
表4.7 合法的循環嵌套形式

實例位置:光盤文件\MR\ Instance\4\4.17
【例4.17】 將100元錢換成零錢(5元、10元、20元中的任意多個面值)有很多種換法。
下面通過一個簡單的例子演示兩重For…Next循環,代碼如下。多重循環的道理相同:
第一種形式: Private Sub Form_Click() Dim i%,j% ' 定義整型變量 For i=1 To 3 '外層循環 Print"i=";i '輸出變量i For j=1 To 3 '內層循環 Print Tab;"j=";j '輸出變量j Next j Nex t i End Sub 第二種形式: Private Sub Form_Click() Dim i%,j% ' 定義整型變量 For i=1 To 3 '外層循環 For j=1 To 3 '內層循環 P rint"i=";i;"j=";j '輸出變量i和j Next j Print '輸出空行 Nex t i End Sub
上述兩段程序只是輸出形式不同(即輸出語句上有些區別),運行結果分別如圖4.34和圖4.35所示。從這兩段程序的執行情況可以看出,外層循環執行一次(如i=1),內層循環要從頭循環一遍(如j=1、j=2和j=3)。

圖4.34 多重循環示例(1)

圖4.35 多重循環示例(2)
4.4.6 學會選擇結構與循環結構的嵌套
在Visual Basic 6.0中,所有的控制結構(包括If語句、Select Case語句、Do…Loop語句、For…Next語句等)都可以嵌套使用。
實例位置:光盤文件\MR\ Instance\4\4.18
【例4.18】 將100元錢換成零錢(5元、10元、20元中的任意多個面值)有很多種換法。組成100元的零錢中,最多有20個5元、10個10元和5個20元。判斷所有的組合中,總和正好是100元的,代碼如下。這類方法稱為“窮舉法”,也稱為“列舉法”。
Private Sub Form_Click() Dim x%,y%,z%,n% '定義整型變量 Print"5元個數","10元個數","20元個數" '輸出標題 For x=0 To 20 '5元的個數 For y=0 To 10 '10元的個數 For z=0 To 5 '20元的個數 If 5*x+y*10+z*20=100 Then '滿足條件 n=n+1 '滿足條件的組合數 Print x,y,z '輸出結果 End If Next z Next y Next x Print"共有"&n&"種換法" '輸出滿足條件的組合數 End Sub
上述程序使用了三重For…Next循環,循環計數器變量分別為x、y、z,代表5元、10元和20元的個數,20個5元、10個10元和5個20元之內共有21×11×6=1386種組合,內嵌If…Then判斷總和正好等于100元的只有36種,如圖4.36所示。

圖4.36 兌換零錢
4.4.7 情景應用——起泡排序算法的實現
起泡排序(BubbleSort)就是依次比較相鄰兩個元素,將小數放在前面,大數放在后面。即數列中的第1個元素與第2個元素進行比較,將小數放前,大數放后,然后比較第2個數和第3個數,將小數放前,大數放后,以此類推,直至比較最后兩個數。
實例位置:光盤文件\MR\ Instance\4\4.19
【例4.19】 創建一個Visual Basic應用程序,在一個文本框中輸入一組數字,利用起泡排序算法,在另一個文本框中按照從小到大的順序輸出,要求寫出排序的整個過程。
程序的設計過程如下:
在工程中新建一個窗體,窗體的名稱使用其默認名稱Form1,窗體的Caption屬性設置為“起泡插入排序”,StartUpPosition屬性設置為“2-屏幕中心”。
在窗體上添加兩個Label控件,名稱均使用其默認名稱,并分別設置其Caption屬性為“請輸入數組:”和“按照從小到大的順序排列:”。
在窗體上添加兩個TextBox控件,名稱均使用其默認名稱,BoderStyle屬性均設置為“0-None”,MultiLine屬性均設置為True,Text2控件的ScrollBars屬性設置為“2-Vertical”。
在窗體上添加一個CommandButton控件,名稱使用其默認名稱Command1,Caption屬性設置為“排列”。
程序代碼如下:
Private Sub Command1_Click() Call BubbleSort ' 調用過程 End Sub Private Sub BubbleSort() Dim i,j,h As Integer ' 定義整型變量 Dim r()As String ' 定義字符串變量數組 Dim k As String '定義字符串變量 r()=Split(Text1.Text,",") ' 給數組賦值 Te xt2.Text=Text2.Text&"[初始關鍵字]:" For t=0 To UBound(r) ' 循環語句 Text2.Text=Text2.Text&r(t)&" " '顯示初始關鍵字 Next t Text2.Text=Text2.Text&vbCrLf&vbCrLf '文本框內部換行 For i=0 To UBound(r)–1 '外循環 For j=0 To UBound(r)-i–1 '內循環 If Val(r(j))>Val(r(j+1))Then '判斷條件 k=r(j) '賦值語句 r(j)=r(j+1) '賦值語句 r(j+1)=k '賦值語句 End If Next j '顯示第幾趟排序結果 Text2.Text=Text2.Text&i+1&" 趟排序結果:" For t=0 To UBound(r) Text2.Text=Text2.Text&r(t)&" " Next t Text2.Text=Text2.Text&vbCrLf '文本框內部換行 Next i End Sub
程序的運行結果如圖4.37所示。

圖4.37 起泡排序算法運行結果
4.5 了解其他輔助控制語句
專題講座:光盤文件\MR\Video\4\其他輔助控制語句.exe
視頻速遞:詳細講解Goto語句、With…End With、Exit和End語句用法
本節主要介紹其他輔助控制語句,包括跳轉語句GoTo、復用語句With…End With、退出語句Exit和結束語句End。
4.5.1 跳轉語句GoTo
GoTo語句使程序無條件跳轉到過程中指定的語句行執行。
語法:
GoTo<行號|行標簽>
學習手冊
說明 ① GoTo語句只能跳轉到它所在過程中的行。
② 行標簽是任何字符的組合,不區分大小寫,必須以字母開頭,以冒號“:”結尾,且必須放在行的開始位置。
③ 行號是一個數字序列,且在使用行號的過程中該序列是唯一的。行號必須放在行的開始位置。
④ 太多的GoTo語句,會使程序代碼不容易閱讀及調試。所以應盡可能少用或不用GoTo語句。
例如,在程序中使用GoTo語句,代碼如下:
Private Sub Command1_Click()
GoTo l1
End
Ex it Sub
l1:
Print "沒有退出"
End Sub
當程序執行到GoTo語句時,程序跳轉到l1標簽下的語句去執行,而不執行End語句結束程序。
學習手冊
說明 Exit Sub的作用是立即退出Command1_Click的Sub過程。
4.5.2 復用語句With…End With
With語句是在一個定制的對象或一個用戶定義的類型上執行的一系列語句。
語法:
With <對象> [<語句組>] End With
參數說明:
對象:必要參數。一個對象或用戶自定義類型的名稱。
語句組:可選參數。要在對象上執行的一條或多條語句。
With語句可以嵌套使用,但是外層With語句的對象或用戶自定義類型會在內層的With語句中被屏蔽,所以必須在內層的With語句中使用完整的對象或用戶自定義類型名稱來引用在外層的With語句中的對象或用戶自定義類型。
實例位置:光盤文件\MR\ Instance\4\4.20
【例4.20】 嵌套使用With語句,在窗體Load事件中設置按鈕與窗體的部分屬性,代碼如下:
Private Sub Form_Load() With Form1 '外層With語句 .Height =10000 .Width =10000 With Command1 '內層With語句 .Height =2000 .Width =2000 .Caption = "按鈕高度與寬度都是2000" Form1.Caption = "窗體高度與寬度都是10000" End With End With End Sub
在外層嵌套With語句中直接設置Form1窗體的高度和寬度,在內層嵌套With語句中直接設置Command1按鈕的高度、寬度和顯示的標題。在設置Form1的顯示標題時需要寫入窗體的名稱。
4.5.3 退出語句Exit
Exit語句用來退出Do…Loop、For…Next、Function、Sub或Property代碼塊。Exit語句包括了以下幾種類型。
Exit Do Exit For Exit Function Exit Property Exit Sub
Exit語句中各類型的作用如表4.8所示。
表4.8 Exit語句中各類型的作用

例如,在For…Next循環語句中,當滿足某種條件時退出循環,就可以通過使用Exit For語句實現,程序代碼如下:
Dim I As Long
For I = 1 To 100
If I=50 Then Exit For '當I=50時退出循環
Next I
Debug.Print I 'I 的值為50
4.5.4 結束語句End
End語句用來結束一個過程或塊。End語句與Exit語句容易混淆,Exit語句是用來退出Do…Loop、For…Next、Function、Sub或Property的代碼塊,并不說明一個結構的終止;而End語句是終止一個結構。
語法:
End End Function End If End Property End Select End Sub End Type End With
End語句中各類型的作用如表4.9所示。
表4.9 End語句中各類型的作用

學習手冊
注意 在使用End語句關閉程序時,Visual Basic 6.0不調用Unload、QueryUnload、Terminate事件或任何其他代碼,而是直接終止程序(代碼)執行。
實例位置:光盤文件\MR\ Instance\4\4.21
【例4.21】 下面分別使用End語句與Unload語句關閉程序和窗體。在使用End語句關閉程序時,窗體不發生Unload事件而直接被關閉。在使用Unload語句關閉窗體時,窗體發生Unload事件,調用對話框選擇是否退出程序。
程序代碼如下:
Private Sub Command1_Click() End '退出程序 End Sub Private Sub Command2_Click() Unload Form1 ' 卸載窗體 End Sub Private Sub Form_Unload(Cancel As Integer) If MsgBox("是否退出?", Visual Basic 6.0YesNo, "提示") = Visual Basic 6.0No Then Cancel = 1 End Sub
學習手冊
說明 窗體Unload事件中的Cancel參數是一個整數,決定了窗體是否被關閉。只要Cancel參數值不為0,窗體就不會被關閉。
4.6 實戰練習
4.6.1 求100以內的素數
難度系數:★★★
題目描述
求100以內的素數。本例通過使用循環結構語句實現素數算法,程序運行以后,單擊窗體將100以內的所有素數顯示在窗體上。
本例要實現的就是在程序運行時,用鼠標單擊窗體,在窗體上輸出100以內的素數,程序的運行結果如圖4.38所示。

圖4.38 求100以內的素數
技術指導
素數又稱質數。指在一個大于1的自然數中,除了1和他自身以外,不能被其他自然數整除的數。換句話說,只有兩個正因數(1和其本身)的自然數即為素數。素數在數論中占有很重要的地位。
緊急救援
如果您在做本例題的過程中遇到困難或疑惑,可以按照下面救援通道提供的網址獲取本例題的源碼和技術文檔。
救援通道:http://www.mrbccd.com/VisualBasic/loveVisualBasic/4.6.1
4.6.2 用Do While語句求最大公約數和最小公倍數
難度系數:★★★
題目描述
使用While關鍵字的Do…Loop循環稱為“當型循環”,是指當循環條件的值為True時執行循環。本練習要求開發一個程序,使用Do while語句計算兩個數的最大公約數和最小公倍數,效果如圖4.39所示。

圖4.39 計算兩個自然數的最大公約數和最小公倍數
技術指導
本例主要通過使用最大公約數和最小公倍數的算法來實現。下面介紹實現計算兩個數的最大公約數和最小公倍數的算法。
(1)已知兩個自然數m和n,使得m>n。
(2)m除以n得余數r。
(3)判斷,若r=0,則n是最大公約數,算法結束;否則執行(4)。
(4)將n值賦給m,r值賦給n,重復執行(2)。
最大公約數算法流程圖如圖4.40所示。

圖4.40 最大公約數算法流程圖
這里使用Do While…Loop語句判斷循環條件余數r是否為零,不滿足條件繼續循環。
最小公倍數為兩個自然數的乘積除以這兩個數的最大公約數,即:最小公倍數=兩個數之積/最大公約數。
緊急救援
如果您在做本例題的過程中遇到困難或疑惑,可以按照下面救援通道提供的網址獲取本例題的源碼和技術文檔。
救援通道:http://www.mrbccd.com/VisualBasic/loveVisualBasic/4.6.2
4.6.3 簡單的加密解密算法
難度系數:★★★★
題目描述
將26個英文字母進行加密解密,加密后的字母為該字母向后推五位(即A加密后為F,B加密后為G,……,Z加密后為E)。本練習要求開發一個程序,這里利用For…Next語句分別取出文本框中的每個字母進行加密,結果如圖4.41所示。

圖4.41 加密解密算法運行結果
技術指導
簡單的加密的思想是:將要加密的而每個字母加上或減去一個序數,例如,加上序數5,這時“A”→“F”,“a”→“f”,“B”→“G”,“Y”→“D”,“Z”→“E”。這里要注意對加密后字符范圍超出英文字母范圍時的判斷。
程序中用到了字母的ASCII碼值,通過使用ASC函數和CHR函數進行ASCII碼值和字母的相互轉換。
緊急救援
如果您在做本例題的過程中遇到困難或疑惑,可以按照下面救援通道提供的網址獲取本例題的源碼和技術文檔。
救援通道:http://www.mrbccd.com/VisualBasic/loveVisualBasic/4.6.3
4.7 本章小結
通過本章的學習,讀者可能發現了看似簡單的幾個控制語句能夠構筑出靈活多變的程序流程,因此學好控制語句是掌握好一門語言的基礎。
最后在本章即將結束的時候,筆者對初學者提出幾點要求。
(1)結構必須有入口和出口,即結構的起始語句和終止語句。
(2)結構的控制功能由結構本身決定,控制的依據是條件,控制機理是當前變量的值與預先設定的臨界值進行比較,得到一個邏輯值“真”或“假”,然后根據這一邏輯值選擇程序的執行流程。
(3)在程序中僅有結構語句沒有任何意義,結構中必須“裝”進內容。結構中可以“裝入”任何合法的語句及結構。
(4)在書寫結構時盡量采用縮排格式,以增強代碼的可讀性。
另外,為了提高編程效率,應掌握一些常用編程定式:累加定式、連乘定式、窮舉法等。
- Python快樂編程:人工智能深度學習基礎
- Python 3.7網絡爬蟲快速入門
- 深入淺出Electron:原理、工程與實踐
- Maven Build Customization
- 信息可視化的藝術:信息可視化在英國
- Python從菜鳥到高手(第2版)
- Python爬蟲開發與項目實戰
- Instant 960 Grid System
- Learning Neo4j 3.x(Second Edition)
- MATLAB 2020從入門到精通
- Java面向對象程序設計
- Swift 4從零到精通iOS開發
- Extreme C
- 計算機應用基礎教程(Windows 7+Office 2010)
- .NET 4.5 Parallel Extensions Cookbook