官术网_书友最值得收藏!

第3章Visual Basic的秘密—算法和程序控制結(jié)構(gòu)

本章視頻教學錄像:1小時2分鐘

算法是問題求解過程的精確描述,因此掌握算法是學習程序設(shè)計的核心,它可以幫助用戶更好、更快地掌握編程思想及編程方法。程序的執(zhí)行就像水在管道中流動,如果不加以控制,只能從上流到下。任何一種程序設(shè)計語言都有自己的算法和程序控制結(jié)構(gòu),但大致結(jié)構(gòu)都相似。在Visual Basic中,控制程序執(zhí)行的基本結(jié)構(gòu)有3種:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。本章將詳細介紹這3種結(jié)構(gòu)的程序控制語句。

本章要點(已掌握的在方框中打鉤)

□ 了解算法基本概念、特性及算法的幾種描述方法

□ 了解結(jié)構(gòu)化程序設(shè)計

□ 掌握程序的順序結(jié)構(gòu)

□ 掌握程序的選擇結(jié)構(gòu)

□ 掌握程序的循環(huán)結(jié)構(gòu)

□ 了解其他輔助控制語句

3.1 算法

本節(jié)視頻教學錄像:3分鐘

算法是學習程序設(shè)計的基礎(chǔ),也可以說是程序設(shè)計的入門知識,掌握算法可以幫助讀者快速理清程序設(shè)計的思路,找出多種解決問題的方法,從而選擇最合適的解決方案。

1. 什么是算法

“算法”這個術(shù)語聽起來可能很陌生,其實大多數(shù)人每天都會用到許多算法。

我們早晨坐車上班,一般情況下會坐公交車上班,但如果時間來不及或遇到其他特殊情況,可能會打車上班,這就是一個“算法”。因此,廣義地講,“算法”就是解決某個問題或處理某件事的方法和步驟。

2. 算法的特性

一個算法應該具有以下5個主要特性。

⑴ 有窮性:一個算法(對任何合法的輸入)在執(zhí)行有窮步后能夠結(jié)束,并且在有限的時間內(nèi)完成。

⑵ 確定性:算法中的每一步都有確切的含義。

⑶ 可行性:算法中的操作能夠用已經(jīng)實現(xiàn)的基本運算執(zhí)行有限次來實現(xiàn)。

⑷ 輸入:一個算法有零個或者多個輸入,零個輸入就是算法本身確定了初始條件。

⑸ 輸出:一個算法有一個或多個輸出,以反映出數(shù)據(jù)加工的結(jié)果,沒有輸出的算法是沒有意義的。

3. 算法的描述方法

為了讓算法清晰易懂,需要選擇一個好的描述方法。算法的描述方法有很多,有自然語言、偽代碼、傳統(tǒng)流程圖等。

⑴ 自然語言

自然語言就是用人們?nèi)粘J褂玫恼Z言描述解決問題的方法和步驟,這種描述方法通俗易懂,即使是不熟悉計算機語言的人也很容易理解程序。但是,自然語言在語法和語義上往往具有多義性,并且比較繁瑣,對程序流向等描述不明了、不直觀。

⑵ 偽代碼

偽代碼是介于自然語言和計算機語言之間的文字和符號,它與一些高級編程語言(如Visual C++)類似,但是沒有真正編寫程序時所要遵循的嚴格規(guī)則。偽代碼用一種從頂?shù)降住⒁子陂喿x的方式表示算法。在程序開發(fā)期間,偽代碼經(jīng)常用于“規(guī)劃”一個程序,然后再轉(zhuǎn)換成VB程序。

⑶ 傳統(tǒng)流程圖

傳統(tǒng)流程圖使用不同的幾何圖形來表示不同性質(zhì)的操作,使用流程線來表示算法的執(zhí)行方向。比起前兩種描述方式,它具有直觀形象、邏輯清晰、易于理解等特點,但占用篇幅較大,流程隨意轉(zhuǎn)向,較大的流程圖不易讀懂。

3.2 結(jié)構(gòu)化程序設(shè)計

本節(jié)視頻教學錄像:4分鐘

結(jié)構(gòu)化程序設(shè)計(Structured Programming)是進行以模塊功能和處理過程設(shè)計為主的詳細設(shè)計的基本原則。

1. 概念

其概念最早由E.W.Dijikstra在1965年提出的,是軟件發(fā)展的一個重要的里程碑。它的主要觀點是采用自頂向下、逐步求精及模塊化的程序設(shè)計方法。使用三種基本控制結(jié)構(gòu)構(gòu)造程序,任何程序都可由順序、選擇、循環(huán)三種基本控制結(jié)構(gòu)構(gòu)造。結(jié)構(gòu)化程序設(shè)計主要強調(diào)的是程序的易讀性。

2. 內(nèi)容

結(jié)構(gòu)化程序設(shè)計曾被稱為軟件發(fā)展中的第三個里程碑。該方法的要點是:

⑴ 主張使用順序、選擇、循環(huán)三種基本結(jié)構(gòu)來嵌套連結(jié)成具有復雜層次的“結(jié)構(gòu)化程序”,嚴格控制GOTO語句的使用。用這樣的方法編出的程序在結(jié)構(gòu)上具有以下效果。

① 以控制結(jié)構(gòu)為單位,只有一個入口,一個出口,所以能獨立地理解這一部分。

② 能夠以控制結(jié)構(gòu)為單位,從上到下順序地閱讀程序文本。

③ 由于程序的靜態(tài)描述與執(zhí)行時的控制流程容易對應,所以能夠方便正確地理解程序的動作。

⑵ “自頂而下,逐步求精”的設(shè)計思想,其出發(fā)點是從問題的總體目標開始,抽象低層的細節(jié),先專心構(gòu)造高層的結(jié)構(gòu),然后再一層一層地分解和細化。這使設(shè)計者能把握主題,高屋建瓴,避免一開始就陷入復雜的細節(jié)中,使復雜的設(shè)計過程變得簡單明了,過程的結(jié)果也容易做到正確可靠。

⑶ “獨立功能,單出、入口”的模塊結(jié)構(gòu),減少模塊的相互聯(lián)系使模塊可作為插件或積木使用,降低程序的復雜性,提高可靠性。程序編寫時,所有模塊的功能通過相應的子程序(函數(shù)或過程)的代碼來實現(xiàn)。程序的主體是子程序?qū)哟螏欤c功能模塊的抽象層次相對應,編碼原則使得程序流程簡潔、清晰,增強可讀性。

3. 基本結(jié)構(gòu)

結(jié)構(gòu)化程序設(shè)計的三種基本結(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ù)某一特定的條件選擇其中的一個分支執(zhí)行。選擇結(jié)構(gòu)有單選擇、雙選擇和多選擇三種形式。

⑶ 循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)表示程序反復執(zhí)行某個或某些操作,直到某條件為假(或為真)時才可終止循環(huán)。在循環(huán)結(jié)構(gòu)中最主要的是:什么情況下執(zhí)行循環(huán),哪些操作需要循環(huán)執(zhí)行。循環(huán)結(jié)構(gòu)的基本形式有兩種:當型循環(huán)和直到型循環(huán)。

當型循環(huán):表示先判斷條件,當滿足給定的條件時執(zhí)行循環(huán)體,并且在循環(huán)終端處流程自動返回到循環(huán)入口;如果條件不滿足,則退出循環(huán)體直接到達流程出口處。因為是“當條件滿足時執(zhí)行循環(huán)”,即先判斷后執(zhí)行,所以稱為當型循環(huán)。

直到型循環(huán):表示從結(jié)構(gòu)入口處直接執(zhí)行循環(huán)體,在循環(huán)終端處判斷條件,如果條件不滿足,返回入口處繼續(xù)執(zhí)行循環(huán)體,直到條件為真時再退出循環(huán)到達流程出口處,是先執(zhí)行后判斷。因為是“直到條件為真時為止”,所以稱為直到型循環(huán)。

4. 設(shè)計方法

⑴ 自頂向下

程序設(shè)計時,應先考慮總體,后考慮細節(jié);先考慮全局目標,后考慮局部目標。不要一開始就過多追求眾多的細節(jié),先從最上層總目標開始設(shè)計,逐步使問題具體化。

⑵ 逐步細化

對復雜問題,應設(shè)計一些子目標作為過渡,逐步細化。

⑶ 模塊化

一個復雜問題,肯定是由若干稍簡單的問題構(gòu)成。模塊化是把程序要解決的總目標分解為子目標,再進一步分解為具體的小目標,把每一個小目標稱為一個模塊。

5. 優(yōu)缺點

⑴ 優(yōu)點

由于模塊相互獨立,因此在設(shè)計其中一個模塊時,不會受到其他模塊的牽連,因而可將原來較為復雜的問題化簡為一系列簡單模塊的設(shè)計。模塊的獨立性還為擴充已有的系統(tǒng)、建立新系統(tǒng)帶來了不少的方便,因為我們可以充分利用現(xiàn)有的模塊做積木式的擴展。

按照結(jié)構(gòu)化程序設(shè)計的觀點,任何算法功能都可以通過由程序模塊組成的三種基本程序結(jié)構(gòu)的組合:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)來實現(xiàn)。

結(jié)構(gòu)化程序設(shè)計的基本思想是采用“自頂向下,逐步求精”的程序設(shè)計方法和“單入口單出口”的控制結(jié)構(gòu)。自頂向下、逐步求精的程序設(shè)計方法從問題本身開始,經(jīng)過逐步細化,將解決問題的步驟分解為由基本程序結(jié)構(gòu)模塊組成的結(jié)構(gòu)化程序框圖;“單入口單出口”的思想認為一個復雜的程序,如果它僅是由順序、選擇和循環(huán)三種基本程序結(jié)構(gòu)通過組合、嵌套構(gòu)成,那么這個新構(gòu)造的程序一定是一個單入口單出口的程序。據(jù)此就很容易編寫出結(jié)構(gòu)良好、易于調(diào)試的程序來。

① 整體思路清楚,目標明確。

② 設(shè)計工作中階段性非常強,有利于系統(tǒng)開發(fā)的總體管理和控制。

③ 在系統(tǒng)分析時可以診斷出原系統(tǒng)中存在的問題和結(jié)構(gòu)上的缺陷。

⑵ 缺點

① 用戶要求難以在系統(tǒng)分析階段準確定義,致使系統(tǒng)在交付使用時產(chǎn)生許多問題。

② 用系統(tǒng)開發(fā)每個階段的成果來進行控制,不能適應事物變化的要求。

③ 系統(tǒng)的開發(fā)周期長。

3.3 順序結(jié)構(gòu)

本節(jié)視頻教學錄像:1分鐘

順序結(jié)構(gòu)是指程序按照語句出現(xiàn)的先后次序執(zhí)行。可以把順序結(jié)構(gòu)想像成一個沒有分支的管道,把數(shù)據(jù)想像成水流,數(shù)據(jù)從入口進入后,依次執(zhí)行每一條語句直到結(jié)束。流程如圖所示。

在Visual Basic中賦值語句、注釋語句、輸入語句、輸出語句、變量定義語句等都屬于順序結(jié)構(gòu)功能的語句。這些語句本身沒有控制和改變程序結(jié)構(gòu)的能力,它們在語句中出現(xiàn)的順序就是執(zhí)行的順序。

3.3.1 賦值運算符

賦值運算符用來為變量或事件的屬性賦值。程序的計算實質(zhì)上是數(shù)據(jù)的計算,而數(shù)據(jù)依存于各種變量、屬性值等里面,我們通過賦值運算符把數(shù)據(jù)和變量、屬性值等關(guān)聯(lián)起來從而進行實際計算。賦值運算符的常見語法形式是:

      變量名 = 表達式
      對象名.屬性 = 表達式

賦值運算符中的等號并不是表示等號兩邊的值是相等的,而是將等號右邊的值賦給等號左邊的變量或?qū)傩浴H绻忍栍疫吺且粋€表達式,則會先執(zhí)行這個表達式,執(zhí)行完畢將執(zhí)行結(jié)果賦給等號左邊的變量或?qū)傩浴?/p>

下面兩個是正確的賦值運算符表達式。

      a=a+1   '把數(shù)值變量a加1后賦給變量a
      Command1.Caption="確定" '把字符串“確定”賦給Command1的Caption屬性

下面兩個是錯誤的賦值運算符表達式。

      6=a+b   '錯誤原因:賦值符號左邊不能是常量
      a+b=6   '錯誤原因:賦值符號左邊不能是表達式

3.3.2 數(shù)據(jù)的輸入與輸出

1. 數(shù)據(jù)的輸入

Visual Basic中的數(shù)據(jù)輸入主要通過文本框控件、列表框、組合框、復選框等控件以及InputBox函數(shù)來實現(xiàn)。控件的使用在后續(xù)篇章中將詳細介紹,這里主要介紹InputBox函數(shù)的用法。InputBox函數(shù)是用來接收用戶通過鍵盤輸入的數(shù)據(jù)。調(diào)用InputBox函數(shù)的格式如下。

        Var=InputBox (<提示>[,對話框標題][,編輯框中默認值][,x坐標][,y坐標][,幫助文件名,幫助
    主題號])

功能:打開一個對話框,等待用戶輸入內(nèi)容,當用戶單擊【確定】按鈕或按【Enter】鍵,函數(shù)返回輸入的值,其值的類型為字符串。參數(shù)說明如下。

⑴ 提示:不能省略該項。字符串表達式,在對話框中作為信息顯示,可為漢字;若要多行顯示,必須在每行行末加回車Chr(13)和換行Chr(10)控制符或vbCrLf符號常數(shù)。

⑵ 對話框標題:字符串表達式,在對話框的標題區(qū)顯示;若省略,則把應用程序名放入標題欄中。

⑶ 編輯框中默認值:字符串表達式,當輸入對話框中無輸入時,則該默認值作為輸入的內(nèi)容。

⑷ x坐標、y坐標:整型表達式,坐標確定對話框左上角在屏幕上的位置,屏幕左上角為坐標原點。

例如:下面程序?qū)崿F(xiàn)從鍵盤接收一個字符串,并將其顯示在窗體上。

      Private Sub Form_Click()
        Dim num As String
        num = lnputBox(“請輸入學號”,“示例”)
        Print num
        End Sub

上述程序?qū)⒂脩舻妮斎腼@示在窗體上,運行效果如圖所示。

InputBox函數(shù)接收輸入

InputBox函數(shù)顯示輸入

當用戶輸入完成后單擊左圖中的【確定】按鈕,表示輸入成功,用戶輸入的數(shù)據(jù)將被賦值到變量num中,使用Print函數(shù)可以顯示在窗體上。如果單擊【取消】按鈕,則輸入失敗。

2. 數(shù)據(jù)的輸出

Visual Basic中,數(shù)據(jù)的輸出主要有Print方法、MsgBox函數(shù)和控件輸出3種方式。一般來說,Print方法主要輸出在特定控件上,例如Form.Print,即輸出在窗體上;MsgBox函數(shù)則以對話框的形式輸出信息;而控件輸出主要是指輸出在數(shù)據(jù)控件上,例如Label1.Caption="Visual Basic"。下面通過示例看一下這3種輸出的形式。例如,用Print方法、MsgBox函數(shù)和控件輸出3種方式輸出a中的數(shù)據(jù)。

在窗體上使用Print方法輸出數(shù)據(jù)的輸出格式為:

      Print變量

使用MsgBox函數(shù)的簡單輸出格式為:

      MsgBox變量

使用Label控件的輸出即使用其Caption標題屬性,使用格式為:

      Label1.Caption = 變量

這3種方式在后續(xù)的章節(jié)中都將詳細介紹。

該示例的實現(xiàn)代碼如下。

      Private Sub Form_Click()
      Dim a As String
      a = lnputBox("請輸入a的值","示例")
      Print a      'Print方法輸出
      MsgBox"a"="&a  'MsgBox函數(shù)輸出
      Label1.Caption=a '標簽控件輸出
      End Sub

該程序執(zhí)行效果如圖所示。

Print方法輸出

標簽控件輸出

程序執(zhí)行時,先由用戶在輸入框InputBox中輸入a的值,再分別用Print方法、MsgBox輸出和Label控件輸出在窗體上。控件的輸出將結(jié)合具體的控件,除了Label標簽控件外,還有許多如TextBox文本框輸出、Image圖片框輸出等,這些將在以后的章節(jié)中詳細講解,此處只介紹前兩種方法。

3.4 選擇結(jié)構(gòu)

本節(jié)視頻教學錄像:16分鐘

選擇結(jié)構(gòu)是通過對給定的條件進行判斷,然后根據(jù)判斷結(jié)果執(zhí)行不同任務(wù)的一種程序結(jié)構(gòu)。Visual Basic中的If條件語句和多分支條件語句(Select)是最為常用的兩種條件語句。條件語句和多分支條件語句的流程如圖所示。

3.4.1 If條件語句

If語句的常見語法格式是:

      lf條件表達式Then
        語句1
        語句2
        …
      End lf

If…Then…翻譯成中文就是:“如果……就……”。所以上面的代碼意思是如果If后面的條件表達式成立的話,就執(zhí)行Then下面的語句,否則就什么都不做。

如果希望再加一個選擇分支,可以使用If…Then…Else的語法格式:

      lf條件表達式Then
      語句1
      Else
      語句2
      End lf

加上Else以后的代碼意思是如果If后面的條件表達式成立的話,就執(zhí)行Then下面的語句,否則執(zhí)行Else后面的語句。

3.4.2 Select case語句

If語句主要用于單分支或者雙分支的判斷性選擇結(jié)構(gòu),雖然也可以用形如If…Then…ElseIf…ElseIf…ElseIf…Else這樣的語法來實現(xiàn)多分支的選擇結(jié)構(gòu),但是這顯然太麻煩了,Select語句是更為方便和有效的一種辦法。Select語句的語法是:

      Select Case <條件表達式>
      Case <表達式列表1>
      <語句塊1>
      Case <表達式列表2>
      <語句塊2>
      …
      [Case Else
      <語句塊n>]
      End Select

上述語句中的條件表達式可以是數(shù)值表達式或字符串表達式,一般為變量。表達式列表則是表明條件表達式的可能取值,表達式列表有以下3種形式。

⑴ 逗號分隔的多個表達式。例如:

      Case 1,2,3  '表達式的值是1、2或者3

⑵ <表達式1> To <表達式2>。例如:

      Case 1 to 10 '表達式的值介于1到10之間

⑶ Is <關(guān)系操作符> <表達式1>。例如:

      ls<10      '表達式的值小于10

【范例3-1】 在文本框中輸入一個數(shù)值型數(shù)字,單擊【Command】按鈕后,判斷該數(shù)字的奇偶性。

⑴ 啟動Visual Basic 6.0,在彈出的【新建工程】對話框中選擇【標準EXE】圖標,然后單擊【打開】按鈕。

⑵ 用鼠標雙擊工具箱中的【TextBox】按鈕,在Form1窗體上添加一個文本框控件,并用鼠標雙擊工具箱中的【CommandButton】按鈕,添加一個按鈕控件。

⑶ 雙擊Command1控件,進入代碼窗口,輸入以下代碼(代碼3-1.txt)。

      01 Private Sub Command1_Click()
      02  Dim a As lnteger'定義一個整型變量
      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行使用了一個Val函數(shù),Val函數(shù)是將文本框中的字符串型的數(shù)字轉(zhuǎn)換為整型。

【運行結(jié)果】

保存程序,單擊【啟動】按鈕,運行程序。清空文本框中的內(nèi)容,輸入數(shù)字“3”,單擊【Command1】按鈕,窗體上顯示“3是奇數(shù)”。清空文本框中的內(nèi)容,輸入數(shù)字“6”,單擊【Command1】按鈕,窗體上顯示“6是偶數(shù)”。

【拓展訓練3-1】

在文本框中輸入學生的考試成績,采用多分支條件語句對學生分數(shù)進行評定,判斷其優(yōu)良性。

學會了使用If條件語句的判斷方法,可以嘗試使用多分支條件語句來控制程序的運行。可以將【范例3-1】中步驟⑶的代碼修改如下(拓展代碼3-1.txt)。

      01 Private Sub Command1_Click()
      02  Dim x As Single,y As Single     '定義兩個單精度類型的變量
      03  x=Val(Text1.Text)      '獲取輸入的整數(shù)
      04   Select Case x  '進行多條件分支判斷
      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

運行后,清空文本框內(nèi)容,輸入“90”,單擊【Command1】按鈕,窗體上顯示“優(yōu)秀”。再次清空文本框內(nèi)容,輸入“50”,單擊【Command1】按鈕,窗體上顯示“不及格”。

3.4.3 條件函數(shù)

在Visual Basic中,除了上述這幾種分支語句外,還有兩個條件函數(shù)值得讀者注意:IIF函數(shù)和Choose函數(shù)。

IIF函數(shù)用于替代IF函數(shù),適用于簡單的判斷場合。其調(diào)用格式為:IIf (表達式,當表達式的值為Ture時的值,當表達式的值為False時的值)。其功能與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)的簡介形式來書寫。

Choose函數(shù)用于替代Select Case語句,也適用于簡單的判斷場合。其調(diào)用格式為:

      Choose(整數(shù)表達式,選項列表)

功能為:根據(jù)整數(shù)表達式的值來決定返回選項列表中的某個值。如果整數(shù)表達式值是1,則Choose會返回列表中的第1個選項;如果整數(shù)表達式值是2,則會返回列表中的第2個選項,依此類推。若整數(shù)表達式的值小于1或大于列出的選項數(shù)目時,Choose函數(shù)返回Null。

例如,根據(jù)當前日期函數(shù)Now、WeekDay,利用Choose函數(shù)顯示今日是星期幾的形式。

      Private Sub Form_Click( )
      Print "今天是:";Now
      t =Choose(Weekday(Now),"星期日","星期一","星期二","星期三","星期四","星期五","星期六")
      Print"是:";t
      End Sub

上述程序中,函數(shù)Weekday(Now)獲取當前是星期幾的一個數(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語句的應用簡單化了。在實際的使用中,讀者可根據(jù)情況自行選擇使用哪種方式。

3.5 循環(huán)結(jié)構(gòu)

本節(jié)視頻教學錄像:15分鐘

當程序需要重復執(zhí)行一些任務(wù)時,就可以考慮采用循環(huán)結(jié)構(gòu)。例如重復100次加減乘除,數(shù)組中的每個整數(shù)加1等。當然可以為每次的任務(wù)都編寫一條語句,但是這樣就違背了使用計算機的初衷:“使用計算機的目的就是為了減輕工作量,而不是增加工作量。”對于這些重復的任務(wù),可以使用Visual Basic中的循環(huán)結(jié)構(gòu)很輕松地完成。

提示

Visual Basic中的循環(huán)結(jié)構(gòu)是指通過計算機來實現(xiàn)重復執(zhí)行某任務(wù)的程序結(jié)構(gòu)。循環(huán)結(jié)構(gòu)可以減少源程序重復書寫的工作量,用來描述重復執(zhí)行某段算法的問題,這是程序設(shè)計中最能發(fā)揮計算機特長的程序結(jié)構(gòu),Visual Basic中所提供的各種循環(huán)可以用來處理同一問題,一般情況下它們可以互相替換。

3.5.1 For循環(huán)語句

For循環(huán)又叫作計數(shù)循環(huán),如果能夠預知循環(huán)的次數(shù),就可以預先設(shè)定計數(shù)循環(huán)的所計數(shù)值。For循環(huán)的語法是:

      For循環(huán)變量=初值To終值 [Step步長]
      [語句塊]
      [Exit For]
      [語句塊]
      Next [循環(huán)變量]

在For循環(huán)語句中,循環(huán)變量、初值、終值和步長等都是數(shù)值型數(shù)據(jù),如果步長沒有指定,則默認值為1。步長可以為正,也可以為負。若為正,則初值應小于或等于終值;若為負,則初值應大于或等于終值,這樣才能保證執(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條件表達式
      語句塊
      Loop

或者

      Do Until條件表達式
      語句塊
      Loop

后判斷條件的Do…Loop循環(huán)的語法是:

      Do
      語句塊
      Loop While條件表達式

條件循環(huán)結(jié)構(gòu)的流程如圖所示。

3.5.3 循環(huán)的嵌套

循環(huán)的嵌套,就是在一個循環(huán)體內(nèi)含有其他循環(huán)結(jié)構(gòu)的循環(huán)體。在實際問題中,有些單靠一個循環(huán)是無法很好解決的,例如對二維甚至多維數(shù)組的遍歷,這時我們使用在循環(huán)中再嵌套循環(huán)的方式來實現(xiàn)一些復雜的邏輯。

【范例3-2】 在文本框中輸入一個數(shù)值型數(shù)字,通過使用計數(shù)循環(huán)結(jié)構(gòu)方法,來計算所輸入數(shù)值型數(shù)字的階乘。

⑴ 啟動Visual Basic 6.0,在彈出的【新建工程】對話框中選擇【標準EXE】圖標,然后單擊【打開】按鈕。

⑵ 用鼠標雙擊工具箱中的【TextBox】按鈕,在Form1窗體上添加一個文本框控件,并用鼠標雙擊工具箱中的【CommandButton】按鈕,添加一個按鈕控件。

⑶ 雙擊Command1控件,進入代碼窗口,輸入以下代碼(代碼3-2.txt)。

      01 Private Sub Command1_Click()
      02  Dim i,x As lnteger,s As Double  '定義兩個整型變量和一個雙精度型變量
      03  x=Val(Text1.Text)      '獲取輸入的數(shù)值
      04  s=1  '給變量s賦初值1
      05   For i=1 To x  '條件符合,利用循環(huán)結(jié)構(gòu)進行計算
      06    s=s*i     '累積
      07   Next i '進行下一輪循環(huán)
      08  Print x;"的階乘為";s;   '輸入最終結(jié)果
      09 End Sub

【代碼詳解】

第02行定義了兩個整型變量i和x,同時定義了一個雙精度型的變量s。其中,變量i主要用于循環(huán)語句的初始值,變量x主要用于獲得文本框中所輸入的數(shù)值,變量s主要用于每一次計算后的結(jié)果。

第05~07行主要進行For循環(huán)來計算獲得數(shù)值的階乘數(shù)。例如在文本框中輸入一個數(shù)值3,那么代碼執(zhí)行到第03行時,將其轉(zhuǎn)換為數(shù)值型的數(shù),以便進行數(shù)值的計算。當代碼執(zhí)行到For i=1 To x時,此時x為3,首先判斷當前i的值是否大于x的值,如果大于,則停止循環(huán),如果小于,則開始進行第1次循環(huán),計算s=1×1,此時s的結(jié)果值為1。然后執(zhí)行代碼Next i語句,將i的值加1,并判斷是否大于3,如果不大于,執(zhí)行第2次循環(huán),此時s的值變?yōu)?×2,得到最終的結(jié)果值為2。然后再次將i的值加1,i的值變?yōu)榱?,并判斷當前i的值是否大于3,不大于繼續(xù)執(zhí)行循環(huán)體,s的值變?yōu)榱?×3。然后再次將i的值加1,此時i的值為4,已經(jīng)大于3,所以退出循環(huán)體。執(zhí)行最后一行代碼語句,將結(jié)果輸出出來。

提示

在使用For循環(huán)時,如果需要在代碼執(zhí)行過程中停止當前循環(huán),可以使用Exit For語句退出當前循環(huán)。

【運行結(jié)果】

保存程序,單擊【啟動】按鈕,運行程序。清空文本框中的內(nèi)容,輸入數(shù)字“6”,單擊【Command1】按鈕,窗體上顯示“6的階乘為720”。

【拓展訓練3-2】

利用嵌套循環(huán)方法編寫代碼,運行程序后,單擊窗體顯示出九九乘法表。

條件循環(huán)結(jié)構(gòu)與計數(shù)循環(huán)結(jié)構(gòu)的用法類似,下面來嘗試一下使用嵌套循環(huán)顯示出九九乘法表。

首先新建一個工程,在窗體上添加一個按鈕控件,雙擊按鈕控件,進入代碼窗口,輸入以下代碼(拓展代碼3-2.txt)。

      01 Private Sub Command1_Click()
      02  Dim i,j As lnteger      '定義兩個整型變量
      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

運行后,單擊【Command1】按鈕,即可顯示出九九乘法表。

3.6 其他輔助控制語句

本節(jié)視頻教學錄像:11分鐘

除了上面提到的幾種語句外,Visual Basic還提供了其他一些輔助控制語句。下面簡單介紹其用法。

3.6.1 End結(jié)束語句

End語句可以結(jié)束一個過程或塊,獨立的End語句用于結(jié)束一個程序的運行,可以放在任何事件過程中。該語句使用形式如下。

      End

此外,在Visual Basic 6.0中,還有多種形式的End語句,用于結(jié)束一個過程或塊,主要形式包括End If、End Select、End With、End Type、End Function、End Sub等,與對應的語句配對使用。End語句在各種代碼塊中的格式及作用如下表所示。

End語句用于停止執(zhí)行過程或塊,可以在過程中的任何位置關(guān)閉代碼的執(zhí)行。在執(zhí)行時,End語句會重置所有模塊級別變量和所有模塊的靜態(tài)局部變量。若要保留這些變量的值,改為使用Stop語句,則可以在保留這些變量值的基礎(chǔ)上恢復執(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),可以直接使用,也可以用條件判斷語句加以限制,在滿足某個條件時才能執(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)移到標號或行號指定的一行語句。該語句使用形式如下。

      GoTo {標號|行號}

在使用上述形式的GoTo語句跳轉(zhuǎn)到某一個標號的代碼時,應注意如下問題。

⑴ GoTo語句只能轉(zhuǎn)移到同一過程的標號或行號處。標號是一個字符序列,首字符必須為字母,與大小寫無關(guān),任何轉(zhuǎn)移到的標號后應有冒號。

⑵ 行號是一個數(shù)字序列。

⑶ 結(jié)構(gòu)化程序設(shè)計中要求盡量少用或不用GoTo語句,用選擇結(jié)構(gòu)或循環(huán)結(jié)構(gòu)來代替。

提示

Goto語句在使用上爭議很大。因為Goto語句使用起來比較靈活,而且有些情形能夠提高程序的效率,使得很多開發(fā)人員喜歡使用該語句。但是Goto語句使程序的靜態(tài)結(jié)構(gòu)和程序的動態(tài)執(zhí)行之間差別很大,造成程序難以閱讀,難以查錯。

3.6.4 On Error語句

On Error語句用于啟動一個錯誤處理程序并指定該子程序在一個過程中的位置,也可用來禁止一個錯誤處理程序。

語法有On Error GoTo line 、On Error Resume Next、On Error GoTo 0等。

On Error語句的語法可以具有以下任何一種形式的語句描述。

1. On Error GoTo line

啟動錯誤處理程序,且該歷程從必要的line參數(shù)中指定的line開始。line參數(shù)可以是任何行標簽或行號。如果發(fā)生一個運行時錯誤,則控件會跳到line,激活錯誤處理程序。指定的line必須在一個過程中,這個過程與On Error語句相同,否則會發(fā)生編譯時間錯誤。

2. On Error Resume Next

說明當一個程序運行時發(fā)生錯誤時,控件轉(zhuǎn)到緊接著發(fā)生錯誤的語句之后的語句,并在此繼續(xù)運行。訪問對象時要使用這種形式而不使用On Error GoTo。

3. On Error GoTo 0

禁止當前過程中任何已啟動的錯誤處理程序。

說明:如果不使用On Error語句,則任何運行時錯誤都是致命的。也就是說,結(jié)果會導致顯示錯誤信息并中止運行。一個“允許的”錯誤處理程序是由On Error語句打開的一個處理程序,一個“活動的”錯誤處理程序是處理錯誤的過程中允許的錯誤處理程序。如果在錯誤處理程序處于活動狀態(tài)時(在發(fā)生錯誤和執(zhí)行Resume、Exit Sub、Exit Function或Exit Property語句之間這段時間)又發(fā)生錯誤,則當前過程的錯誤處理程序?qū)o法處理這個錯誤。控件返回調(diào)用的過程。如果調(diào)用過程有一個已啟動的錯誤處理程序,則激活錯誤處理程序來處理該錯誤。如果調(diào)用過程的錯誤處理程序也是活動的,則控件將再往回傳到前面的調(diào)用過程,這樣一直進行下去,直到找到一個被允許的但不是活動的錯誤處理程序為止。如果沒有找到被允許而且不活動的錯誤處理程序,那么在錯誤實際發(fā)生的地方,錯誤本身是嚴重的。錯誤處理程序每次將控件返回調(diào)用過程時,該過程就成為當前過程。在任何過程中,一旦錯誤處理程序處理了錯誤,在當前過程中就會從Resume語句指定的位置恢復運行。注意一個錯誤處理程序不是Sub過程或Function過程。它是一段用行標簽或行號標記的代碼。

3.6.5 復用語句With...End With

With語句用于定制一個對象或用戶自定義類型。With語句不僅方便用戶定制對象,也可增強代碼的可讀性使程序結(jié)構(gòu)更加清晰。With語句用于在一個單一對象或一個用戶定義類型上執(zhí)行一系列的語句。該語句的使用形式如下。

      With object
          [statements]
      End with

With語句的語法具有以下兩個參數(shù)。

⑴ object:必要參數(shù),一個對象或用戶自定義類型的名稱。

⑵ Statements:可選參數(shù),對object執(zhí)行一條或多條語句。

With語句可以對某個對象執(zhí)行一系列的語句,而不用重復指出對象的名稱。例如,要改變一個對象的多個屬性,可以在With控制結(jié)構(gòu)中加上屬性的賦值語句,這時只是引用對象一次而不是在每個屬性賦值時都要引用。例如,下列語句使用With語句執(zhí)行一系列對標簽控件的參數(shù)設(shè)置。

      With MyLabel
          .Height = 2000
          .Width = 2000
          .Caption = “Visual Basic”
      End With

技巧

當程序一旦進入With塊,object就不能改變,因此不能用一個With語句來設(shè)置多個不同的對象。

3.7 高手點撥

本節(jié)視頻教學錄像:12分鐘

上面只是對幾種程序控制結(jié)構(gòu)的簡單介紹,在實際應用中,很多復雜的程序都是由這些基本結(jié)構(gòu)組成,下面介紹一些程序中常用的算法。

1. 累加、累乘

累加、累乘是較常見的數(shù)值問題。累加(累乘)是將多個數(shù)相加(乘),所以一般采用循環(huán)結(jié)構(gòu)來實現(xiàn)。在循環(huán)體中應有表示累加(如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("請輸入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ù)的最大值(最小值),其算法思想是,先取第一個數(shù)作為最大值(最小值)的初值,然后依次將下一個數(shù)和它比較,若比它大(小),將該數(shù)替換為最大值(最小值)。

下面以例子說明。

產(chǎn)生10個1~100之間的隨機整數(shù),輸出它們的最大值。

      Private Sub Form_Click()
      Dim i%,x%,max%
      Randomize
      Print "10個隨機整數(shù):"
      x=int(Rnd*100)+1
      Print x;
      max=x       '將第一個數(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. 迭代法

“迭代法”是指重復執(zhí)行一組工作,每次執(zhí)行這組工作時,都從舊值遞推出新值,并用新值代替舊值。

下面以例子說明。

已知某球從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 實戰(zhàn)練習

上機題

運用計數(shù)循環(huán)結(jié)構(gòu)計算出1+2+3+4+…+100的結(jié)果。

主站蜘蛛池模板: 枝江市| 石狮市| 德昌县| 静乐县| 镇远县| 肇东市| 孟连| 同江市| 河东区| 分宜县| 古交市| 胶南市| 济宁市| 涞水县| 石狮市| 泸西县| 台安县| 乌拉特后旗| 宾阳县| 吴忠市| 文安县| 台山市| 满洲里市| 六安市| 洮南市| 甘德县| 宣威市| 南漳县| 瓦房店市| 荃湾区| 东莞市| 井冈山市| 双鸭山市| 民和| 吴忠市| 昔阳县| 木兰县| 天等县| 抚宁县| 小金县| 尉犁县|