第八章子過程和函數(shù)過程_第1頁
第八章子過程和函數(shù)過程_第2頁
第八章子過程和函數(shù)過程_第3頁
第八章子過程和函數(shù)過程_第4頁
第八章子過程和函數(shù)過程_第5頁
已閱讀5頁,還剩69頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、本章內(nèi)容及要求 8.1 Sub過程的定義和調(diào)用 8.2 Function函數(shù)過程的定義和調(diào)用 8.3 參數(shù)傳遞 8.4 過程的嵌套和遞歸調(diào)用 8.5 變量及過程的作用域 (1)窗體事件過程)窗體事件過程Private Sub Form_事件名事件名(參數(shù)列表參數(shù)列表)語句組語句組End Sub (2)控件事件過程)控件事件過程Private Sub 控件名控件名_事件名事件名(參數(shù)列表參數(shù)列表)語句組語句組 End Sub8.1.1 事件事件Sub過程過程8.1 Sub子過程的定義和調(diào)用子過程的定義和調(diào)用在在VB中中Sub子過程分為:事件過程和用戶自定義過程子過程分為:事件過程和用戶自定義過程

2、方法一方法一: 通過通過 “工具工具”菜單中的菜單中的“添加過程添加過程”命令,出現(xiàn)命令,出現(xiàn)“添加過程添加過程”對話框,選擇過程類型(子過程、函數(shù)、屬性、對話框,選擇過程類型(子過程、函數(shù)、屬性、事件)及作用范圍(公有的事件)及作用范圍(公有的Public、私有的、私有的Private),單擊確),單擊確定后得到一個過程定義的結(jié)構(gòu)框架(模板),如:定后得到一個過程定義的結(jié)構(gòu)框架(模板),如:Sub子過程的定義子過程的定義-兩種方法兩種方法8.1.2 用戶自定義用戶自定義 Sub子過程定義子過程定義Public Sub Sort( )End SubPublic|PrivateStatic Su

3、b 子過程名子過程名(形參表形參表) 語句組語句組 Exit Sub 語句組語句組End Sub 方法二:方法二:直接在代碼窗口中輸入直接在代碼窗口中輸入過程體過程體例例1: 編一個交換兩個整型變量值的子過程。編一個交換兩個整型變量值的子過程。Private Sub Swap( X As Integer, Y As Integer)Dim temp As Integer Temp=X X=Y Y=TempEnd Sub例例2:編寫求階乘的子過程。:編寫求階乘的子過程。Private sub fact(n As Integer,f as Double) Dim i As Integer f =

4、1 For i = 1 To n f = f * i NextEnd sub。說明:說明:(1)子過程名:子過程名:命名規(guī)則與變量名規(guī)則相同。子過程命名規(guī)則與變量名規(guī)則相同。子過程名不名不返回返回值,而是通過形參與實(shí)參的傳遞得到結(jié)果,調(diào)用時可返回多個值值,而是通過形參與實(shí)參的傳遞得到結(jié)果,調(diào)用時可返回多個值(2)形式參數(shù)列表:形式參數(shù)列表:形式參數(shù)通常簡稱形式參數(shù)通常簡稱“形參形參”,僅表示形參,僅表示形參的類型、個數(shù)、位置,的類型、個數(shù)、位置,定義時是無值的定義時是無值的,只有在過程被調(diào)用時,只有在過程被調(diào)用時,虛實(shí)參結(jié)合后才獲得相應(yīng)的值。虛實(shí)參結(jié)合后才獲得相應(yīng)的值。(3)過程可以無形式參數(shù)

5、,但括號不能省。過程可以無形式參數(shù),但括號不能省。(4)參數(shù)的定義形式:參數(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ù)是按地址傳遞的,缺省時傳址。缺省時傳址。 方法一:方法一: Call 子過程名子過程名(參數(shù)列表參數(shù)列表)方法二:子過程名方法二:子過程名 參數(shù)列表參數(shù)列表 說明:說明: (1)參數(shù)列表參數(shù)列表稱為實(shí)參或?qū)嵲?,它必須與形參保持個數(shù)相同,稱為實(shí)參或?qū)嵲仨毰c形參保持個數(shù)相同,位置與類型一一

6、對應(yīng)位置與類型一一對應(yīng)。 (2)調(diào)用時把調(diào)用時把實(shí)參實(shí)參值傳遞給對應(yīng)的值傳遞給對應(yīng)的形參形參。其中值傳遞(形參前有其中值傳遞(形參前有ByVal說明)時實(shí)參的值不隨形參的值變說明)時實(shí)參的值不隨形參的值變化而改變。而地址傳遞時實(shí)參的值隨形參值的改變而改變?;淖儭6刂穫鬟f時實(shí)參的值隨形參值的改變而改變。8.1.3 子過程的調(diào)用子過程的調(diào)用 (3)當(dāng)參數(shù)是數(shù)組時,形參與實(shí)參在參數(shù)聲明時應(yīng)省略其當(dāng)參數(shù)是數(shù)組時,形參與實(shí)參在參數(shù)聲明時應(yīng)省略其維數(shù),維數(shù),但括號不能省但括號不能省。 (4)調(diào)用子過程的形式有兩種,用調(diào)用子過程的形式有兩種,用Call關(guān)鍵字時,實(shí)參必須關(guān)鍵字時,實(shí)參必須加圓括號括起加

7、圓括號括起,反之則不用,反之則不用加圓括號括起。加圓括號括起。實(shí)參之間用實(shí)參之間用“,”分隔。分隔。例:調(diào)用上面定義的例:調(diào)用上面定義的Swap子過程的形式:子過程的形式: Swap a,b Call Swap(a,b)在某個事件過程中調(diào)用已定義在某個事件過程中調(diào)用已定義的階乘的過程的階乘的過程fact:Private Sub Command1_Click() Dim n As Integer, m As Long n = 5 Call fact(n, m) Print mEnd SubPrivate Sub CmdOK_click() Call Swap(a,b) Swap a,bEnd S

8、ubPrivate Sub Swap(x%,y%) Dim temp% Temp=X X=Y Y=TempEnd Sub 過程調(diào)用的執(zhí)行過程:過程調(diào)用的執(zhí)行過程: Visual Basic函數(shù)分為函數(shù)分為內(nèi)部函數(shù)內(nèi)部函數(shù)和和外部(自定外部(自定義)函數(shù)義)函數(shù),外部函數(shù)是用戶根據(jù)需要用,外部函數(shù)是用戶根據(jù)需要用Function關(guān)鍵字定義的函數(shù)過程,關(guān)鍵字定義的函數(shù)過程,與子過程不同的是函數(shù)與子過程不同的是函數(shù)名將返回一個值名將返回一個值 。 8.2 Function函數(shù)過程的定義和調(diào)用函數(shù)過程的定義和調(diào)用方法一方法一: 通過通過 “工具工具”菜單中的菜單中的“添加過程添加過程”命令,出現(xiàn)命令,

9、出現(xiàn)“添加添加過程過程”對話框,選擇過程類型(子過程、對話框,選擇過程類型(子過程、函數(shù)函數(shù)、屬性、事件)及作、屬性、事件)及作用范圍(公有的用范圍(公有的Public、私有的、私有的Private),單擊確定后得到一個函),單擊確定后得到一個函數(shù)定義的結(jié)構(gòu)框架(模板),如:數(shù)定義的結(jié)構(gòu)框架(模板),如:Public Function Sort( )End Function8.2.1 Function函數(shù)過程的定義函數(shù)過程的定義Function函數(shù)過程過程的定義函數(shù)過程過程的定義-兩種方法兩種方法Public|PrivateStatic Function 函數(shù)名函數(shù)名()As函數(shù)名函數(shù)名=返回

10、值返回值Exit Function函數(shù)名函數(shù)名=返回值返回值End Function方法二:方法二:直接在代碼窗口中輸入直接在代碼窗口中輸入函數(shù)體函數(shù)體Function fact(n As Integer) As Double Dim i As Integer, f As Double f = 1 For i = 1 To n f = f * i Next fact = fEnd Function把例把例2階乘的階乘的sub 子過程改為子過程改為Function函數(shù)過程函數(shù)過程說明:說明:(1)函數(shù)名:函數(shù)名:命名規(guī)則與變量名規(guī)則相同。但不能與系統(tǒng)的命名規(guī)則與變量名規(guī)則相同。但不能與系統(tǒng)的內(nèi)部

11、函數(shù)或其它通用子過程同名,也不能與已定義的全局變內(nèi)部函數(shù)或其它通用子過程同名,也不能與已定義的全局變量和本模塊中模塊級變量同名。量和本模塊中模塊級變量同名。(2)在函數(shù)體內(nèi),函數(shù)名可以當(dāng)變量使用,函數(shù)的返回值就)在函數(shù)體內(nèi),函數(shù)名可以當(dāng)變量使用,函數(shù)的返回值就是通過對函數(shù)名的賦值語句來實(shí)現(xiàn)的,是通過對函數(shù)名的賦值語句來實(shí)現(xiàn)的,在函數(shù)過程中至少要在函數(shù)過程中至少要對函數(shù)名賦值一次。對函數(shù)名賦值一次。(3)AS類型:類型:是指函數(shù)返回值的類型,若省略,則函數(shù)返是指函數(shù)返回值的類型,若省略,則函數(shù)返回變體類型值(回變體類型值(Variant)。)。 (4)Exit Function:表示退出函數(shù)過程

12、,常常是與選擇結(jié)構(gòu):表示退出函數(shù)過程,常常是與選擇結(jié)構(gòu)(If或或Select Case語句)聯(lián)用,即當(dāng)滿足一定條件時,退出函語句)聯(lián)用,即當(dāng)滿足一定條件時,退出函數(shù)過程。數(shù)過程。(5)形參數(shù)列表形參數(shù)列表:形參的定義與子過程完全相同。:形參的定義與子過程完全相同。 調(diào)用形式如下:調(diào)用形式如下: 函數(shù)名(實(shí)參列表)函數(shù)名(實(shí)參列表)說明:說明:在調(diào)用時實(shí)參和形參的在調(diào)用時實(shí)參和形參的數(shù)據(jù)類型、順序、個數(shù)必須匹配數(shù)據(jù)類型、順序、個數(shù)必須匹配。函數(shù)調(diào)用只能出現(xiàn)函數(shù)調(diào)用只能出現(xiàn)在表達(dá)式中在表達(dá)式中,其,其功能功能是求得函數(shù)的是求得函數(shù)的返回值返回值。8.2.2 函數(shù)過程的調(diào)用函數(shù)過程的調(diào)用調(diào)用階乘的過

13、程調(diào)用階乘的過程:Private Sub Command1_Click() Dim S As Integer S = 5 Print fact(S)End Sub2009-03-29以下關(guān)于過程及過程參數(shù)的描述中,錯誤的是以下關(guān)于過程及過程參數(shù)的描述中,錯誤的是A)過程的參數(shù)可以是控件名稱)過程的參數(shù)可以是控件名稱 B)調(diào)用過程時使用的實(shí)參的個數(shù)應(yīng)與過程形參的個數(shù)相同)調(diào)用過程時使用的實(shí)參的個數(shù)應(yīng)與過程形參的個數(shù)相同 C)只有函數(shù)過程能夠?qū)⑦^程中處理的信息返回到調(diào)用程中)只有函數(shù)過程能夠?qū)⑦^程中處理的信息返回到調(diào)用程中 D)窗體可以作為過程的參數(shù))窗體可以作為過程的參數(shù)課堂練習(xí)課堂練習(xí)2010

14、-03-22下面是求最大公約數(shù)的函數(shù)的首部下面是求最大公約數(shù)的函數(shù)的首部Function gcd(ByVal x As Integer, ByVal y As Integer) As Integer若要輸出若要輸出8、12、16這這3個數(shù)的最大公約數(shù),下面正確的語句是個數(shù)的最大公約數(shù),下面正確的語句是A)Print gcd(8,12),gcd(12,16),gcd(16,8)B)Print gcd(8,12,16)C)Print gcd(8),gcd(12),gcd(16)D)Print gcd(8,gcd(12,16)Visual Basic中不同模塊(過程)之間數(shù)據(jù)的傳遞有兩種方式:中不同

15、模塊(過程)之間數(shù)據(jù)的傳遞有兩種方式: 通過過程調(diào)用實(shí)參與形參的結(jié)合實(shí)現(xiàn);通過過程調(diào)用實(shí)參與形參的結(jié)合實(shí)現(xiàn);使用全局變量來實(shí)現(xiàn)各過程中共享數(shù)據(jù)。使用全局變量來實(shí)現(xiàn)各過程中共享數(shù)據(jù)。 1、形式參數(shù)、形式參數(shù) 是指在是指在定義定義子過程和函數(shù)時,出現(xiàn)在子過程和函數(shù)時,出現(xiàn)在Sub過程名或過程名或Function函數(shù)名函數(shù)名后面括號內(nèi)的變量后面括號內(nèi)的變量,是用來接收傳送給是用來接收傳送給Sub過程或過程或Function的數(shù)據(jù)的數(shù)據(jù),形參表中的各個變量之間用逗號分隔。,形參表中的各個變量之間用逗號分隔。 8.3 參數(shù)傳遞參數(shù)傳遞8.3.1 形式參數(shù)與實(shí)際參數(shù)形式參數(shù)與實(shí)際參數(shù)2、實(shí)際參數(shù)、實(shí)際參數(shù)

16、 實(shí)際參數(shù)是指在實(shí)際參數(shù)是指在調(diào)用調(diào)用Sub或或Function時,出現(xiàn)在子過程名時,出現(xiàn)在子過程名或函數(shù)名后括號內(nèi)的參數(shù),其作用是或函數(shù)名后括號內(nèi)的參數(shù),其作用是將它們的數(shù)據(jù)(數(shù)值或地將它們的數(shù)據(jù)(數(shù)值或地址)傳送給址)傳送給Sub或或Function過程與其對應(yīng)的形參變量。過程與其對應(yīng)的形參變量。 實(shí)參可由常量、表達(dá)式、有效的變量名、實(shí)參可由常量、表達(dá)式、有效的變量名、數(shù)組名(如數(shù)組名(如A( ))組成,實(shí)參表中各參數(shù)用組成,實(shí)參表中各參數(shù)用逗號分隔逗號分隔。 參數(shù)傳遞指參數(shù)傳遞指主調(diào)主調(diào)過程的實(shí)參(調(diào)用時過程的實(shí)參(調(diào)用時已有確定值和內(nèi)存地已有確定值和內(nèi)存地址的參數(shù)址的參數(shù))傳遞給)傳遞

17、給被調(diào)被調(diào)過程的形參。過程的形參。 參數(shù)的傳遞有兩種方式:參數(shù)的傳遞有兩種方式:按值傳遞、按地址傳遞按值傳遞、按地址傳遞。 形參前加形參前加“ByVal”關(guān)鍵字的是按關(guān)鍵字的是按值傳遞值傳遞,缺省缺省或加或加“ByRef”關(guān)鍵字則按關(guān)鍵字則按地址傳遞地址傳遞。 8.3.2 傳地址與傳值傳地址與傳值傳址:傳址: 形參得到的是實(shí)參的形參得到的是實(shí)參的地址地址,當(dāng)形參值的改變同時也改變,當(dāng)形參值的改變同時也改變實(shí)參的值。因?yàn)樗鼈児灿靡粋€地址。實(shí)參的值。因?yàn)樗鼈児灿靡粋€地址。傳值:傳值: 形參只得到的是實(shí)參的形參只得到的是實(shí)參的值值,形參值的改變不會影響實(shí)參,形參值的改變不會影響實(shí)參的值。因?yàn)樾螀⒉⒉?/p>

18、知道實(shí)參的地址。的值。因?yàn)樾螀⒉⒉恢缹?shí)參的地址。Sub Swap2(x%, y%) Dim Temp% Temp = x: x = y: y = Temp End SubSub Swap1(ByVal x%, ByVal y%)Dim Temp% Temp = x: x = y: y = TempEnd Sub什么是傳址和傳值呢?什么是傳址和傳值呢?傳值傳值傳址傳址傳值傳值Private Sub CmdOK_Click() Dim a%,b% a = 10: b = 20 Swap1 a, b 傳傳 值值 Print A1=; a, B1=; b a = 10: b = 20 Swap2 a

19、, b 傳地址傳地址 Print A2=; a, B2=; bEnd SubSub Swap2(x%, y%) Dim Temp% Temp = x: x = y: y = Temp End SubSub Swap1(ByVal x%, ByVal y%)Dim Temp% Temp = x: x = y: y = TempEnd Sub值傳遞的執(zhí)行過程如下圖:值傳遞的執(zhí)行過程如下圖:通過地址傳遞數(shù)據(jù)的執(zhí)行過程通過地址傳遞數(shù)據(jù)的執(zhí)行過程 在子過程和函數(shù)過程調(diào)用時,如果實(shí)參是常量在子過程和函數(shù)過程調(diào)用時,如果實(shí)參是常量(包括系統(tǒng)常量、用(包括系統(tǒng)常量、用Const自定義的符號常量)或表自定義的符

20、號常量)或表達(dá)式,無論在定義時使用值傳遞還是地址傳遞,此達(dá)式,無論在定義時使用值傳遞還是地址傳遞,此時都是按值傳遞方式將常量或表達(dá)式計算的時都是按值傳遞方式將常量或表達(dá)式計算的值傳遞值傳遞給形參變量給形參變量。 如果形參定義是按傳地址方式,但調(diào)用時想使實(shí)如果形參定義是按傳地址方式,但調(diào)用時想使實(shí)參變量按值方式傳遞,參變量按值方式傳遞,可以把實(shí)參變量加上括號,可以把實(shí)參變量加上括號,將其轉(zhuǎn)換成表達(dá)式即可。將其轉(zhuǎn)換成表達(dá)式即可。 8.3.3 有關(guān)過程之間數(shù)據(jù)傳遞的幾點(diǎn)說明有關(guān)過程之間數(shù)據(jù)傳遞的幾點(diǎn)說明 解決一個問題既可以使用子過程,也可以使用函解決一個問題既可以使用子過程,也可以使用函數(shù)過程,是使

21、用子過程還是使用函數(shù)過程呢?數(shù)過程,是使用子過程還是使用函數(shù)過程呢? 如果是需要求得一個值,一般情況使用函數(shù)過程如果是需要求得一個值,一般情況使用函數(shù)過程,如不是為了求一個值,而是完成一些操作,如不是為了求一個值,而是完成一些操作,或需要返或需要返回回多個多個值值,則使用子過程比較方便,則使用子過程比較方便。使用子過程還是使用函數(shù)過程使用子過程還是使用函數(shù)過程? Visual Basic中數(shù)組作參數(shù)是中數(shù)組作參數(shù)是通過傳地址方式通過傳地址方式傳送。在傳傳送。在傳送數(shù)組時,除遵守參數(shù)傳送的一般規(guī)則外,還應(yīng)注意以下送數(shù)組時,除遵守參數(shù)傳送的一般規(guī)則外,還應(yīng)注意以下幾點(diǎn):幾點(diǎn): 1為了把一個數(shù)組的全

22、部元素傳送給一個過程,應(yīng)將為了把一個數(shù)組的全部元素傳送給一個過程,應(yīng)將數(shù)組名數(shù)組名寫入形參表中,并寫入形參表中,并略略去數(shù)組的上下界,但去數(shù)組的上下界,但括號括號不能省略。不能省略。Private Sub Sort( a() As single) End Sub其中形參其中形參“a( )”即為數(shù)組。即為數(shù)組。8.3.4 數(shù)組作為過程的參數(shù)數(shù)組作為過程的參數(shù)2被調(diào)過程可通過被調(diào)過程可通過Lbound和和Ubound函數(shù)確定實(shí)參數(shù)組的上、函數(shù)確定實(shí)參數(shù)組的上、下界。下界。3當(dāng)用數(shù)組作形參時,對應(yīng)的實(shí)參必須也是數(shù)組,且類型一當(dāng)用數(shù)組作形參時,對應(yīng)的實(shí)參必須也是數(shù)組,且類型一致。致。4實(shí)參和形參結(jié)合是

23、實(shí)參和形參結(jié)合是按地址傳遞按地址傳遞,即形參數(shù)組和實(shí)參數(shù)組共,即形參數(shù)組和實(shí)參數(shù)組共用一段內(nèi)存單元。用一段內(nèi)存單元。例如:定義了實(shí)參數(shù)組例如:定義了實(shí)參數(shù)組b(1 to 8),給它們賦了值,調(diào)用,給它們賦了值,調(diào)用Sort()函函數(shù)過程的形式如下:數(shù)過程的形式如下:Sort b() 或或 Call Sort(b() ) 實(shí)參數(shù)組后面的括號可以省略實(shí)參數(shù)組后面的括號可以省略,但為便于閱讀,但為便于閱讀,建議建議一般不要一般不要省略為好。省略為好。 課堂練習(xí)課堂練習(xí)Function FirProc(z As Integer,y As Integer,z As Integer) FirProc2x+

24、y+3zEnd FunctionFunction SecProc(x As Integer,y As Integer,z As Integer) SecProcFirProc(x,y,z)+xEnd FunctionPrivate Sub Command1_Click()() Dim a As Integer,b As Integer,c As Integer a2:b3:c4 Print SecProc(c,b,a)End SubA) 21 B) 19 C) 17 D) 34課堂練習(xí)課堂練習(xí)2010-9-22以下關(guān)于局部變量的敘述中錯誤的是以下關(guān)于局部變量的敘述中錯誤的是A)在過程中用)在過

25、程中用Dim語句或語句或Static語句聲明的變量是局部語句聲明的變量是局部變量變量B)局部變量的作用域是它所在的過程)局部變量的作用域是它所在的過程C)在過程中用)在過程中用Static語句聲明的變量是靜態(tài)局部變量語句聲明的變量是靜態(tài)局部變量D)過程執(zhí)行完畢,該過程中用)過程執(zhí)行完畢,該過程中用Dim或或Static語句聲明的語句聲明的變量即被釋放變量即被釋放課堂練習(xí)課堂練習(xí)下列程序的輸出結(jié)果是下列程序的輸出結(jié)果是10 110。Private Sub sub1(ByVal a As Integer, b As Integer)a = a + b: b = b + aEnd SubPrivat

26、e Sub Form_Click()Dim x As Integer, y As Integerx = 10: y = 20Call sub1(x, y)sub1 x, yPrint x; yEnd Sub過程的嵌套:類似選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的嵌套。也就是過程的嵌套:類似選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的嵌套。也就是指一個過程中包含了另一個過程的調(diào)用。指一個過程中包含了另一個過程的調(diào)用。 8.4.1 過程的嵌套過程的嵌套8.4 過程的嵌套和遞歸調(diào)用過程的嵌套和遞歸調(diào)用Sub form_click()Call sub1End subSub sub1Y=F1(n)End subFunction F1(x)F1=.

27、End Function過程的遞歸:簡單說就是自己調(diào)用自己。過程的遞歸:簡單說就是自己調(diào)用自己。 8.4.2 過程的遞歸過程的遞歸Function fact(n %) As Double Dim i As Integer, f As Double f = 1 For i = 1 To n f = f * i Next fact = fEnd FunctionFunction fact(n %) As Double If n=1 then fact=1 else fact=n*fact(n-1)End Function用遞歸實(shí)現(xiàn)用遞歸實(shí)現(xiàn)階乘階乘不用遞歸實(shí)現(xiàn)不用遞歸實(shí)現(xiàn)階乘階乘Function

28、fact(n %) As Double If n=1 then fact=1 else fact=n*fact(n-1)End Function現(xiàn)在假現(xiàn)在假N=4,觀察觀察執(zhí)行過程執(zhí)行過程Fact(4)=4*fact(3)Fact(3)=3*fact(2)Fact(2)=2*fact(1)Fact(1)=1Fact(2)=2*1Fact(3)=3*2Fact(4)=4*6注意VB語言語言不不允許過程的允許過程的嵌套定義嵌套定義,即一個過程內(nèi)不能包,即一個過程內(nèi)不能包含另一個過程含另一個過程.VB語言語言允許允許過程的過程的嵌套調(diào)用嵌套調(diào)用,即在調(diào)用一個過程的過,即在調(diào)用一個過程的過程中,又調(diào)用

29、另一個過程程中,又調(diào)用另一個過程 .窗體模塊:文件擴(kuò)展名為窗體模塊:文件擴(kuò)展名為 .frm 窗體模塊是窗體模塊是VB程序的基礎(chǔ),與窗體對應(yīng),存放著該程序的基礎(chǔ),與窗體對應(yīng),存放著該窗體的所有信息,如窗體及其上各控件對象的界面信息、窗體的所有信息,如窗體及其上各控件對象的界面信息、屬性、事件過程、通用過程、變量和常量的聲明等。屬性、事件過程、通用過程、變量和常量的聲明等。 可以通過記事本打開查看。可以通過記事本打開查看。8.5.1 窗體模塊和標(biāo)準(zhǔn)模塊窗體模塊和標(biāo)準(zhǔn)模塊8.5 變量及過程的作用域變量及過程的作用域標(biāo)準(zhǔn)模塊:標(biāo)準(zhǔn)模塊:文件擴(kuò)展名為文件擴(kuò)展名為Bas 它們可以包含變量、常數(shù)、類型、外部

30、過程和全它們可以包含變量、常數(shù)、類型、外部過程和全局過程的全局局過程的全局(在整個應(yīng)用程序范圍內(nèi)有效的在整個應(yīng)用程序范圍內(nèi)有效的)聲明或模聲明或模塊級聲明。寫入標(biāo)準(zhǔn)模塊的代碼不必綁在特定的應(yīng)用塊級聲明。寫入標(biāo)準(zhǔn)模塊的代碼不必綁在特定的應(yīng)用程序上,則在許多不同的應(yīng)用程序中可以重用標(biāo)準(zhǔn)模程序上,則在許多不同的應(yīng)用程序中可以重用標(biāo)準(zhǔn)模塊。塊。 當(dāng)一個過程要被多個不同對象或不同模塊中的程當(dāng)一個過程要被多個不同對象或不同模塊中的程序調(diào)用時,那么該過程一般可放在標(biāo)準(zhǔn)模塊中。序調(diào)用時,那么該過程一般可放在標(biāo)準(zhǔn)模塊中。 在在VB中,由于可以在過程中和模塊中聲明變中,由于可以在過程中和模塊中聲明變量,根據(jù)定義變

31、量的位置和定義變量的語句不同,量,根據(jù)定義變量的位置和定義變量的語句不同,變量可以分為:變量可以分為:局部變量(過程級變量)局部變量(過程級變量)窗體窗體/模塊級變量(私有的模塊級變量,能被本模塊級變量(私有的模塊級變量,能被本模塊的所有過程和函數(shù)使用)模塊的所有過程和函數(shù)使用)全局級變量(公有的模塊級變量)。全局級變量(公有的模塊級變量)。8.5.2 變量的作用域變量的作用域關(guān)于變量的生存期關(guān)于變量的生存期變量的生存期:變量的生存期:是指變量的值能夠保留多長時間,即是指變量的值能夠保留多長時間,即分配給變量的存儲空間能夠被保留多長時間。分配給變量的存儲空間能夠被保留多長時間。1、 局部變量局

32、部變量Dim 聲明的局部變量在本過程執(zhí)行期間有效聲明的局部變量在本過程執(zhí)行期間有效 Static 聲明的局部變量在整個應(yīng)用程序運(yùn)行期間有效聲明的局部變量在整個應(yīng)用程序運(yùn)行期間有效 2、 模塊變量模塊變量 在整個應(yīng)用程序運(yùn)行期間有效在整個應(yīng)用程序運(yùn)行期間有效 3、全局變量、全局變量 在整個應(yīng)用程序運(yùn)行期間有效在整個應(yīng)用程序運(yùn)行期間有效 局部變量:局部變量:在在過程內(nèi)過程內(nèi)聲明的變量,聲明的變量,只能只能在本過程中使用。在本過程中使用。 在過程內(nèi)部使用在過程內(nèi)部使用 Dim 或者或者 Static 關(guān)鍵字來聲明關(guān)鍵字來聲明的變量,的變量,只在聲明它們的過程中只在聲明它們的過程中才能被訪問或改變該才

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

34、段中段中用用Dim語句或用語句或用Private語句聲明的變量,可被本窗體語句聲明的變量,可被本窗體/模塊的任何過程訪問。但其他模塊模塊的任何過程訪問。但其他模塊卻不能訪問該變量。卻不能訪問該變量。例如:在例如:在“通用聲明通用聲明”段聲明如下變量段聲明如下變量 Private s As String Dim a As Integer,b As Single 8.5.2.2 窗體模塊級變量窗體模塊級變量 全局變量全局變量也稱公有的模塊級變量,在窗體模塊或也稱公有的模塊級變量,在窗體模塊或標(biāo)準(zhǔn)模塊的標(biāo)準(zhǔn)模塊的頂部的頂部的“通用通用”聲明段聲明段用用Public關(guān)鍵字關(guān)鍵字聲明,它的作用范圍是聲明

35、,它的作用范圍是整個應(yīng)用程序整個應(yīng)用程序,即可被本應(yīng),即可被本應(yīng)用程序的任何過程或函數(shù)訪問。用程序的任何過程或函數(shù)訪問。例如:例如: Public a As Integer,b As single8.5.2.3 全局級變量全局級變量3種變量聲明及使用規(guī)則如下表:種變量聲明及使用規(guī)則如下表:全局變量與局部變量同名全局變量與局部變量同名 在不同過程中定義同名變量,它們互不影響,但若在一在不同過程中定義同名變量,它們互不影響,但若在一過程中定義使用了與全局變量過程中定義使用了與全局變量同名同名的變量,則就應(yīng)注意。的變量,則就應(yīng)注意。 注意:注意:當(dāng)變量名相同而作用域不同時,將優(yōu)先訪問作用當(dāng)變量名相同

36、而作用域不同時,將優(yōu)先訪問作用域域小小的變量。的變量。8.5.2.4 關(guān)于多個變量同名關(guān)于多個變量同名小Public x As Integer 定義全局變量定義全局變量Private Sub Form_Load() x = 1 將全局變量將全局變量x 的值設(shè)置成的值設(shè)置成 1End SubPrivate Sub Command1_Click() Dim x As Integer 定義局部變量定義局部變量 x = 2 將局部變量將局部變量x的值設(shè)置成的值設(shè)置成 2 Print “x=; x Print “x=; Form1.xEnd SubPrivate Sub Command2_Click()

37、 Print “x=; x End Sub窗體將輸出什么?窗體將輸出什么?全局變量與全局變量同名全局變量與全局變量同名 如果不同模塊中的全局變量使用同一名字,則通過如果不同模塊中的全局變量使用同一名字,則通過同時引用模塊名和變量名同時引用模塊名和變量名就可以在代碼中區(qū)分它們。就可以在代碼中區(qū)分它們。例如,如果有一個在例如,如果有一個在 Form1 和和 Module1 中都聲中都聲明了公用的明了公用的 Integer 變量變量 X,則把它們作為,則把它們作為 Module1. X 和和Form1. X 來引用便得到正確值。來引用便得到正確值。也就是說也就是說如果不同模塊中的全局變量使用同一名字

38、,如果不同模塊中的全局變量使用同一名字,引用時就需要使用引用時就需要使用“模塊名模塊名.變量名變量名”的形式來區(qū)分的形式來區(qū)分它們。它們。每次調(diào)用過程時每次調(diào)用過程時重新分配重新分配存貯單元,存貯單元,初始化初始化變量變量過程調(diào)用過程調(diào)用結(jié)束結(jié)束后后釋放釋放存貯單元,變量內(nèi)容自動存貯單元,變量內(nèi)容自動消失消失動態(tài)變量與靜態(tài)變量動態(tài)變量與靜態(tài)變量動態(tài)變量動態(tài)變量第一次第一次調(diào)用過程時調(diào)用過程時分配分配存貯單元,存貯單元,初始化初始化變量變量以后以后每次調(diào)用過程時每次調(diào)用過程時不再不再重新分配存貯單元,變量重新分配存貯單元,變量保持上次保持上次調(diào)用結(jié)束時的值調(diào)用結(jié)束時的值過程名前加過程名前加Sta

39、tic,表示該過程內(nèi)的局部變量都是靜,表示該過程內(nèi)的局部變量都是靜態(tài)變量態(tài)變量靜態(tài)變量靜態(tài)變量(由由static定義)定義)Public|Private Sub 子過程名子過程名(形式參數(shù)列表形式參數(shù)列表) End Sub Sub過程和過程和Function函數(shù)既可寫在函數(shù)既可寫在窗體模塊中窗體模塊中也可寫在也可寫在標(biāo)準(zhǔn)標(biāo)準(zhǔn)模塊中模塊中,在定義時可選用關(guān)鍵字,在定義時可選用關(guān)鍵字PrivatePrivate(局部)(局部)和和PublicPublic(全局)(全局),來決定它們能被調(diào)用的范圍。,來決定它們能被調(diào)用的范圍。 8.5.3 過程與函數(shù)的作用域過程與函數(shù)的作用域1、窗體窗體/模塊級過程

40、:模塊級過程: 加加Private關(guān)鍵字的過程,只能被定義的窗體或模塊中的關(guān)鍵字的過程,只能被定義的窗體或模塊中的過程調(diào)用。過程調(diào)用。2、全局級過程:全局級過程: 加加Public關(guān)鍵字關(guān)鍵字(或缺?。ɑ蛉笔。┑倪^程,可供的過程,可供該應(yīng)用程序該應(yīng)用程序的的所有所有窗體和所有標(biāo)準(zhǔn)模塊中的過程調(diào)用。窗體和所有標(biāo)準(zhǔn)模塊中的過程調(diào)用。按過程的作用范圍來劃分,過程可分為:按過程的作用范圍來劃分,過程可分為: 模塊級過程模塊級過程 全局級過程全局級過程總結(jié)歸納過程的定義及作用域如下表總結(jié)歸納過程的定義及作用域如下表8.7 過程的嵌套和遞歸調(diào)用過程的嵌套和遞歸調(diào)用8.7.1 過程的嵌套過程的嵌套 在程序

41、中調(diào)用一子過程,而在子過程中又調(diào)用另外的子過程,這種程序結(jié)構(gòu)稱為過程的嵌套。過程的嵌套調(diào)用執(zhí)行過程如下圖:8.7.2 過程的遞歸調(diào)用過程的遞歸調(diào)用 用自身的結(jié)構(gòu)來描述自身,稱遞歸。例如,對階乘的定義:)!2() 1()!1()!1(!nnnnnn Visual Basic允許在一個Sub子過程和Function過程的定義內(nèi)部調(diào)用自己,即遞歸Sub子過程和遞歸Function函數(shù)。例例編求階乘fac(n)=n! 的遞歸函數(shù)Private Function fac(n As Integer) As Integer If n = 1 Then fac = 1 Else fac = n * fac(n

42、 - 1) End IfEnd FunctionPrivate Sub Form_Click() Print “fac(4)=”;fac(4)End Sub程序的遞歸過程:程序的遞歸過程:說明:說明:遞歸處理一般用棧來實(shí)現(xiàn),分遞推和回歸兩個過程,如上圖所示。遞推過程:每調(diào)用一次自身,把當(dāng)前參數(shù)(形參、局部變量、返回地址等)壓入棧,直到遞歸結(jié)束條件成立?;貧w過程:然后從棧中彈出當(dāng)前參數(shù),直到???。遞歸算法設(shè)計簡單,解決同一問題,使用遞歸算法消耗的機(jī)時和占據(jù)的內(nèi)存空間要比使用非遞歸算法大。使用遞歸算法必須要滿足以下的遞歸條件:使用遞歸算法必須要滿足以下的遞歸條件: (1)存在遞歸結(jié)束條件及結(jié)束時的

43、值; (2)能用遞歸形式表示,且遞歸向終止條件發(fā)展。*8.8 過程的可選參數(shù)與不定數(shù)量參數(shù)過程的可選參數(shù)與不定數(shù)量參數(shù)8.8.1 可選參數(shù)(可選參數(shù)(Optional)概念:概念: 當(dāng)然用戶在自定義子過程或函數(shù)時也可以定義可選參數(shù)。要指定某個形參為可選參數(shù),這就是在形參變量前加入Optional關(guān)鍵字即可。 如果一個過程某個形參為可選參數(shù),則在調(diào)用此過程時可以不提供對應(yīng)于這個形參的實(shí)參, 若一個過程有多個形參,當(dāng)它的一個形參被設(shè)定為可選參數(shù),則這個參數(shù)之后面的其它參數(shù)也必是可選的,并且要用 Optional 關(guān)鍵字來聲明。例例可選參數(shù)的使用Private Sub Nadres(x As Str

44、ing, Optional y As String) Text1.text= x Text2.text= yEnd Sub Private Sub Command1_Click ()Dim strName As StringDim strAddress As StringstrName = 張玉張玉strAddress = 杭州市學(xué)院路杭州市學(xué)院路85號號 提供了兩個參數(shù)。提供了兩個參數(shù)。 Call Nadres (strName, strAddress)End Sub說明:說明:1、 檢測可選參數(shù)是否被省略檢測可選參數(shù)是否被省略 使用使用VB的內(nèi)部函數(shù)的內(nèi)部函數(shù)IsMissing(可選參數(shù)名

45、)(可選參數(shù)名) 來測試過來測試過程被調(diào)用時,某個參數(shù)是否被省略。如果可選參數(shù)被省略程被調(diào)用時,某個參數(shù)是否被省略。如果可選參數(shù)被省略了,則返回了,則返回True,未省略,返回,未省略,返回False。 注意:若可選參數(shù)是其它類型,則注意:若可選參數(shù)是其它類型,則IsMissing()總是返()總是返回回False,不能起到檢測的作用。,不能起到檢測的作用。 例:例:Private Sub Nadres(x As String, Optional y As Variant) Text1.Text = x If Not IsMissing(y) Then Text2.Text = y End I

46、fEnd Sub2指定可選參數(shù)的缺省值指定可選參數(shù)的缺省值 也可以給可選參數(shù)指定缺省值。在下例中,如果未將可選也可以給可選參數(shù)指定缺省值。在下例中,如果未將可選參數(shù)傳遞到函數(shù)過程,則返回一個缺省值。參數(shù)傳遞到函數(shù)過程,則返回一個缺省值。Sub Nadres(x As String, Optional y As String= 杭州市學(xué)院路杭州市學(xué)院路85號號) Text1.text= x Text2.text= yEnd Sub Private Sub Command1_Click () Dim strName As String strName = 張玉張玉 未提供第二個參數(shù)。未提供第二個參

47、數(shù)。 Call Nadres (strName) End Sub8.8.2 使用不定數(shù)量的參數(shù)使用不定數(shù)量的參數(shù)一般說來,過程調(diào)用中的參數(shù)個數(shù)應(yīng)等于過程說明的參數(shù)個一般說來,過程調(diào)用中的參數(shù)個數(shù)應(yīng)等于過程說明的參數(shù)個數(shù)??捎脭?shù)??捎?ParamArray 關(guān)鍵字指明,過程將接受任意個關(guān)鍵字指明,過程將接受任意個數(shù)的參數(shù)。數(shù)的參數(shù)。 其定義形式如下:其定義形式如下:Sub 過程名過程名(ParamArray 數(shù)組名數(shù)組名() Function 函數(shù)名函數(shù)名(ParamArray 數(shù)組名數(shù)組名() As 數(shù)據(jù)類型數(shù)據(jù)類型8.9 應(yīng)用舉例應(yīng)用舉例8.9.1 查找問題查找問題例例使用順序查找法,在一組

48、數(shù)中查找某給定的數(shù)使用順序查找法,在一組數(shù)中查找某給定的數(shù)x 算法設(shè)計:算法設(shè)計: 設(shè)一組數(shù)據(jù)存放在數(shù)組設(shè)一組數(shù)據(jù)存放在數(shù)組a(1)-a(n)中,待查找的數(shù)據(jù)放在中,待查找的數(shù)據(jù)放在x 中,把中,把x與與a數(shù)組中的元素從頭到尾一數(shù)組中的元素從頭到尾一 一進(jìn)行比較查找。用一進(jìn)行比較查找。用變量變量p表示表示a數(shù)組元素下標(biāo),數(shù)組元素下標(biāo),p初值為初值為1,使,使x與與a(p)比較,如比較,如果果x不等于不等于a(p),則使,則使p=p+1,不斷重復(fù)這個過程;一旦,不斷重復(fù)這個過程;一旦x等等于于a(p)則退出循環(huán);另外,如果則退出循環(huán);另外,如果p大于數(shù)組長度,循環(huán)也應(yīng)該大于數(shù)組長度,循環(huán)也應(yīng)該停

49、止,則可由以下語句來實(shí)現(xiàn)它。停止,則可由以下語句來實(shí)現(xiàn)它。 For P=1 to n IF a(p)=x then Exit ForNext 下面編寫一查找函數(shù)下面編寫一查找函數(shù)Find(),若找到,若找到x則返回下標(biāo)值,找則返回下標(biāo)值,找不到返回不到返回0Private Function Find( a() As Single, x As Single) As Integer Dim n%,p%,m% m=Lbound(a) n=Ubound(a) For P=m to n IF a(p)=x then Exit For Next If pn then p=0 Find=pEnd Funct

50、ion 例例使用折半查找法,在一批有序數(shù)列中查找給定的數(shù)使用折半查找法,在一批有序數(shù)列中查找給定的數(shù)x。分析:分析:設(shè)設(shè)n個有序數(shù)(從小到大)存放在數(shù)組個有序數(shù)(從小到大)存放在數(shù)組a(1)-a(n)中,中,要查找的數(shù)為要查找的數(shù)為x。用變量。用變量bot、top、mid 分別表示查找數(shù)據(jù)范分別表示查找數(shù)據(jù)范圍的底部(數(shù)組下界)、頂部(數(shù)組的上界)和中間,圍的底部(數(shù)組下界)、頂部(數(shù)組的上界)和中間,mid=(top+bot)/2,折半查找的算法如下:,折半查找的算法如下:(1)x=a(mid),則已找到退出循環(huán),否則進(jìn)行下面的判斷;,則已找到退出循環(huán),否則進(jìn)行下面的判斷;(2)xa(mid),x必定落在必定落在mid+1和和top的范圍之內(nèi),即的范圍之內(nèi),即bot=mid+1;(4)在確定了新的查找范圍后,重復(fù)進(jìn)行以上比較,直到)在確定了新的查找范圍后,重復(fù)進(jìn)行以上比較,直到找到或者找到或者bota(p) and p a(p) And p = n 確定x應(yīng)插入的位置 p = p + 1 Loop For

溫馨提示

  • 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

提交評論