- Visual Basic從入門到精通(第2版)
- 龍馬高新教育策劃 國(guó)家863中部軟件孵化器編著
- 1517字
- 2019-01-02 05:00:29
第3章Visual Basic的秘密—算法和程序控制結(jié)構(gòu)
本章視頻教學(xué)錄像:1小時(shí)2分鐘
算法是問題求解過程的精確描述,因此掌握算法是學(xué)習(xí)程序設(shè)計(jì)的核心,它可以幫助用戶更好、更快地掌握編程思想及編程方法。程序的執(zhí)行就像水在管道中流動(dòng),如果不加以控制,只能從上流到下。任何一種程序設(shè)計(jì)語言都有自己的算法和程序控制結(jié)構(gòu),但大致結(jié)構(gòu)都相似。在Visual Basic中,控制程序執(zhí)行的基本結(jié)構(gòu)有3種:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。本章將詳細(xì)介紹這3種結(jié)構(gòu)的程序控制語句。
本章要點(diǎn)(已掌握的在方框中打鉤)
□ 了解算法基本概念、特性及算法的幾種描述方法
□ 了解結(jié)構(gòu)化程序設(shè)計(jì)
□ 掌握程序的順序結(jié)構(gòu)
□ 掌握程序的選擇結(jié)構(gòu)
□ 掌握程序的循環(huán)結(jié)構(gòu)
□ 了解其他輔助控制語句
3.1 算法
本節(jié)視頻教學(xué)錄像:3分鐘
算法是學(xué)習(xí)程序設(shè)計(jì)的基礎(chǔ),也可以說是程序設(shè)計(jì)的入門知識(shí),掌握算法可以幫助讀者快速理清程序設(shè)計(jì)的思路,找出多種解決問題的方法,從而選擇最合適的解決方案。
1. 什么是算法
“算法”這個(gè)術(shù)語聽起來可能很陌生,其實(shí)大多數(shù)人每天都會(huì)用到許多算法。
我們?cè)绯孔嚿习啵话闱闆r下會(huì)坐公交車上班,但如果時(shí)間來不及或遇到其他特殊情況,可能會(huì)打車上班,這就是一個(gè)“算法”。因此,廣義地講,“算法”就是解決某個(gè)問題或處理某件事的方法和步驟。
2. 算法的特性
一個(gè)算法應(yīng)該具有以下5個(gè)主要特性。
⑴ 有窮性:一個(gè)算法(對(duì)任何合法的輸入)在執(zhí)行有窮步后能夠結(jié)束,并且在有限的時(shí)間內(nèi)完成。
⑵ 確定性:算法中的每一步都有確切的含義。
⑶ 可行性:算法中的操作能夠用已經(jīng)實(shí)現(xiàn)的基本運(yùn)算執(zhí)行有限次來實(shí)現(xiàn)。
⑷ 輸入:一個(gè)算法有零個(gè)或者多個(gè)輸入,零個(gè)輸入就是算法本身確定了初始條件。
⑸ 輸出:一個(gè)算法有一個(gè)或多個(gè)輸出,以反映出數(shù)據(jù)加工的結(jié)果,沒有輸出的算法是沒有意義的。
3. 算法的描述方法
為了讓算法清晰易懂,需要選擇一個(gè)好的描述方法。算法的描述方法有很多,有自然語言、偽代碼、傳統(tǒng)流程圖等。
⑴ 自然語言
自然語言就是用人們?nèi)粘J褂玫恼Z言描述解決問題的方法和步驟,這種描述方法通俗易懂,即使是不熟悉計(jì)算機(jī)語言的人也很容易理解程序。但是,自然語言在語法和語義上往往具有多義性,并且比較繁瑣,對(duì)程序流向等描述不明了、不直觀。
⑵ 偽代碼
偽代碼是介于自然語言和計(jì)算機(jī)語言之間的文字和符號(hào),它與一些高級(jí)編程語言(如Visual C++)類似,但是沒有真正編寫程序時(shí)所要遵循的嚴(yán)格規(guī)則。偽代碼用一種從頂?shù)降住⒁子陂喿x的方式表示算法。在程序開發(fā)期間,偽代碼經(jīng)常用于“規(guī)劃”一個(gè)程序,然后再轉(zhuǎn)換成VB程序。
⑶ 傳統(tǒng)流程圖
傳統(tǒng)流程圖使用不同的幾何圖形來表示不同性質(zhì)的操作,使用流程線來表示算法的執(zhí)行方向。比起前兩種描述方式,它具有直觀形象、邏輯清晰、易于理解等特點(diǎn),但占用篇幅較大,流程隨意轉(zhuǎn)向,較大的流程圖不易讀懂。
3.2 結(jié)構(gòu)化程序設(shè)計(jì)
本節(jié)視頻教學(xué)錄像:4分鐘
結(jié)構(gòu)化程序設(shè)計(jì)(Structured Programming)是進(jìn)行以模塊功能和處理過程設(shè)計(jì)為主的詳細(xì)設(shè)計(jì)的基本原則。
1. 概念
其概念最早由E.W.Dijikstra在1965年提出的,是軟件發(fā)展的一個(gè)重要的里程碑。它的主要觀點(diǎn)是采用自頂向下、逐步求精及模塊化的程序設(shè)計(jì)方法。使用三種基本控制結(jié)構(gòu)構(gòu)造程序,任何程序都可由順序、選擇、循環(huán)三種基本控制結(jié)構(gòu)構(gòu)造。結(jié)構(gòu)化程序設(shè)計(jì)主要強(qiáng)調(diào)的是程序的易讀性。
2. 內(nèi)容
結(jié)構(gòu)化程序設(shè)計(jì)曾被稱為軟件發(fā)展中的第三個(gè)里程碑。該方法的要點(diǎn)是:
⑴ 主張使用順序、選擇、循環(huán)三種基本結(jié)構(gòu)來嵌套連結(jié)成具有復(fù)雜層次的“結(jié)構(gòu)化程序”,嚴(yán)格控制GOTO語句的使用。用這樣的方法編出的程序在結(jié)構(gòu)上具有以下效果。
① 以控制結(jié)構(gòu)為單位,只有一個(gè)入口,一個(gè)出口,所以能獨(dú)立地理解這一部分。
② 能夠以控制結(jié)構(gòu)為單位,從上到下順序地閱讀程序文本。
③ 由于程序的靜態(tài)描述與執(zhí)行時(shí)的控制流程容易對(duì)應(yīng),所以能夠方便正確地理解程序的動(dòng)作。
⑵ “自頂而下,逐步求精”的設(shè)計(jì)思想,其出發(fā)點(diǎn)是從問題的總體目標(biāo)開始,抽象低層的細(xì)節(jié),先專心構(gòu)造高層的結(jié)構(gòu),然后再一層一層地分解和細(xì)化。這使設(shè)計(jì)者能把握主題,高屋建瓴,避免一開始就陷入復(fù)雜的細(xì)節(jié)中,使復(fù)雜的設(shè)計(jì)過程變得簡(jiǎn)單明了,過程的結(jié)果也容易做到正確可靠。
⑶ “獨(dú)立功能,單出、入口”的模塊結(jié)構(gòu),減少模塊的相互聯(lián)系使模塊可作為插件或積木使用,降低程序的復(fù)雜性,提高可靠性。程序編寫時(shí),所有模塊的功能通過相應(yīng)的子程序(函數(shù)或過程)的代碼來實(shí)現(xiàn)。程序的主體是子程序?qū)哟螏欤c功能模塊的抽象層次相對(duì)應(yīng),編碼原則使得程序流程簡(jiǎn)潔、清晰,增強(qiáng)可讀性。
3. 基本結(jié)構(gòu)
結(jié)構(gòu)化程序設(shè)計(jì)的三種基本結(jié)構(gòu)是:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。
⑴ 順序結(jié)構(gòu)
順序結(jié)構(gòu)表示程序中的各操作是按照它們出現(xiàn)的先后順序執(zhí)行的。
⑵ 選擇結(jié)構(gòu)
選擇結(jié)構(gòu)表示程序的處理步驟出現(xiàn)了分支,它需要根據(jù)某一特定的條件選擇其中的一個(gè)分支執(zhí)行。選擇結(jié)構(gòu)有單選擇、雙選擇和多選擇三種形式。
⑶ 循環(huán)結(jié)構(gòu)
循環(huán)結(jié)構(gòu)表示程序反復(fù)執(zhí)行某個(gè)或某些操作,直到某條件為假(或?yàn)檎妫r(shí)才可終止循環(huán)。在循環(huán)結(jié)構(gòu)中最主要的是:什么情況下執(zhí)行循環(huán),哪些操作需要循環(huán)執(zhí)行。循環(huán)結(jié)構(gòu)的基本形式有兩種:當(dāng)型循環(huán)和直到型循環(huán)。
當(dāng)型循環(huán):表示先判斷條件,當(dāng)滿足給定的條件時(shí)執(zhí)行循環(huán)體,并且在循環(huán)終端處流程自動(dòng)返回到循環(huán)入口;如果條件不滿足,則退出循環(huán)體直接到達(dá)流程出口處。因?yàn)槭恰爱?dāng)條件滿足時(shí)執(zhí)行循環(huán)”,即先判斷后執(zhí)行,所以稱為當(dāng)型循環(huán)。
直到型循環(huán):表示從結(jié)構(gòu)入口處直接執(zhí)行循環(huán)體,在循環(huán)終端處判斷條件,如果條件不滿足,返回入口處繼續(xù)執(zhí)行循環(huán)體,直到條件為真時(shí)再退出循環(huán)到達(dá)流程出口處,是先執(zhí)行后判斷。因?yàn)槭恰爸钡綏l件為真時(shí)為止”,所以稱為直到型循環(huán)。
4. 設(shè)計(jì)方法
⑴ 自頂向下
程序設(shè)計(jì)時(shí),應(yīng)先考慮總體,后考慮細(xì)節(jié);先考慮全局目標(biāo),后考慮局部目標(biāo)。不要一開始就過多追求眾多的細(xì)節(jié),先從最上層總目標(biāo)開始設(shè)計(jì),逐步使問題具體化。
⑵ 逐步細(xì)化
對(duì)復(fù)雜問題,應(yīng)設(shè)計(jì)一些子目標(biāo)作為過渡,逐步細(xì)化。
⑶ 模塊化
一個(gè)復(fù)雜問題,肯定是由若干稍簡(jiǎn)單的問題構(gòu)成。模塊化是把程序要解決的總目標(biāo)分解為子目標(biāo),再進(jìn)一步分解為具體的小目標(biāo),把每一個(gè)小目標(biāo)稱為一個(gè)模塊。
5. 優(yōu)缺點(diǎn)
⑴ 優(yōu)點(diǎn)
由于模塊相互獨(dú)立,因此在設(shè)計(jì)其中一個(gè)模塊時(shí),不會(huì)受到其他模塊的牽連,因而可將原來較為復(fù)雜的問題化簡(jiǎn)為一系列簡(jiǎn)單模塊的設(shè)計(jì)。模塊的獨(dú)立性還為擴(kuò)充已有的系統(tǒng)、建立新系統(tǒng)帶來了不少的方便,因?yàn)槲覀兛梢猿浞掷矛F(xiàn)有的模塊做積木式的擴(kuò)展。
按照結(jié)構(gòu)化程序設(shè)計(jì)的觀點(diǎn),任何算法功能都可以通過由程序模塊組成的三種基本程序結(jié)構(gòu)的組合:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)來實(shí)現(xiàn)。
結(jié)構(gòu)化程序設(shè)計(jì)的基本思想是采用“自頂向下,逐步求精”的程序設(shè)計(jì)方法和“單入口單出口”的控制結(jié)構(gòu)。自頂向下、逐步求精的程序設(shè)計(jì)方法從問題本身開始,經(jīng)過逐步細(xì)化,將解決問題的步驟分解為由基本程序結(jié)構(gòu)模塊組成的結(jié)構(gòu)化程序框圖;“單入口單出口”的思想認(rèn)為一個(gè)復(fù)雜的程序,如果它僅是由順序、選擇和循環(huán)三種基本程序結(jié)構(gòu)通過組合、嵌套構(gòu)成,那么這個(gè)新構(gòu)造的程序一定是一個(gè)單入口單出口的程序。據(jù)此就很容易編寫出結(jié)構(gòu)良好、易于調(diào)試的程序來。
① 整體思路清楚,目標(biāo)明確。
② 設(shè)計(jì)工作中階段性非常強(qiáng),有利于系統(tǒng)開發(fā)的總體管理和控制。
③ 在系統(tǒng)分析時(shí)可以診斷出原系統(tǒng)中存在的問題和結(jié)構(gòu)上的缺陷。
⑵ 缺點(diǎn)
① 用戶要求難以在系統(tǒng)分析階段準(zhǔn)確定義,致使系統(tǒng)在交付使用時(shí)產(chǎn)生許多問題。
② 用系統(tǒng)開發(fā)每個(gè)階段的成果來進(jìn)行控制,不能適應(yīng)事物變化的要求。
③ 系統(tǒng)的開發(fā)周期長(zhǎng)。
3.3 順序結(jié)構(gòu)
本節(jié)視頻教學(xué)錄像:1分鐘
順序結(jié)構(gòu)是指程序按照語句出現(xiàn)的先后次序執(zhí)行。可以把順序結(jié)構(gòu)想像成一個(gè)沒有分支的管道,把數(shù)據(jù)想像成水流,數(shù)據(jù)從入口進(jìn)入后,依次執(zhí)行每一條語句直到結(jié)束。流程如圖所示。

在Visual Basic中賦值語句、注釋語句、輸入語句、輸出語句、變量定義語句等都屬于順序結(jié)構(gòu)功能的語句。這些語句本身沒有控制和改變程序結(jié)構(gòu)的能力,它們?cè)谡Z句中出現(xiàn)的順序就是執(zhí)行的順序。
3.3.1 賦值運(yùn)算符
賦值運(yùn)算符用來為變量或事件的屬性賦值。程序的計(jì)算實(shí)質(zhì)上是數(shù)據(jù)的計(jì)算,而數(shù)據(jù)依存于各種變量、屬性值等里面,我們通過賦值運(yùn)算符把數(shù)據(jù)和變量、屬性值等關(guān)聯(lián)起來從而進(jìn)行實(shí)際計(jì)算。賦值運(yùn)算符的常見語法形式是:
變量名 = 表達(dá)式 對(duì)象名.屬性 = 表達(dá)式
賦值運(yùn)算符中的等號(hào)并不是表示等號(hào)兩邊的值是相等的,而是將等號(hào)右邊的值賦給等號(hào)左邊的變量或?qū)傩浴H绻忍?hào)右邊是一個(gè)表達(dá)式,則會(huì)先執(zhí)行這個(gè)表達(dá)式,執(zhí)行完畢將執(zhí)行結(jié)果賦給等號(hào)左邊的變量或?qū)傩浴?/p>
下面兩個(gè)是正確的賦值運(yùn)算符表達(dá)式。
a=a+1 '把數(shù)值變量a加1后賦給變量a Command1.Caption="確定" '把字符串“確定”賦給Command1的Caption屬性
下面兩個(gè)是錯(cuò)誤的賦值運(yùn)算符表達(dá)式。
6=a+b '錯(cuò)誤原因:賦值符號(hào)左邊不能是常量 a+b=6 '錯(cuò)誤原因:賦值符號(hào)左邊不能是表達(dá)式
3.3.2 數(shù)據(jù)的輸入與輸出
1. 數(shù)據(jù)的輸入
Visual Basic中的數(shù)據(jù)輸入主要通過文本框控件、列表框、組合框、復(fù)選框等控件以及InputBox函數(shù)來實(shí)現(xiàn)。控件的使用在后續(xù)篇章中將詳細(xì)介紹,這里主要介紹InputBox函數(shù)的用法。InputBox函數(shù)是用來接收用戶通過鍵盤輸入的數(shù)據(jù)。調(diào)用InputBox函數(shù)的格式如下。
Var=InputBox (<提示>[,對(duì)話框標(biāo)題][,編輯框中默認(rèn)值][,x坐標(biāo)][,y坐標(biāo)][,幫助文件名,幫助 主題號(hào)])
功能:打開一個(gè)對(duì)話框,等待用戶輸入內(nèi)容,當(dāng)用戶單擊【確定】按鈕或按【Enter】鍵,函數(shù)返回輸入的值,其值的類型為字符串。參數(shù)說明如下。
⑴ 提示:不能省略該項(xiàng)。字符串表達(dá)式,在對(duì)話框中作為信息顯示,可為漢字;若要多行顯示,必須在每行行末加回車Chr(13)和換行Chr(10)控制符或vbCrLf符號(hào)常數(shù)。
⑵ 對(duì)話框標(biāo)題:字符串表達(dá)式,在對(duì)話框的標(biāo)題區(qū)顯示;若省略,則把應(yīng)用程序名放入標(biāo)題欄中。
⑶ 編輯框中默認(rèn)值:字符串表達(dá)式,當(dāng)輸入對(duì)話框中無輸入時(shí),則該默認(rèn)值作為輸入的內(nèi)容。
⑷ x坐標(biāo)、y坐標(biāo):整型表達(dá)式,坐標(biāo)確定對(duì)話框左上角在屏幕上的位置,屏幕左上角為坐標(biāo)原點(diǎn)。
例如:下面程序?qū)崿F(xiàn)從鍵盤接收一個(gè)字符串,并將其顯示在窗體上。
Private Sub Form_Click()
Dim num As String num = lnputBox(“請(qǐng)輸入學(xué)號(hào)”,“示例”) Print num End Sub
上述程序?qū)⒂脩舻妮斎腼@示在窗體上,運(yùn)行效果如圖所示。

InputBox函數(shù)接收輸入

InputBox函數(shù)顯示輸入
當(dāng)用戶輸入完成后單擊左圖中的【確定】按鈕,表示輸入成功,用戶輸入的數(shù)據(jù)將被賦值到變量num中,使用Print函數(shù)可以顯示在窗體上。如果單擊【取消】按鈕,則輸入失敗。
2. 數(shù)據(jù)的輸出
Visual Basic中,數(shù)據(jù)的輸出主要有Print方法、MsgBox函數(shù)和控件輸出3種方式。一般來說,Print方法主要輸出在特定控件上,例如Form.Print,即輸出在窗體上;MsgBox函數(shù)則以對(duì)話框的形式輸出信息;而控件輸出主要是指輸出在數(shù)據(jù)控件上,例如Label1.Caption="Visual Basic"。下面通過示例看一下這3種輸出的形式。例如,用Print方法、MsgBox函數(shù)和控件輸出3種方式輸出a中的數(shù)據(jù)。
在窗體上使用Print方法輸出數(shù)據(jù)的輸出格式為:
Print變量
使用MsgBox函數(shù)的簡(jiǎn)單輸出格式為:
MsgBox變量
使用Label控件的輸出即使用其Caption標(biāo)題屬性,使用格式為:
Label1.Caption = 變量
這3種方式在后續(xù)的章節(jié)中都將詳細(xì)介紹。
該示例的實(shí)現(xiàn)代碼如下。
Private Sub Form_Click() Dim a As String a = lnputBox("請(qǐng)輸入a的值","示例") Print a 'Print方法輸出 MsgBox"a"="&a 'MsgBox函數(shù)輸出 Label1.Caption=a '標(biāo)簽控件輸出 End Sub
該程序執(zhí)行效果如圖所示。

Print方法輸出

標(biāo)簽控件輸出
程序執(zhí)行時(shí),先由用戶在輸入框InputBox中輸入a的值,再分別用Print方法、MsgBox輸出和Label控件輸出在窗體上。控件的輸出將結(jié)合具體的控件,除了Label標(biāo)簽控件外,還有許多如TextBox文本框輸出、Image圖片框輸出等,這些將在以后的章節(jié)中詳細(xì)講解,此處只介紹前兩種方法。
3.4 選擇結(jié)構(gòu)
本節(jié)視頻教學(xué)錄像:16分鐘
選擇結(jié)構(gòu)是通過對(duì)給定的條件進(jìn)行判斷,然后根據(jù)判斷結(jié)果執(zhí)行不同任務(wù)的一種程序結(jié)構(gòu)。Visual Basic中的If條件語句和多分支條件語句(Select)是最為常用的兩種條件語句。條件語句和多分支條件語句的流程如圖所示。


3.4.1 If條件語句
If語句的常見語法格式是:
lf條件表達(dá)式Then 語句1 語句2 …
End lf
If…Then…翻譯成中文就是:“如果……就……”。所以上面的代碼意思是如果If后面的條件表達(dá)式成立的話,就執(zhí)行Then下面的語句,否則就什么都不做。
如果希望再加一個(gè)選擇分支,可以使用If…Then…Else的語法格式:
lf條件表達(dá)式Then 語句1 Else 語句2 End lf
加上Else以后的代碼意思是如果If后面的條件表達(dá)式成立的話,就執(zhí)行Then下面的語句,否則執(zhí)行Else后面的語句。
3.4.2 Select case語句
If語句主要用于單分支或者雙分支的判斷性選擇結(jié)構(gòu),雖然也可以用形如If…Then…ElseIf…ElseIf…ElseIf…Else這樣的語法來實(shí)現(xiàn)多分支的選擇結(jié)構(gòu),但是這顯然太麻煩了,Select語句是更為方便和有效的一種辦法。Select語句的語法是:
Select Case <條件表達(dá)式> Case <表達(dá)式列表1> <語句塊1> Case <表達(dá)式列表2> <語句塊2> … [Case Else <語句塊n>] End Select
上述語句中的條件表達(dá)式可以是數(shù)值表達(dá)式或字符串表達(dá)式,一般為變量。表達(dá)式列表則是表明條件表達(dá)式的可能取值,表達(dá)式列表有以下3種形式。
⑴ 逗號(hào)分隔的多個(gè)表達(dá)式。例如:
Case 1,2,3 '表達(dá)式的值是1、2或者3
⑵ <表達(dá)式1> To <表達(dá)式2>。例如:
Case 1 to 10 '表達(dá)式的值介于1到10之間
⑶ Is <關(guān)系操作符> <表達(dá)式1>。例如:
ls<10 '表達(dá)式的值小于10
【范例3-1】 在文本框中輸入一個(gè)數(shù)值型數(shù)字,單擊【Command】按鈕后,判斷該數(shù)字的奇偶性。
⑴ 啟動(dòng)Visual Basic 6.0,在彈出的【新建工程】對(duì)話框中選擇【標(biāo)準(zhǔn)EXE】圖標(biāo),然后單擊【打開】按鈕。
⑵ 用鼠標(biāo)雙擊工具箱中的【TextBox】按鈕,在Form1窗體上添加一個(gè)文本框控件,并用鼠標(biāo)雙擊工具箱中的【CommandButton】按鈕
,添加一個(gè)按鈕控件。

⑶ 雙擊Command1控件,進(jìn)入代碼窗口,輸入以下代碼(代碼3-1.txt)。
01 Private Sub Command1_Click() 02 Dim a As lnteger'定義一個(gè)整型變量 03 a=Val(Text1.Text) '得到輸入的整數(shù) 04 lf a Mod 2=0 Then '判斷能否被2整除 05 Print a&"是偶數(shù)" '可以被2整除是偶數(shù) 06 Else 07 Print a&"是奇數(shù)" '不可以被2整除是奇數(shù) 08 End lf '退出條件判斷 09 End Sub
注意
第3行使用了一個(gè)Val函數(shù),Val函數(shù)是將文本框中的字符串型的數(shù)字轉(zhuǎn)換為整型。
【運(yùn)行結(jié)果】
保存程序,單擊【啟動(dòng)】按鈕,運(yùn)行程序。清空文本框中的內(nèi)容,輸入數(shù)字“3”,單擊【Command1】按鈕,窗體上顯示“3是奇數(shù)”。清空文本框中的內(nèi)容,輸入數(shù)字“6”,單擊【Command1】按鈕,窗體上顯示“6是偶數(shù)”。


【拓展訓(xùn)練3-1】
在文本框中輸入學(xué)生的考試成績(jī),采用多分支條件語句對(duì)學(xué)生分?jǐn)?shù)進(jìn)行評(píng)定,判斷其優(yōu)良性。
學(xué)會(huì)了使用If條件語句的判斷方法,可以嘗試使用多分支條件語句來控制程序的運(yùn)行。可以將【范例3-1】中步驟⑶的代碼修改如下(拓展代碼3-1.txt)。
01 Private Sub Command1_Click() 02 Dim x As Single,y As Single '定義兩個(gè)單精度類型的變量 03 x=Val(Text1.Text) '獲取輸入的整數(shù) 04 Select Case x '進(jìn)行多條件分支判斷 05 Case 0 To 59 '如果輸入的數(shù)為0~50之間的數(shù) 06 Print"不及格" '輸出"不及格"字樣 07 Case 60 To 70 '如果輸入的數(shù)為60~70之間的數(shù) 08 Print"中等" '輸出"中等"字樣 09 Case 70 To 80 '如果輸入的數(shù)為70~80之間的數(shù) 10 Print"良好" '輸出"良好"字樣 11 Case 81 To 100'如果輸入的數(shù)為81~100之間的數(shù) 12 Print"優(yōu)秀" '輸出"優(yōu)秀"字樣 13 End Select '結(jié)束判斷 14 End Sub
運(yùn)行后,清空文本框內(nèi)容,輸入“90”,單擊【Command1】按鈕,窗體上顯示“優(yōu)秀”。再次清空文本框內(nèi)容,輸入“50”,單擊【Command1】按鈕,窗體上顯示“不及格”。


3.4.3 條件函數(shù)
在Visual Basic中,除了上述這幾種分支語句外,還有兩個(gè)條件函數(shù)值得讀者注意:IIF函數(shù)和Choose函數(shù)。
IIF函數(shù)用于替代IF函數(shù),適用于簡(jiǎn)單的判斷場(chǎng)合。其調(diào)用格式為:IIf (表達(dá)式,當(dāng)表達(dá)式的值為Ture時(shí)的值,當(dāng)表達(dá)式的值為False時(shí)的值)。其功能與If...Then...Else選擇結(jié)構(gòu)相同。
例如,求x,y中大的數(shù),放入max變量中,語句如下。
max = llf(x > y, x, y)
上述代碼等同于下列代碼。
lf x>y Then
max=x Else max=y End lf
因此,IIF函數(shù)可以作為If...Then...Else結(jié)構(gòu)的簡(jiǎn)介形式來書寫。
Choose函數(shù)用于替代Select Case語句,也適用于簡(jiǎn)單的判斷場(chǎng)合。其調(diào)用格式為:
Choose(整數(shù)表達(dá)式,選項(xiàng)列表)
功能為:根據(jù)整數(shù)表達(dá)式的值來決定返回選項(xiàng)列表中的某個(gè)值。如果整數(shù)表達(dá)式值是1,則Choose會(huì)返回列表中的第1個(gè)選項(xiàng);如果整數(shù)表達(dá)式值是2,則會(huì)返回列表中的第2個(gè)選項(xiàng),依此類推。若整數(shù)表達(dá)式的值小于1或大于列出的選項(xiàng)數(shù)目時(shí),Choose函數(shù)返回Null。
例如,根據(jù)當(dāng)前日期函數(shù)Now、WeekDay,利用Choose函數(shù)顯示今日是星期幾的形式。
Private Sub Form_Click( ) Print "今天是:";Now t =Choose(Weekday(Now),"星期日","星期一","星期二","星期三","星期四","星期五","星期六") Print"是:";t End Sub
上述程序中,函數(shù)Weekday(Now)獲取當(dāng)前是星期幾的一個(gè)數(shù)字,根據(jù)Choose函數(shù)返回具體的中文星期幾顯示。其執(zhí)行效果如圖所示。

上述代碼等同于如下程序。
Private Sub Form_Click( ) Print"今天是:";Now t =Weekday(Now) Print t Select Case t Case 1 t = "星期日" Case 2 t = "星期一" Case 3 t = "星期二" Case 4 t = "星期三" Case 5 t = "星期四" Case 6 t = "星期五" Case 7 t = "星期六" End Select Print "是:";t End Sub
同樣地,Choose函數(shù)使Select Case語句的應(yīng)用簡(jiǎn)單化了。在實(shí)際的使用中,讀者可根據(jù)情況自行選擇使用哪種方式。
3.5 循環(huán)結(jié)構(gòu)
本節(jié)視頻教學(xué)錄像:15分鐘
當(dāng)程序需要重復(fù)執(zhí)行一些任務(wù)時(shí),就可以考慮采用循環(huán)結(jié)構(gòu)。例如重復(fù)100次加減乘除,數(shù)組中的每個(gè)整數(shù)加1等。當(dāng)然可以為每次的任務(wù)都編寫一條語句,但是這樣就違背了使用計(jì)算機(jī)的初衷:“使用計(jì)算機(jī)的目的就是為了減輕工作量,而不是增加工作量。”對(duì)于這些重復(fù)的任務(wù),可以使用Visual Basic中的循環(huán)結(jié)構(gòu)很輕松地完成。
提示
Visual Basic中的循環(huán)結(jié)構(gòu)是指通過計(jì)算機(jī)來實(shí)現(xiàn)重復(fù)執(zhí)行某任務(wù)的程序結(jié)構(gòu)。循環(huán)結(jié)構(gòu)可以減少源程序重復(fù)書寫的工作量,用來描述重復(fù)執(zhí)行某段算法的問題,這是程序設(shè)計(jì)中最能發(fā)揮計(jì)算機(jī)特長(zhǎng)的程序結(jié)構(gòu),Visual Basic中所提供的各種循環(huán)可以用來處理同一問題,一般情況下它們可以互相替換。
3.5.1 For循環(huán)語句
For循環(huán)又叫作計(jì)數(shù)循環(huán),如果能夠預(yù)知循環(huán)的次數(shù),就可以預(yù)先設(shè)定計(jì)數(shù)循環(huán)的所計(jì)數(shù)值。For循環(huán)的語法是:
For循環(huán)變量=初值To終值 [Step步長(zhǎng)] [語句塊] [Exit For] [語句塊] Next [循環(huán)變量]
在For循環(huán)語句中,循環(huán)變量、初值、終值和步長(zhǎng)等都是數(shù)值型數(shù)據(jù),如果步長(zhǎng)沒有指定,則默認(rèn)值為1。步長(zhǎng)可以為正,也可以為負(fù)。若為正,則初值應(yīng)小于或等于終值;若為負(fù),則初值應(yīng)大于或等于終值,這樣才能保證執(zhí)行循環(huán)體內(nèi)的語句;若為0,則循環(huán)永不結(jié)束(死循環(huán))。For循環(huán)語句的流程如圖所示。

3.5.2 Do...Loop循環(huán)語句
Do循環(huán)分為先判斷條件的Do…Loop循環(huán)和后判斷條件的Do…Loop循環(huán)兩種。先判斷條件的Do…Loop循環(huán)的語法是:
Do While條件表達(dá)式 語句塊 Loop
或者
Do Until條件表達(dá)式 語句塊 Loop
后判斷條件的Do…Loop循環(huán)的語法是:
Do 語句塊 Loop While條件表達(dá)式
條件循環(huán)結(jié)構(gòu)的流程如圖所示。

3.5.3 循環(huán)的嵌套
循環(huán)的嵌套,就是在一個(gè)循環(huán)體內(nèi)含有其他循環(huán)結(jié)構(gòu)的循環(huán)體。在實(shí)際問題中,有些單靠一個(gè)循環(huán)是無法很好解決的,例如對(duì)二維甚至多維數(shù)組的遍歷,這時(shí)我們使用在循環(huán)中再嵌套循環(huán)的方式來實(shí)現(xiàn)一些復(fù)雜的邏輯。
【范例3-2】 在文本框中輸入一個(gè)數(shù)值型數(shù)字,通過使用計(jì)數(shù)循環(huán)結(jié)構(gòu)方法,來計(jì)算所輸入數(shù)值型數(shù)字的階乘。
⑴ 啟動(dòng)Visual Basic 6.0,在彈出的【新建工程】對(duì)話框中選擇【標(biāo)準(zhǔn)EXE】圖標(biāo),然后單擊【打開】按鈕。
⑵ 用鼠標(biāo)雙擊工具箱中的【TextBox】按鈕,在Form1窗體上添加一個(gè)文本框控件,并用鼠標(biāo)雙擊工具箱中的【CommandButton】按鈕
,添加一個(gè)按鈕控件。

⑶ 雙擊Command1控件,進(jìn)入代碼窗口,輸入以下代碼(代碼3-2.txt)。
01 Private Sub Command1_Click() 02 Dim i,x As lnteger,s As Double '定義兩個(gè)整型變量和一個(gè)雙精度型變量 03 x=Val(Text1.Text) '獲取輸入的數(shù)值 04 s=1 '給變量s賦初值1 05 For i=1 To x '條件符合,利用循環(huán)結(jié)構(gòu)進(jìn)行計(jì)算 06 s=s*i '累積 07 Next i '進(jìn)行下一輪循環(huán) 08 Print x;"的階乘為";s; '輸入最終結(jié)果 09 End Sub
【代碼詳解】
第02行定義了兩個(gè)整型變量i和x,同時(shí)定義了一個(gè)雙精度型的變量s。其中,變量i主要用于循環(huán)語句的初始值,變量x主要用于獲得文本框中所輸入的數(shù)值,變量s主要用于每一次計(jì)算后的結(jié)果。
第05~07行主要進(jìn)行For循環(huán)來計(jì)算獲得數(shù)值的階乘數(shù)。例如在文本框中輸入一個(gè)數(shù)值3,那么代碼執(zhí)行到第03行時(shí),將其轉(zhuǎn)換為數(shù)值型的數(shù),以便進(jìn)行數(shù)值的計(jì)算。當(dāng)代碼執(zhí)行到For i=1 To x時(shí),此時(shí)x為3,首先判斷當(dāng)前i的值是否大于x的值,如果大于,則停止循環(huán),如果小于,則開始進(jìn)行第1次循環(huán),計(jì)算s=1×1,此時(shí)s的結(jié)果值為1。然后執(zhí)行代碼Next i語句,將i的值加1,并判斷是否大于3,如果不大于,執(zhí)行第2次循環(huán),此時(shí)s的值變?yōu)?×2,得到最終的結(jié)果值為2。然后再次將i的值加1,i的值變?yōu)榱?,并判斷當(dāng)前i的值是否大于3,不大于繼續(xù)執(zhí)行循環(huán)體,s的值變?yōu)榱?×3。然后再次將i的值加1,此時(shí)i的值為4,已經(jīng)大于3,所以退出循環(huán)體。執(zhí)行最后一行代碼語句,將結(jié)果輸出出來。
提示
在使用For循環(huán)時(shí),如果需要在代碼執(zhí)行過程中停止當(dāng)前循環(huán),可以使用Exit For語句退出當(dāng)前循環(huán)。
【運(yùn)行結(jié)果】
保存程序,單擊【啟動(dòng)】按鈕,運(yùn)行程序。清空文本框中的內(nèi)容,輸入數(shù)字“6”,單擊【Command1】按鈕,窗體上顯示“6的階乘為720”。

【拓展訓(xùn)練3-2】
利用嵌套循環(huán)方法編寫代碼,運(yùn)行程序后,單擊窗體顯示出九九乘法表。
條件循環(huán)結(jié)構(gòu)與計(jì)數(shù)循環(huán)結(jié)構(gòu)的用法類似,下面來嘗試一下使用嵌套循環(huán)顯示出九九乘法表。
首先新建一個(gè)工程,在窗體上添加一個(gè)按鈕控件,雙擊按鈕控件,進(jìn)入代碼窗口,輸入以下代碼(拓展代碼3-2.txt)。
01 Private Sub Command1_Click() 02 Dim i,j As lnteger '定義兩個(gè)整型變量 03 For i=1 To 9 '用For循環(huán),打印9行內(nèi)容 04 j=1 '為變量j賦初值 05 Do While j<=l '用Do循環(huán),打印每一列中的內(nèi)容 06 Print i;"*";j;"=";i*j, '輸出每一列的內(nèi)容 07 j=j+1 '增加行數(shù) 08 Loop '滿足條件,繼續(xù)內(nèi)部循環(huán) 09 Print '打印空行,起換行作用 10 Next i '滿足條件,繼續(xù)外部循環(huán) 11 End Sub
運(yùn)行后,單擊【Command1】按鈕,即可顯示出九九乘法表。

3.6 其他輔助控制語句
本節(jié)視頻教學(xué)錄像:11分鐘
除了上面提到的幾種語句外,Visual Basic還提供了其他一些輔助控制語句。下面簡(jiǎn)單介紹其用法。
3.6.1 End結(jié)束語句
End語句可以結(jié)束一個(gè)過程或塊,獨(dú)立的End語句用于結(jié)束一個(gè)程序的運(yùn)行,可以放在任何事件過程中。該語句使用形式如下。
End
此外,在Visual Basic 6.0中,還有多種形式的End語句,用于結(jié)束一個(gè)過程或塊,主要形式包括End If、End Select、End With、End Type、End Function、End Sub等,與對(duì)應(yīng)的語句配對(duì)使用。End語句在各種代碼塊中的格式及作用如下表所示。

End語句用于停止執(zhí)行過程或塊,可以在過程中的任何位置關(guān)閉代碼的執(zhí)行。在執(zhí)行時(shí),End語句會(huì)重置所有模塊級(jí)別變量和所有模塊的靜態(tài)局部變量。若要保留這些變量的值,改為使用Stop語句,則可以在保留這些變量值的基礎(chǔ)上恢復(fù)執(zhí)行。
注意
End語句不調(diào)用Unload、QueryUnload或Terminate事件或任何其他Visual Basic代碼,只是生硬地終止代碼的執(zhí)行,并且釋放程序所占用的內(nèi)存資源。
3.6.2 Exit退出語句
Exit語句為退出語句。其調(diào)用形式有如下幾種:Exit For、Exit Do、Exit Sub、Exit Function,其功能都為退出某種控制結(jié)構(gòu)的執(zhí)行。
⑴ Exit For:退出For循環(huán)結(jié)構(gòu)。用于中途跳出For循環(huán),可以直接使用,也可以用條件判斷語句加以限制,在滿足某個(gè)條件時(shí)才能執(zhí)行此語句,跳出For循環(huán)。例如,在For循環(huán)內(nèi)部添加語句“If條件Then Exit For”。
⑵ Exit Do:退出Do Loop循環(huán)結(jié)構(gòu)。用于中途跳出Do循環(huán),與上述類似,既可以直接使用,也可以用條件判斷語句限制使用。
⑶ Exit Sub:退出Sub過程。用于中途跳出Sub過程,既可以直接使用,也可以用條件判斷語句限制使用。
⑷ Exit Function:退出Function函數(shù)。用于中途跳出Function過程,可以直接使用,也可以用條件判斷語句限制使用。
3.6.3 GoTo跳轉(zhuǎn)語句
GoTo語句是無條件程序跳轉(zhuǎn)語句,其功能是無條件地轉(zhuǎn)移到標(biāo)號(hào)或行號(hào)指定的一行語句。該語句使用形式如下。
GoTo {標(biāo)號(hào)|行號(hào)}
在使用上述形式的GoTo語句跳轉(zhuǎn)到某一個(gè)標(biāo)號(hào)的代碼時(shí),應(yīng)注意如下問題。
⑴ GoTo語句只能轉(zhuǎn)移到同一過程的標(biāo)號(hào)或行號(hào)處。標(biāo)號(hào)是一個(gè)字符序列,首字符必須為字母,與大小寫無關(guān),任何轉(zhuǎn)移到的標(biāo)號(hào)后應(yīng)有冒號(hào)。
⑵ 行號(hào)是一個(gè)數(shù)字序列。
⑶ 結(jié)構(gòu)化程序設(shè)計(jì)中要求盡量少用或不用GoTo語句,用選擇結(jié)構(gòu)或循環(huán)結(jié)構(gòu)來代替。
提示
Goto語句在使用上爭(zhēng)議很大。因?yàn)镚oto語句使用起來比較靈活,而且有些情形能夠提高程序的效率,使得很多開發(fā)人員喜歡使用該語句。但是Goto語句使程序的靜態(tài)結(jié)構(gòu)和程序的動(dòng)態(tài)執(zhí)行之間差別很大,造成程序難以閱讀,難以查錯(cuò)。
3.6.4 On Error語句
On Error語句用于啟動(dòng)一個(gè)錯(cuò)誤處理程序并指定該子程序在一個(gè)過程中的位置,也可用來禁止一個(gè)錯(cuò)誤處理程序。
語法有On Error GoTo line 、On Error Resume Next、On Error GoTo 0等。
On Error語句的語法可以具有以下任何一種形式的語句描述。
1. On Error GoTo line
啟動(dòng)錯(cuò)誤處理程序,且該歷程從必要的line參數(shù)中指定的line開始。line參數(shù)可以是任何行標(biāo)簽或行號(hào)。如果發(fā)生一個(gè)運(yùn)行時(shí)錯(cuò)誤,則控件會(huì)跳到line,激活錯(cuò)誤處理程序。指定的line必須在一個(gè)過程中,這個(gè)過程與On Error語句相同,否則會(huì)發(fā)生編譯時(shí)間錯(cuò)誤。
2. On Error Resume Next
說明當(dāng)一個(gè)程序運(yùn)行時(shí)發(fā)生錯(cuò)誤時(shí),控件轉(zhuǎn)到緊接著發(fā)生錯(cuò)誤的語句之后的語句,并在此繼續(xù)運(yùn)行。訪問對(duì)象時(shí)要使用這種形式而不使用On Error GoTo。
3. On Error GoTo 0
禁止當(dāng)前過程中任何已啟動(dòng)的錯(cuò)誤處理程序。
說明:如果不使用On Error語句,則任何運(yùn)行時(shí)錯(cuò)誤都是致命的。也就是說,結(jié)果會(huì)導(dǎo)致顯示錯(cuò)誤信息并中止運(yùn)行。一個(gè)“允許的”錯(cuò)誤處理程序是由On Error語句打開的一個(gè)處理程序,一個(gè)“活動(dòng)的”錯(cuò)誤處理程序是處理錯(cuò)誤的過程中允許的錯(cuò)誤處理程序。如果在錯(cuò)誤處理程序處于活動(dòng)狀態(tài)時(shí)(在發(fā)生錯(cuò)誤和執(zhí)行Resume、Exit Sub、Exit Function或Exit Property語句之間這段時(shí)間)又發(fā)生錯(cuò)誤,則當(dāng)前過程的錯(cuò)誤處理程序?qū)o法處理這個(gè)錯(cuò)誤。控件返回調(diào)用的過程。如果調(diào)用過程有一個(gè)已啟動(dòng)的錯(cuò)誤處理程序,則激活錯(cuò)誤處理程序來處理該錯(cuò)誤。如果調(diào)用過程的錯(cuò)誤處理程序也是活動(dòng)的,則控件將再往回傳到前面的調(diào)用過程,這樣一直進(jìn)行下去,直到找到一個(gè)被允許的但不是活動(dòng)的錯(cuò)誤處理程序?yàn)橹埂H绻麤]有找到被允許而且不活動(dòng)的錯(cuò)誤處理程序,那么在錯(cuò)誤實(shí)際發(fā)生的地方,錯(cuò)誤本身是嚴(yán)重的。錯(cuò)誤處理程序每次將控件返回調(diào)用過程時(shí),該過程就成為當(dāng)前過程。在任何過程中,一旦錯(cuò)誤處理程序處理了錯(cuò)誤,在當(dāng)前過程中就會(huì)從Resume語句指定的位置恢復(fù)運(yùn)行。注意一個(gè)錯(cuò)誤處理程序不是Sub過程或Function過程。它是一段用行標(biāo)簽或行號(hào)標(biāo)記的代碼。
3.6.5 復(fù)用語句With...End With
With語句用于定制一個(gè)對(duì)象或用戶自定義類型。With語句不僅方便用戶定制對(duì)象,也可增強(qiáng)代碼的可讀性使程序結(jié)構(gòu)更加清晰。With語句用于在一個(gè)單一對(duì)象或一個(gè)用戶定義類型上執(zhí)行一系列的語句。該語句的使用形式如下。
With object [statements] End with
With語句的語法具有以下兩個(gè)參數(shù)。
⑴ object:必要參數(shù),一個(gè)對(duì)象或用戶自定義類型的名稱。
⑵ Statements:可選參數(shù),對(duì)object執(zhí)行一條或多條語句。
With語句可以對(duì)某個(gè)對(duì)象執(zhí)行一系列的語句,而不用重復(fù)指出對(duì)象的名稱。例如,要改變一個(gè)對(duì)象的多個(gè)屬性,可以在With控制結(jié)構(gòu)中加上屬性的賦值語句,這時(shí)只是引用對(duì)象一次而不是在每個(gè)屬性賦值時(shí)都要引用。例如,下列語句使用With語句執(zhí)行一系列對(duì)標(biāo)簽控件的參數(shù)設(shè)置。
With MyLabel .Height = 2000 .Width = 2000 .Caption = “Visual Basic” End With
技巧
當(dāng)程序一旦進(jìn)入With塊,object就不能改變,因此不能用一個(gè)With語句來設(shè)置多個(gè)不同的對(duì)象。
3.7 高手點(diǎn)撥
本節(jié)視頻教學(xué)錄像:12分鐘
上面只是對(duì)幾種程序控制結(jié)構(gòu)的簡(jiǎn)單介紹,在實(shí)際應(yīng)用中,很多復(fù)雜的程序都是由這些基本結(jié)構(gòu)組成,下面介紹一些程序中常用的算法。
1. 累加、累乘
累加、累乘是較常見的數(shù)值問題。累加(累乘)是將多個(gè)數(shù)相加(乘),所以一般采用循環(huán)結(jié)構(gòu)來實(shí)現(xiàn)。在循環(huán)體中應(yīng)有表示累加(如sum=sum+x)或累乘(如t=t*i)的賦值語句。需要注意的是,累加中用于存放和的變量一般賦初值為0,而累乘中用于存放積的變量賦初值為1。
下面以例子說明。
求1!+2!+…+n!的值,n由鍵盤輸入。
Private Sub Form_Click() Dim s as double,t as double,n as integer s=0 t=1 n=lnputBox("請(qǐng)輸入n的值") For i=1 to n t=t*l '求i!并賦給變量t s=s+t Next i Print "1!+2!+…+";n;"!=";s End Sub
2. 求最大值和最小值
求若干數(shù)的最大值(最小值),其算法思想是,先取第一個(gè)數(shù)作為最大值(最小值)的初值,然后依次將下一個(gè)數(shù)和它比較,若比它大(小),將該數(shù)替換為最大值(最小值)。
下面以例子說明。
產(chǎn)生10個(gè)1~100之間的隨機(jī)整數(shù),輸出它們的最大值。
Private Sub Form_Click() Dim i%,x%,max% Randomize Print "10個(gè)隨機(jī)整數(shù):" x=int(Rnd*100)+1 Print x; max=x '將第一個(gè)數(shù)作為初值賦給max For i=2 to 10 x=int(Rnd*100)+1 if x>max Then max=x Print x;
Next i Print Print "最大值為:";max End Sub
3. 迭代法
“迭代法”是指重復(fù)執(zhí)行一組工作,每次執(zhí)行這組工作時(shí),都從舊值遞推出新值,并用新值代替舊值。
下面以例子說明。
已知某球從100米高度自由落下,落地后反彈,每次彈起的高度都是上次高度的一半。求小球第10次落地后反彈的高度和球所經(jīng)過的路程。
Private Sub Form_Click() Dim h as single,r as single,s as single h=100 s=0 For i=1 to 10 r=h/2 s=s+r+h h=r Next i Print "h=";h,"s=";s End Sub
3.8 實(shí)戰(zhàn)練習(xí)
上機(jī)題
運(yùn)用計(jì)數(shù)循環(huán)結(jié)構(gòu)計(jì)算出1+2+3+4+…+100的結(jié)果。
- QTP從實(shí)踐到精通
- SpringBoot揭秘:快速構(gòu)建微服務(wù)體系
- 嵌入式系統(tǒng)開發(fā)之道:菜鳥成長(zhǎng)日志與項(xiàng)目經(jīng)理的私房菜
- Apache Pulsar原理解析與應(yīng)用實(shí)踐
- 軟件測(cè)試從小白到高手
- 鑄魂:軟件定義制造
- 大模型入門:技術(shù)原理與實(shí)戰(zhàn)應(yīng)用
- 卡爾曼濾波原理及應(yīng)用:MATLAB仿真(第2版)
- 項(xiàng)目實(shí)踐精解:基于EJB 3.0和Web Services的Java應(yīng)用開發(fā)
- 分布式應(yīng)用系統(tǒng)架構(gòu)設(shè)計(jì)與實(shí)踐
- HTML5游戲編程核心技術(shù)與實(shí)戰(zhàn)
- PHP與MySQL高性能應(yīng)用開發(fā)
- 軟件工程3.0:大模型驅(qū)動(dòng)的研發(fā)新范式
- Cocos2d-X案例開發(fā)大全
- OpenAI API接口應(yīng)用實(shí)戰(zhàn)