程序設(shè)計(jì)教程(第6章)_第1頁
程序設(shè)計(jì)教程(第6章)_第2頁
程序設(shè)計(jì)教程(第6章)_第3頁
程序設(shè)計(jì)教程(第6章)_第4頁
程序設(shè)計(jì)教程(第6章)_第5頁
已閱讀5頁,還剩59頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、過程學(xué)習(xí)目標(biāo):熟悉過程的概念及其種類。掌握熟悉過程的概念及其種類。掌握Sub過程的定義、過程的定義、建立和調(diào)用,掌握建立和調(diào)用,掌握Function過程的定義、建立和過程的定義、建立和調(diào)用。調(diào)用。掌握形參與實(shí)參的概念及其參數(shù)的兩種傳遞方式掌握形參與實(shí)參的概念及其參數(shù)的兩種傳遞方式 掌握過程的嵌套調(diào)用與遞歸調(diào)用掌握過程的嵌套調(diào)用與遞歸調(diào)用掌握過程和變量的作用域掌握過程和變量的作用域掌握進(jìn)制轉(zhuǎn)換、素數(shù)等常用算法掌握進(jìn)制轉(zhuǎn)換、素數(shù)等常用算法 6.1 Visual Basic的工程的工程應(yīng)用程序通常包括窗體文件應(yīng)用程序通常包括窗體文件(.frm)、模塊文件、模塊文件(.bas)和類模塊和類模塊(.cl

2、s),VB工程的工程的組成組成 一個一個Visual Basic工程至少包含一個窗體工程至少包含一個窗體模塊,還可以根據(jù)需要模塊,還可以根據(jù)需要包含若干個標(biāo)準(zhǔn)模塊和包含若干個標(biāo)準(zhǔn)模塊和類模塊,本書將只討論類模塊,本書將只討論窗體模塊和標(biāo)準(zhǔn)模塊的窗體模塊和標(biāo)準(zhǔn)模塊的使用方法。通過圖可以使用方法。通過圖可以清楚看出清楚看出Visual Basic工程的模塊層次關(guān)系。工程的模塊層次關(guān)系。 Public|Private Sub 子過程名子過程名(形式參數(shù)列表形式參數(shù)列表) . End Sub概念:概念:過程(或變量)的作用域指的是過程(或變量)的有效范圍,即過程過程(或變量)的作用域指的是過程(或變量

3、)的有效范圍,即過程(或變量)的(或變量)的“可見性可見性”。u通用子過程和函數(shù)過程既可寫在窗體模塊中也可寫在標(biāo)準(zhǔn)模塊中,在定義時可選通用子過程和函數(shù)過程既可寫在窗體模塊中也可寫在標(biāo)準(zhǔn)模塊中,在定義時可選用關(guān)鍵字用關(guān)鍵字Private(局部)和(局部)和 Public(全局)(全局),來決定它們能被調(diào)用的范圍。,來決定它們能被調(diào)用的范圍。 6.2 過程過程過程有兩個重要作用:一是把一個復(fù)雜的任務(wù)分過程有兩個重要作用:一是把一個復(fù)雜的任務(wù)分解為若干個小任務(wù),可以用過程來表達(dá),從而使解為若干個小任務(wù),可以用過程來表達(dá),從而使任務(wù)更易理解,更易實(shí)現(xiàn),將來更易維護(hù);二是任務(wù)更易理解,更易實(shí)現(xiàn),將來更易

4、維護(hù);二是代碼重用,使同一段代碼多次復(fù)用。代碼重用,使同一段代碼多次復(fù)用。VB應(yīng)用程序是由過程組成的,過程是完成某種特應(yīng)用程序是由過程組成的,過程是完成某種特殊功能的一組獨(dú)立的程序代碼。分為兩大類過程。殊功能的一組獨(dú)立的程序代碼。分為兩大類過程。事件過程是當(dāng)某個事件發(fā)生時,對該事件作出響事件過程是當(dāng)某個事件發(fā)生時,對該事件作出響應(yīng)的程序段,它是應(yīng)的程序段,它是VBVB應(yīng)用程序的主體。應(yīng)用程序的主體。通用過程是獨(dú)立于事件過程之外,可供其他過程通用過程是獨(dú)立于事件過程之外,可供其他過程調(diào)用的程序段調(diào)用的程序段。把相同的任務(wù)編成相對獨(dú)立的把相同的任務(wù)編成相對獨(dú)立的“子過程子過程”。當(dāng)事件過程需要執(zhí)行

5、這個任務(wù)時,可使用調(diào)用語句當(dāng)事件過程需要執(zhí)行這個任務(wù)時,可使用調(diào)用語句( (如如Call)Call)實(shí)行調(diào)用。子過程執(zhí)行完后,會返回事件過程中調(diào)實(shí)行調(diào)用。子過程執(zhí)行完后,會返回事件過程中調(diào)用語句用語句CallCall的后續(xù)語句繼續(xù)執(zhí)行的后續(xù)語句繼續(xù)執(zhí)行通用過程又分為通用過程又分為Sub(Sub(子程序子程序) )過程和過程和Function(Function(函數(shù)函數(shù)) )過程過程。通用過程與事件過程不同,它不依附于某一個對象,也通用過程與事件過程不同,它不依附于某一個對象,也不是由對象的某一個事件驅(qū)動、或由系統(tǒng)自動調(diào)用,而不是由對象的某一個事件驅(qū)動、或由系統(tǒng)自動調(diào)用,而是必須是被調(diào)用語句調(diào)用

6、才起作用是必須是被調(diào)用語句調(diào)用才起作用。過程調(diào)用如圖所示:過程調(diào)用如圖所示: 例例6 6. .1 1 使用使用SubSub過程的示例過程的示例1 1 Private Sub Form_Load() Show Call mysub1(30) Call mysub2 Call mysub2 Call mysub2 Call mysub1(30) End Sub 程序運(yùn)行結(jié)果程序運(yùn)行結(jié)果Private Sub mysub1(n) Print String(n, *)End SubPrivate Sub mysub2() Print *; Tab(30); *End Sub 6.2.1 Sub過程過程

7、 Form_Load()事件過程事件過程Call mysub1(30)Call mysub2Call mysub2Call mysub2Call mysub2Call mysub1(30)Mysub1過程過程Mysub2過程過程調(diào)用過程調(diào)用過程 事件事件過程過程Form_Load()中,通過中,通過Call來分別調(diào)用兩個來分別調(diào)用兩個Sub過程過程 Sub過程過程mysub1(n)中,中,n為參數(shù)為參數(shù)(也稱形參也稱形參),當(dāng)調(diào)用過程,當(dāng)調(diào)用過程通過通過Call mysub1(30)(30稱為實(shí)參稱為實(shí)參)調(diào)用時,就把調(diào)用時,就把30傳給傳給n,這樣,這樣調(diào)用后就輸出調(diào)用后就輸出30個個“*”

8、號號 過程過程mysub2()不帶參數(shù)不帶參數(shù),其功能是輸出左右兩邊,其功能是輸出左右兩邊的“*”號號定義格式:定義格式:PrivatePublic Static Sub 過程名過程名(參數(shù)表參數(shù)表) 語句塊語句塊 Exit SubEnd Sub 1 1. Sub過程的定義過程的定義根據(jù)過程的作根據(jù)過程的作用范圍任選其用范圍任選其一一退出過程語句退出過程語句(2)子過程若需要接受參數(shù),則可在過程名后的括號中定義)子過程若需要接受參數(shù),則可在過程名后的括號中定義接受參數(shù)的變量及變量的數(shù)據(jù)類型。接受參數(shù)的變量稱為形接受參數(shù)的變量及變量的數(shù)據(jù)類型。接受參數(shù)的變量稱為形式參數(shù)。簡稱式參數(shù)。簡稱“形參形

9、參”,僅表示形參的類型、個數(shù)、位置,僅表示形參的類型、個數(shù)、位置,定義時是無值的,只有在過程被調(diào)用時,虛實(shí)參結(jié)合后才獲定義時是無值的,只有在過程被調(diào)用時,虛實(shí)參結(jié)合后才獲得相應(yīng)的值。得相應(yīng)的值。(3)過程可以無形式參數(shù),但括號不能省。)過程可以無形式參數(shù),但括號不能省。說明:說明:(1)子過程名:)子過程名:命名規(guī)則命名規(guī)則與變量名規(guī)則相同。子過程名不與變量名規(guī)則相同。子過程名不返回值,而是通過形參與實(shí)參的傳遞得到結(jié)果,調(diào)用時可返回值,而是通過形參與實(shí)參的傳遞得到結(jié)果,調(diào)用時可返回多個值。返回多個值。以字母或漢字、數(shù)字以字母或漢字、數(shù)字和下劃線組成的字符和下劃線組成的字符串。串。(4)參數(shù)的定

10、義形式:)參數(shù)的定義形式:ByValByRef 變量名變量名 ( )As 類型類型,,ByVal表示當(dāng)該過程被調(diào)用時,參數(shù)是表示當(dāng)該過程被調(diào)用時,參數(shù)是按值傳遞按值傳遞的;的;缺省缺省或或ByRef表示當(dāng)該過程被調(diào)用時,參數(shù)是表示當(dāng)該過程被調(diào)用時,參數(shù)是按地址傳遞按地址傳遞的。的。 如:如:public sub swap2 (ByVal X As integer, ByVal y As integer)(5) Private、Public 、Static的含義的含義q 選用選用Private(局部局部)定義過程,表明只有該過定義過程,表明只有該過程程所在模塊所在模塊(如窗體模塊)中的過程才能調(diào)

11、用(如窗體模塊)中的過程才能調(diào)用該模塊;如果選用該模塊;如果選用Public(全局全局)定義過程,表定義過程,表明在明在應(yīng)用程序應(yīng)用程序中任何地方都可以調(diào)用該模塊。中任何地方都可以調(diào)用該模塊。q 如果選用如果選用Static,表明,表明Sub過程中的局部變量過程中的局部變量是靜態(tài)的。是靜態(tài)的。2. Sub過程的建立過程的建立uSub過程可以在窗體模塊過程可以在窗體模塊(.frm)中建立,也可以在標(biāo)準(zhǔn)模塊中建立,也可以在標(biāo)準(zhǔn)模塊(.bas)中建立。中建立。1、在窗體模塊、在窗體模塊(.frm)中建立可以在代碼窗口中完成。中建立可以在代碼窗口中完成。打開代碼窗口后,在對象框中選擇打開代碼窗口后,在

12、對象框中選擇“通用通用”項(xiàng),然后輸入項(xiàng),然后輸入Sub過程頭,例如過程頭,例如Sub Mysub1(n),按下回車鍵,窗口顯示:按下回車鍵,窗口顯示: Sub Mysub1(n) End Sub此時可在此時可在Sub 和和End Sub之間輸入程序代碼之間輸入程序代碼。2、在標(biāo)準(zhǔn)模塊、在標(biāo)準(zhǔn)模塊(.Bas)中建立中建立Sub過程,方法是:過程,方法是: u選擇選擇“工程工程”菜單中的菜單中的“添加模塊添加模塊”命令,打開命令,打開“添加模塊添加模塊”對話框;再選擇對話框;再選擇“新建新建”或或“現(xiàn)存現(xiàn)存”選項(xiàng)卡,新建一個標(biāo)準(zhǔn)選項(xiàng)卡,新建一個標(biāo)準(zhǔn)模塊獲打開一個已有的標(biāo)準(zhǔn)模塊。之后就可以在模塊代碼

13、窗口模塊獲打開一個已有的標(biāo)準(zhǔn)模塊。之后就可以在模塊代碼窗口中編輯中編輯Sub過程了。過程了。 3、通過創(chuàng)建、通過創(chuàng)建Sub過程模板的方法建立過程模板的方法建立Sub過程過程: 通過通過 “工具工具”菜單中的菜單中的“添加過程添加過程”命令,出現(xiàn)命令,出現(xiàn)“添加添加過程過程”對話框(見圖對話框(見圖5.1),選擇過程類型(子過程、函數(shù)、),選擇過程類型(子過程、函數(shù)、屬性、事件)及作用范圍(公有的屬性、事件)及作用范圍(公有的Public、私有的、私有的Private),單擊確定后得到一個過程或函數(shù)定義的結(jié)構(gòu)框),單擊確定后得到一個過程或函數(shù)定義的結(jié)構(gòu)框架(模板),如:架(模板),如:Publi

14、c Sub Sort( )End Sub1. 函數(shù)過程(函數(shù)過程(Function過程)的定義過程)的定義Visual Basic函數(shù)分為內(nèi)部函數(shù)和外部函數(shù),外部函數(shù)是用戶根函數(shù)分為內(nèi)部函數(shù)和外部函數(shù),外部函數(shù)是用戶根據(jù)需要用據(jù)需要用Function關(guān)鍵字定義的函數(shù)過程,與子過程不同的是關(guān)鍵字定義的函數(shù)過程,與子過程不同的是函數(shù)過程將返回一個值函數(shù)過程將返回一個值 。 Public|PrivateStaticFunction 函數(shù)名函數(shù)名()As 函數(shù)名函數(shù)名=返回值返回值 Exit Function 函數(shù)名函數(shù)名=返回值返回值 End Function函數(shù)返回值的處理函數(shù)返回值的處理 6.2

15、.2 Function過程過程函數(shù)體函數(shù)體是指函數(shù)返回值的類型,如省略,返回值是變體型的。 與與Sub過程相同過程相同q 可以在可以在“代碼窗口代碼窗口”中直接輸入來建立中直接輸入來建立Function過過程。程。q 也可以選擇也可以選擇“工具工具”菜單中的菜單中的“添加過程添加過程”命令來命令來建立建立Function過程過程(選擇選擇“函數(shù)函數(shù)”類型類型) 。. Function過程的建立過程的建立 把求兩個數(shù)中的大數(shù)編成把求兩個數(shù)中的大數(shù)編成Function過程,過程名為過程,過程名為Max 本例采用本例采用InputBox函數(shù)輸入三個數(shù),判斷出最大數(shù)后采用函數(shù)輸入三個數(shù),判斷出最大數(shù)后

16、采用Print直接輸出在窗體上。直接輸出在窗體上。 程序代碼如下:程序代碼如下:Private Sub Form_Load() Show Dim a As Single, b As Single, c As Single Dim s As Single a = Val(InputBox(輸入第一個數(shù)輸入第一個數(shù)) b = Val(InputBox(輸入第二個數(shù)輸入第二個數(shù)) c = Val(InputBox(輸入第三個數(shù)輸入第三個數(shù)) s = max(a, b) Print 最大數(shù)是最大數(shù)是:; max(s, c)End SubFunction max(m, n) As Single If m

17、 n Then max = m Else max = n End IfEnd Function 例例6.2 輸入三個數(shù),求出它們的最大數(shù)輸入三個數(shù),求出它們的最大數(shù)q查看查看當(dāng)前模塊當(dāng)前模塊中有哪些中有哪些Sub過程和過程和Function過程:過程: 在代碼窗口的對象框中選擇在代碼窗口的對象框中選擇“通用通用”項(xiàng),即可在項(xiàng),即可在過程框中列出所有過程。過程框中列出所有過程。q 查看查看其他模塊其他模塊中的過程:中的過程: 可選擇可選擇“視圖視圖”菜單中的菜單中的“對象瀏覽器對象瀏覽器”命令,命令,在在“對象瀏覽器對象瀏覽器”對話框中,從對話框中,從“庫庫”列表框中列表框中選擇選擇工程工程,從

18、,從“類類”列表框中選擇列表框中選擇模塊模塊,此時在,此時在“成員成員” 列表框中列出該模塊擁有的過程。列表框中列出該模塊擁有的過程。 6.2.3 6.2.3 查看查看過程過程 事件過程是通過事件驅(qū)動和由系統(tǒng)自動調(diào)用的,而事件過程是通過事件驅(qū)動和由系統(tǒng)自動調(diào)用的,而Sub過程過程則必須通過調(diào)用語句實(shí)行調(diào)用則必須通過調(diào)用語句實(shí)行調(diào)用1. Function 過程的調(diào)用過程的調(diào)用 調(diào)用調(diào)用Sub過程有以下兩種方法:過程有以下兩種方法: (1)使用使用Call語句。格式:語句。格式: Call 過程名過程名(實(shí)參表實(shí)參表) (2)直接使用過程名,格式:直接使用過程名,格式: 過程名實(shí)參表過程名實(shí)參表

19、例如,調(diào)用名為例如,調(diào)用名為SubCal的過程:的過程: Call SubCal(10) SubCal 10 6.6.3. 過程過程的調(diào)用的調(diào)用對無參數(shù)過程調(diào)用,直接寫過程名就行了 因?yàn)橛?jì)算因?yàn)橛?jì)算5!和和10!都要用到階乘都要用到階乘n! (n!123n) 所所以把計(jì)算以把計(jì)算n!編成編成Sub過程過程 采用采用Print直接在窗體上輸出結(jié)果,程序代碼:直接在窗體上輸出結(jié)果,程序代碼:Private Sub Form_Load() Show Dim y As Long, s As Long Call Jc(5, y) s = y Call Jc(10, y) s = s + y Print

20、5! + 10! =; sEnd Sub程序運(yùn)行結(jié)果:程序運(yùn)行結(jié)果: 5! + 10! 3628920Private Sub Jc(n As Integer, t As Long) Dim i As Integer t = 1 For i = 1 To n t = t * i Next iEnd Sub 注意參數(shù)注意參數(shù)n和和t的不同,的不同,n是帶入?yún)?shù),是帶入?yún)?shù),t是結(jié)果是結(jié)果參數(shù)參數(shù) 例例6.36.3 計(jì)算計(jì)算5! + 10!5! + 10! (1)直接調(diào)用直接調(diào)用 像使用像使用VB內(nèi)部函數(shù)一樣,只需寫出函數(shù)名和相應(yīng)的參數(shù)內(nèi)部函數(shù)一樣,只需寫出函數(shù)名和相應(yīng)的參數(shù)即可。例如:即可。例如:

21、 s = Max(a, b) Print Max(s, c) (2)用用Call語句調(diào)用語句調(diào)用 與調(diào)用與調(diào)用Sub過程一樣來調(diào)用過程一樣來調(diào)用Function過程,例如:過程,例如: Call Max(a, b) 當(dāng)用這種方法調(diào)用當(dāng)用這種方法調(diào)用Function過程時,將會放棄返回值過程時,將會放棄返回值 2. Function 過程的調(diào)用過程的調(diào)用 參數(shù)傳遞可以實(shí)現(xiàn)調(diào)用過程和被調(diào)過程之間的信息交換參數(shù)傳遞可以實(shí)現(xiàn)調(diào)用過程和被調(diào)過程之間的信息交換 兩種兩種方式:按值傳遞和按地址傳遞方式:按值傳遞和按地址傳遞6.4.1 形參與實(shí)參形參與實(shí)參 形式參數(shù)形式參數(shù)(簡稱形參簡稱形參) 指的是被調(diào)用過

22、程中的參數(shù)。出現(xiàn)在指的是被調(diào)用過程中的參數(shù)。出現(xiàn)在Sub過程或過程或Function過程中,形參可以是變量名和數(shù)據(jù)名,形參過程中,形參可以是變量名和數(shù)據(jù)名,形參表中的各個變量之間用逗號分隔。表中的各個變量之間用逗號分隔。 6.4 6.4 參數(shù)傳遞參數(shù)傳遞 實(shí)際參數(shù)實(shí)際參數(shù)(簡稱實(shí)參簡稱實(shí)參)是調(diào)用過程中的參數(shù)。寫在子過程名或函數(shù)名后括是調(diào)用過程中的參數(shù)。寫在子過程名或函數(shù)名后括號內(nèi),其作用是將實(shí)參數(shù)據(jù)傳送給形參號內(nèi),其作用是將實(shí)參數(shù)據(jù)傳送給形參。實(shí)參可由常量、表達(dá)式、有效的變量名、數(shù)組名實(shí)參可由常量、表達(dá)式、有效的變量名、數(shù)組名(后加左、右括號,如(后加左、右括號,如A( ))組成,實(shí)參表中各

23、參)組成,實(shí)參表中各參數(shù)用逗號分隔。數(shù)用逗號分隔。形參表和實(shí)參表中的對應(yīng)變量名可以不同,但實(shí)參形參表和實(shí)參表中的對應(yīng)變量名可以不同,但實(shí)參和形參的個數(shù)、順序以及數(shù)據(jù)類型必須相同和形參的個數(shù)、順序以及數(shù)據(jù)類型必須相同 定義過程和調(diào)用過程的示例:定義過程和調(diào)用過程的示例:調(diào)用過程:調(diào)用過程:Call Mysub(100, Call Mysub(100, 計(jì)算機(jī)計(jì)算機(jī) , 1.5)1.5)定義過程:定義過程:Sub Mysub(t As Integer,s As String,y As Single)Sub Mysub(t As Integer,s As String,y As Single) “形

24、實(shí)結(jié)合形實(shí)結(jié)合”是按照位置結(jié)合的,即第一個實(shí)參值是按照位置結(jié)合的,即第一個實(shí)參值(100)傳送給傳送給第一個形參第一個形參t,第二個實(shí)參值,第二個實(shí)參值(“計(jì)算機(jī)計(jì)算機(jī)”)傳送給第二個形參傳送給第二個形參s,第三個實(shí)參值第三個實(shí)參值(1.5)傳送給第三個形參傳送給第三個形參y。 數(shù)組可以作為形參出現(xiàn)在過程的形參表中數(shù)組可以作為形參出現(xiàn)在過程的形參表中 輸入若干個輸入若干個(不超過不超過100)個學(xué)生的成績,求出平均分、個學(xué)生的成績,求出平均分、最高分及最低分最高分及最低分 本例采用本例采用InputBox函數(shù)來輸入成績,計(jì)算結(jié)果直接輸出函數(shù)來輸入成績,計(jì)算結(jié)果直接輸出到窗體上到窗體上例例6.4

25、 求出學(xué)生成績的平均分、最高分及最低分求出學(xué)生成績的平均分、最高分及最低分 Private Sub Form_Load()Private Sub Form_Load() Dim jc(100) As Integer, x As Integer,n As Integer, _ sum As Long, max As Integer, min As Integer n = 0 Do While True x = Val(InputBox(請輸入第請輸入第 & n + 1 & _ 個學(xué)生的成績個學(xué)生的成績(-1結(jié)束結(jié)束) If x = -1 Then Exit Do n = n + 1 jc(n)

26、= x Loop If n 0 Then Call Caljc(n, jc(), sum, max, min) Else End End If Show Print 平均分:平均分:; Format(sum / n, #.0) Print 最高分:最高分:; max Print 最低分:最低分:; min End SubEnd Sub Sub Caljc(k As Integer, darray() As Integer, _ s As Long, m As Integer, n As Integer) Dim i As Integer s = darray(1) : m = darray(1

27、) : n = darray(1) If k = 1 Then Exit Sub k是數(shù)組的下界是數(shù)組的下界 For i = 2 To k s = s + darray(i) If m darray(i) Then n = darray(i) Next i End Sub 1. 1. 按地址傳遞按地址傳遞 是是VB默認(rèn)的參數(shù)傳遞方式默認(rèn)的參數(shù)傳遞方式 按地址傳遞按地址傳遞(關(guān)鍵字關(guān)鍵字ByRef):把實(shí)參變量的內(nèi)存地:把實(shí)參變量的內(nèi)存地址傳遞給被調(diào)過程址傳遞給被調(diào)過程(如如Sub過程過程),即形參與實(shí)參使用,即形參與實(shí)參使用相同的內(nèi)存地址單元。傳址:相同的內(nèi)存地址單元。傳址: 形參得到的是實(shí)參

28、的形參得到的是實(shí)參的地址,當(dāng)形參值的改變同時也改變實(shí)參的值。地址,當(dāng)形參值的改變同時也改變實(shí)參的值。 例例7.2中,中,F(xiàn)orm_Load()事件過程是通過事件過程是通過“Call Jc(5,y)”和和“Call Jc(10,y)”來調(diào)用過程來調(diào)用過程Jc(n,t)的,其的,其中采用的第二個參數(shù)就是按地址來傳送數(shù)據(jù)的中采用的第二個參數(shù)就是按地址來傳送數(shù)據(jù)的6.4.26.4.2 按地址傳遞和按值傳遞按地址傳遞和按值傳遞通過地址傳遞數(shù)據(jù)的執(zhí)行過程通過地址傳遞數(shù)據(jù)的執(zhí)行過程 Sub Swap2(x%, y%) Dim Temp% Temp = x: x = y: y = Temp End Sub a

29、 = 10: b = 20 Swap2 a, b 傳地址傳地址 Print A2=; a, B2=; b參數(shù)是按地址傳遞參數(shù)是按地址傳遞 按值傳遞按值傳遞(關(guān)鍵字關(guān)鍵字ByVal):通過常量傳遞實(shí)際參:通過常量傳遞實(shí)際參數(shù),即傳遞參數(shù)值而不是傳遞它的地址,數(shù),即傳遞參數(shù)值而不是傳遞它的地址,即將實(shí)參即將實(shí)參的值復(fù)制給形參的值復(fù)制給形參。 因?yàn)橥ㄓ眠^程不能訪問實(shí)參的內(nèi)存地址,因而因?yàn)橥ㄓ眠^程不能訪問實(shí)參的內(nèi)存地址,因而在通用過程中對形參的任何操作都不會影響實(shí)參在通用過程中對形參的任何操作都不會影響實(shí)參 。 2. 按值傳遞按值傳遞按值傳遞的執(zhí)行過程如下圖:按值傳遞的執(zhí)行過程如下圖:Sub Swap

30、1(ByVal x%, ByVal y%) Dim Temp% Temp = x: x = y: y = TempEnd Sub a% = 10: b% = 20 Swap1 a, b Print A1=; a, B1=; b參數(shù)是按值傳遞參數(shù)是按值傳遞 設(shè)置兩個通用過程設(shè)置兩個通用過程Test1和和Test2,分別按值傳遞和按地址傳遞,分別按值傳遞和按地址傳遞Private Sub Form_Load() Dim x As Integer Show x = 5 Print 執(zhí)行執(zhí)行test1前,前,x=; x Call test1(x) Print 執(zhí)行執(zhí)行test1后,后,test2前,前

31、,x=; x Call test2(x) Print 執(zhí)行執(zhí)行test2后,后,x=; xEnd SubSub test1(ByVal t As Integer) t = t + 5End SubSub test2(s As Integer) s = s - 5End Sub 運(yùn)行結(jié)果運(yùn)行結(jié)果執(zhí)行執(zhí)行Test1前,前,x=5執(zhí)行執(zhí)行Test1后,后,Test2前,前,x=5執(zhí)行執(zhí)行Test2后,后,x=0 例例6.5 參數(shù)傳遞方式示例參數(shù)傳遞方式示例 一個過程調(diào)用過程本身,就稱為過程的遞歸調(diào)用一個過程調(diào)用過程本身,就稱為過程的遞歸調(diào)用 采用遞歸方法來解決問題時,必須符合以下兩個條采用遞歸方法來

32、解決問題時,必須符合以下兩個條件:件: (1)可以把要解的問題轉(zhuǎn)化為一個新的問題,而這個新的問可以把要解的問題轉(zhuǎn)化為一個新的問題,而這個新的問題的解法仍與原來的解法相同;題的解法仍與原來的解法相同; (2)有一個明確的結(jié)束遞歸的條件有一個明確的結(jié)束遞歸的條件(終止條件終止條件),否則過程將永,否則過程將永遠(yuǎn)遠(yuǎn)“遞歸遞歸”下去下去 6.5 過程的遞歸調(diào)用過程的遞歸調(diào)用 可用下列的遞歸公式可用下列的遞歸公式 1 n=1 n(n-1)! n1 本遞歸中,終止條件是本遞歸中,終止條件是n=1n! =例例6.66.6 采用遞歸方法求采用遞歸方法求n! (n0)n! (n0)Private Sub For

33、m_Load() Dim n As Integer, m As Double Show n = Val(InputBox(輸入輸入115之間的整數(shù)之間的整數(shù)) If n 15 Then MsgBox 錯誤數(shù)據(jù)錯誤數(shù)據(jù), 0, 檢查數(shù)據(jù)檢查數(shù)據(jù) End End If m= fac(n) Print n; != ; mEnd SubPrivate Function fac(n) As Double If n 1 Then fac = n * fac(n - 1) 遞歸調(diào)用遞歸調(diào)用 Else fac = 1 n=1時,結(jié)束遞歸時,結(jié)束遞歸 End IfEnd Function 說明:當(dāng)說明:當(dāng)n1時

34、,在時,在Fac過程中調(diào)用過程中調(diào)用Fac過程,然后過程,然后n減減1,再次調(diào)用,再次調(diào)用Fac過過程,這種操作一直持續(xù)到程,這種操作一直持續(xù)到n=1為止。例如,當(dāng)為止。例如,當(dāng)n=3時,求時,求Fac(3)變成求變成求3Fac(2),求,求Fac(2)變成求變成求2Fac(1),而,而Fac(1)為為1,遞歸結(jié)束。以后再逐層,遞歸結(jié)束。以后再逐層返回,遞推出返回,遞推出Fac(2)及及Fac(3)的值的值 注意,在某次調(diào)用注意,在某次調(diào)用Fac過程時并不是立即得到過程時并不是立即得到Fac(n)的值,而是一次又一的值,而是一次又一次地進(jìn)行遞歸調(diào)用,到次地進(jìn)行遞歸調(diào)用,到Fac(1)時才有確定

35、的值,然后通用過程逐層返回中依次時才有確定的值,然后通用過程逐層返回中依次算出算出Fac(2)、Fac(3)的值的值Form_Load過程過程m=Fac(3)Fac過程過程調(diào)用調(diào)用Fac(3)值值為為6參數(shù)參數(shù)n為為3Fac=3*Fac(2)Fac過程過程調(diào)用調(diào)用Fac(2)值值為為2參數(shù)參數(shù)n為為2Fac=2*Fac(1)Fac過程過程調(diào)用調(diào)用Fac(1)值值為為1參數(shù)參數(shù)n為為1Fac=1 遞歸調(diào)用過程遞歸調(diào)用過程(n=3) 在在VB中,由于可以在過程中和模塊中聲明變量,根據(jù)定中,由于可以在過程中和模塊中聲明變量,根據(jù)定義變量的位置和定義變量的語句不同,變量可以分為:義變量的位置和定義變量

36、的語句不同,變量可以分為:局部變量(過程級變量)局部變量(過程級變量)窗體窗體/模塊級變量(私有的模塊級變量,能被本模塊的所有模塊級變量(私有的模塊級變量,能被本模塊的所有過程和函數(shù)使用)過程和函數(shù)使用)全局級變量(公有的模塊級變量)。全局級變量(公有的模塊級變量)。 6.6 變量的作用范圍變量的作用范圍1、 過程級變量過程級變量局部變量局部變量 局部變量:在過程內(nèi)聲明的變量,只能在本過程中使用。局部變量:在過程內(nèi)聲明的變量,只能在本過程中使用。 在過程內(nèi)部使用在過程內(nèi)部使用 Dim 或者或者 Static 關(guān)鍵字來聲明的變量,關(guān)鍵字來聲明的變量,只在聲明它們的過程中才能被訪問或改變該變量的值

37、,別的過只在聲明它們的過程中才能被訪問或改變該變量的值,別的過程不可訪問。所以可以在不同的過程中聲明相同名字的局部變程不可訪問。所以可以在不同的過程中聲明相同名字的局部變量而互不影響。量而互不影響。 例:例:Private Sub Form_Load() Dim n% n= 10End SubPrivate Sub From_Click() Dim n% Print “n=“;nEnd Sub程序運(yùn)行后單擊窗體,其輸出結(jié)果是什么?程序運(yùn)行后單擊窗體,其輸出結(jié)果是什么?N=02、 窗體窗體/模塊級變量模塊級變量 窗體窗體/模塊級變量:在模塊級變量:在“ “通用聲明通用聲明” ”段中用段中用Dim

38、語句或用語句或用Private語句聲明的變量,可被本窗體語句聲明的變量,可被本窗體/模塊的任何過程訪問。模塊的任何過程訪問。但其他模塊卻不能訪問該變量。但其他模塊卻不能訪問該變量。 例如:在例如:在“通用聲明通用聲明”段聲明如下變量段聲明如下變量: Private s As String Dim a As Integer 如果還允許其他窗體和模塊中引用本模塊的變量,就如果還允許其他窗體和模塊中引用本模塊的變量,就必須用必須用Public來聲明變量,例如:來聲明變量,例如: Public a as integer 假設(shè)本窗體為假設(shè)本窗體為Form1 這樣,在另外一個窗體(如這樣,在另外一個窗體(

39、如form2)或模塊中可以用或模塊中可以用Form1.a來來引用該變量。引用該變量。注意注意:不能把:不能把a(bǔ)誤認(rèn)為全局變量。因?yàn)槿肿兞吭谄渌绑w和模誤認(rèn)為全局變量。因?yàn)槿肿兞吭谄渌绑w和模塊中引用時只需寫塊中引用時只需寫a,不需要寫不需要寫Form1.a 2. 2. 模塊級變量模塊級變量 全局變量可以被應(yīng)用程序中任何一個窗體和模塊全局變量可以被應(yīng)用程序中任何一個窗體和模塊直接訪問。直接訪問。 全局變量要在標(biāo)準(zhǔn)模塊文件全局變量要在標(biāo)準(zhǔn)模塊文件(.bas)中的聲明部分中的聲明部分用用Global或或Public語句來聲明。語句來聲明。 格式:格式: Global 變量名變量名 As 數(shù)據(jù)類型

40、數(shù)據(jù)類型 Public 變量名變量名 As 數(shù)據(jù)類型數(shù)據(jù)類型3. 3. 全局變量全局變量3種變量聲明及使用規(guī)則如下表:種變量聲明及使用規(guī)則如下表:1、窗體、窗體/模塊級過程:模塊級過程: 在窗體模塊或標(biāo)準(zhǔn)模塊中加在窗體模塊或標(biāo)準(zhǔn)模塊中加Private關(guān)鍵字定義的過程,只能關(guān)鍵字定義的過程,只能被定義它的窗體模塊或標(biāo)準(zhǔn)模被定義它的窗體模塊或標(biāo)準(zhǔn)模 塊中的過程調(diào)用。塊中的過程調(diào)用。2、全局級過程:、全局級過程: 在窗體模塊或標(biāo)準(zhǔn)模塊中加在窗體模塊或標(biāo)準(zhǔn)模塊中加Public關(guān)鍵字定義(或缺?。┑年P(guān)鍵字定義(或缺?。┑倪^程,可供該應(yīng)用程序的所有窗體模塊和所有標(biāo)準(zhǔn)模塊中的過程過程,可供該應(yīng)用程序的所有窗

41、體模塊和所有標(biāo)準(zhǔn)模塊中的過程調(diào)用。調(diào)用。按過程的作用范圍來劃分,過程可分為:按過程的作用范圍來劃分,過程可分為: 模塊級過程模塊級過程 全局級過程全局級過程 6.7 過程過程的作用范圍的作用范圍總結(jié)歸納過程的定義及作用域如下表總結(jié)歸納過程的定義及作用域如下表u生存期,也即變量能夠保持其值的時間生存期,也即變量能夠保持其值的時間 。根據(jù)變量的生。根據(jù)變量的生存期,可將變量分為動態(tài)變量和靜態(tài)變量存期,可將變量分為動態(tài)變量和靜態(tài)變量 1. 動態(tài)變量動態(tài)變量 動態(tài)變量是指程序運(yùn)行進(jìn)入變量所在的過程時,才分配給該動態(tài)變量是指程序運(yùn)行進(jìn)入變量所在的過程時,才分配給該變量的內(nèi)存單元,經(jīng)過處理退出該過程時,該

42、變量占用的內(nèi)存單變量的內(nèi)存單元,經(jīng)過處理退出該過程時,該變量占用的內(nèi)存單元自動釋放,其值消失。當(dāng)再次進(jìn)入該過程時,所有的動態(tài)變量元自動釋放,其值消失。當(dāng)再次進(jìn)入該過程時,所有的動態(tài)變量將重新初始化。將重新初始化。u 使用使用Dim關(guān)鍵字在過程中聲明的局部變量屬于動態(tài)變量關(guān)鍵字在過程中聲明的局部變量屬于動態(tài)變量 (補(bǔ)充)變量(補(bǔ)充)變量的生存期的生存期 u靜態(tài)變量是指程序運(yùn)行進(jìn)入該變量所在的過程時,靜態(tài)變量是指程序運(yùn)行進(jìn)入該變量所在的過程時,修改變量的值后退出該過程時,其值依然保留,變修改變量的值后退出該過程時,其值依然保留,變量所占的內(nèi)存單元不被釋放。當(dāng)再次進(jìn)入該過程時,量所占的內(nèi)存單元不被釋

43、放。當(dāng)再次進(jìn)入該過程時,原來的變量值可繼續(xù)使用。原來的變量值可繼續(xù)使用。u使用使用Static關(guān)鍵字在過程中聲明的局部變量屬于靜關(guān)鍵字在過程中聲明的局部變量屬于靜態(tài)變量。態(tài)變量。u聲明形式:聲明形式: Static 變量名變量名 AS 類型類型Static Function 函數(shù)過程名函數(shù)過程名(參數(shù)列表參數(shù)列表) As 類型類型Static Sub 子過程名子過程名(參數(shù)列表參數(shù)列表) 注意:過程名前加注意:過程名前加Static,表示該過程內(nèi)的局部變量都是靜態(tài)變,表示該過程內(nèi)的局部變量都是靜態(tài)變量。量。 2. 靜態(tài)變量靜態(tài)變量 例例6.7 使用使用Static Sub語句的示例語句的示例

44、Static Sub Subtest() Dim t As Integer t為靜態(tài)變量為靜態(tài)變量 t = 2 * t + 1 Print t End Sub Private Sub Command1_Click() Call Subtest 調(diào)用子過程調(diào)用子過程Subtest End Sub 2. 靜態(tài)變量靜態(tài)變量 例:有一個人編了下面一段程序,想用變例:有一個人編了下面一段程序,想用變量量n記記錄單擊窗體的次數(shù)。錄單擊窗體的次數(shù)。Private Sub Form_Click() Dim n As Integer n = n + 1 Print 已單擊次數(shù):已單擊次數(shù):; n & 次次End

45、 Sub靜態(tài)變量靜態(tài)變量分析程序運(yùn)行后多次單擊窗體的輸出結(jié)果:分析程序運(yùn)行后多次單擊窗體的輸出結(jié)果: 要記錄單擊窗體次數(shù),如何實(shí)現(xiàn)?并比較使用模塊變量和靜要記錄單擊窗體次數(shù),如何實(shí)現(xiàn)?并比較使用模塊變量和靜態(tài)變量的差別。態(tài)變量的差別。Private Sub Form_Click() satic n As Integer n = n + 1 Print 已單擊次數(shù):已單擊次數(shù):; n & 次次End Sub 運(yùn)行后,多次單擊命令按鈕運(yùn)行后,多次單擊命令按鈕Command1,執(zhí)行結(jié)果為:執(zhí)行結(jié)果為: 1 3 7 將將Static Sub改為改為Private Sub后,運(yùn)行過程中多次單擊命令后,運(yùn)

46、行過程中多次單擊命令按鈕按鈕Command1,執(zhí)行結(jié)果為:,執(zhí)行結(jié)果為: 1 1 1 6.8 shell調(diào)用調(diào)用Shell就是一個打開應(yīng)用程序的函數(shù),所帶的參數(shù)為樣式參數(shù)。功能功能:執(zhí)行一個可執(zhí)行文件,返回一個 Variant (Double),如果成功的話,代表這個程序的任務(wù) ID,若不成功,則會返回 0。 格式格式:Shell(PathName,WindowStyle)PathName為必需參數(shù)。類型為String,它指出了要執(zhí)行的程序名,以及任何需要的參數(shù)或命令行變量,也可以包括路徑名。WindowStyle為可選參數(shù)。Integer類型,指定在程序運(yùn)行時窗口的樣式。如果windowst

47、yle省略,則程序是以具有焦點(diǎn)的最小化窗口來執(zhí)行的。WindowStyle的取值及其描述如下表所示。1 打開記事本打開記事本 Private Sub Command1_Click() Shell Notepad E:VB練習(xí)添加DTPicker控件.txt , vbNormalFocus End Sub注:NotePad后有空格2 打開打開QQ登陸界面登陸界面 Private Sub Command2_Click() Shell D:Program FilesTencentQQ2009Binqq.exe, vbNormalFocus End Sub3 打開打開Word文檔文檔 Private Sub Command3_Click(Index As Integer) Dim strDir As String strDir = E:VB練習(xí)練習(xí)Test.doc Select Case Index Case 0 Shell C:Program FilesMicrosoft OfficeOFFICE11WINWORD.EXE & strDir, vbHide Case 1 Shell C:Program FilesMicrosoft OfficeOFFICE11WINWORD.EXE & strDir, vbNormalFocus Case 2 Shell C:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論