1.什么是過(guò)程
在程序設(shè)計(jì)中,為各個(gè)相對(duì)獨(dú)立的功能模塊所編寫(xiě)的一段程序稱(chēng)之為過(guò)程。
2.VB中的自定義過(guò)程分類(lèi)
(1)以“Sub”保留字開(kāi)始的子程序過(guò)程 (包括事件過(guò)程和通用過(guò)程),不返回值;
(2)以“Function” 保留字開(kāi)始的函數(shù)過(guò)程,返回一個(gè)值;
(3)以“Property” 保留字開(kāi)始的屬性過(guò)程,可以返回和設(shè)置窗體、標(biāo)準(zhǔn)模塊以及類(lèi)模塊的屬性值,也可以設(shè)置對(duì)象的值。
6.1 子過(guò)程(Sub)的定義與調(diào)用
1. 事件過(guò)程
(1)窗體事件過(guò)程
語(yǔ)法:Private Sub Form_事件名([參數(shù)列表])
[局部變量和常數(shù)聲明]
語(yǔ)句塊
End Sub
注意:
1)窗體事件過(guò)程名由Form_事件名組成,多文檔窗體用MDIForm_事件名;
2)每個(gè)窗體事件過(guò)程名前都有一個(gè)Private的前綴,表示該事件過(guò)程不能在它自己的窗體模塊之外被調(diào)用;
3)事件過(guò)程有無(wú)參數(shù),完全由VB提供的具體事件本身決定,用戶不可以隨意添加。
(2)控件事件過(guò)程
語(yǔ)法:Private Sub 控件名_事件名([參數(shù)列表])
[局部變量和常數(shù)聲明]
語(yǔ)句塊
End Sub
注意:其中的控件名必須與窗體中某控件相匹配,否則VB將認(rèn)為它是一個(gè)通用過(guò)程。
(3)建立事件過(guò)程的方法
1)打開(kāi)代碼編輯器窗口(兩種方法:雙擊對(duì)象或從工程管理器中單擊“查看代碼”按鈕)
2)在代碼編輯器窗口中,選擇所需要的“對(duì)象”和“事件過(guò)程”
3)在Private Sub …… End Sub之間鍵入代碼
4)保存工程和窗體
(4)事件過(guò)程的調(diào)用
事件過(guò)程由一個(gè)發(fā)生在VB中的事件來(lái)自動(dòng)調(diào)用或者由同一模塊中的其他過(guò)程顯示調(diào)用。
2.通用過(guò)程
通用過(guò)程是一個(gè)必須從另一個(gè)過(guò)程顯示調(diào)用的程序段,通用過(guò)程有助于將復(fù)雜的應(yīng)用程序分解成多個(gè)易于管理的邏輯單元,使應(yīng)用程序更簡(jiǎn)潔、更易于維護(hù)。
通用過(guò)程分為公有(Public)過(guò)程和私有(Private)過(guò)程兩種,公有過(guò)程可以被應(yīng)用程序中的任一過(guò)程調(diào)用,而私有過(guò)程只能被同一模塊中的過(guò)程調(diào)用。
(1)定義方法:
[ Private| Public ] [ Static] Sub 過(guò)程名([參數(shù)列表])
[局部變量和常數(shù)聲明] ‘用Dim 或Static聲明
語(yǔ)句塊
[ExitSub]
語(yǔ)句塊
End Sub
注意:
1)缺省[ Private | Public ]時(shí),系統(tǒng)默認(rèn)為 Public;
2)Static 表示過(guò)程中的局部變量為“靜態(tài)”變量;
3)過(guò)程名的命名規(guī)則與變量命名規(guī)則相同,在同一個(gè)模塊中,同一符號(hào)名不得既用作Sub過(guò)程名,又用作Function過(guò)程名。
4)參數(shù)列表中的參數(shù)稱(chēng)為形式參數(shù),它可以是變量名或數(shù)組名,只能是簡(jiǎn)單變量,不能是常量、數(shù)組元素、表達(dá)式;若有多個(gè)參數(shù)時(shí),各參數(shù)之間用逗號(hào)分隔,形參沒(méi)有具體的值。VB的過(guò)程可以沒(méi)有參數(shù),但一對(duì)圓括號(hào)不可以省略。不含參數(shù)的過(guò)程稱(chēng)為無(wú)參過(guò)程。
形參格式為:
[ ByVal ] 變量名[()][As 數(shù)據(jù)類(lèi)型]
式中:
變量名[()]:變量名為合法的VB變量名或數(shù)組名,無(wú)括號(hào)表示變量,有括號(hào)表示數(shù)組。
ByVal:表明其后的形參是按值傳遞參數(shù)(傳值參數(shù)Passed By Value),若缺省或用ByRef,則表明參數(shù)是按地址傳遞的(傳址參數(shù))或稱(chēng)“引用”(PassedBy Reference)。
As: 數(shù)據(jù)類(lèi)型:缺省表明該形參是變體型變量,若形參變量的類(lèi)型聲明為String,則只能是不定長(zhǎng)的。而在調(diào)用該過(guò)程時(shí),對(duì)應(yīng)的實(shí)在參數(shù)可以是定長(zhǎng)的字符串或字符串?dāng)?shù)組,若形參是數(shù)組則無(wú)限制。
5)Sub 過(guò)程不能嵌套定義,但可以嵌套調(diào)用。
6) End Sub 標(biāo)志該過(guò)程的結(jié)束,系統(tǒng)返回并調(diào)用該過(guò)程語(yǔ)句的下一條語(yǔ)句。
7) 過(guò)程中可以用Exit Sub提前結(jié)束過(guò)程,并返回到下調(diào)用該過(guò)程語(yǔ)句的下一條語(yǔ)句。
(2)建立Sub過(guò)程的方法
方法一:
1)打開(kāi)代碼編輯器窗口
2)選擇“工具”菜單中的“添加過(guò)程”
3)從對(duì)話框中輸入過(guò)程名,并選擇類(lèi)型和范圍
4)在新創(chuàng)建的過(guò)程中輸入內(nèi)容
方法二:
1)在代碼編輯器窗口的對(duì)象中選擇“通用”,在文本編輯區(qū)輸入 Private Sub 過(guò)程名
2)按回車(chē)鍵,即可創(chuàng)建一個(gè)Sub過(guò)程樣板
3)在新創(chuàng)建的過(guò)程中輸入內(nèi)容
3.Sub子過(guò)程的調(diào)用
(1) 用Call語(yǔ)句調(diào)用Sub過(guò)程
語(yǔ)法:Call 過(guò)程名(實(shí)在參數(shù)表)
實(shí)在參數(shù)的個(gè)數(shù)、類(lèi)型和順序,應(yīng)該與被調(diào)用過(guò)程的形式參數(shù)相匹配,有多個(gè)參數(shù)時(shí),用逗號(hào)分隔。
例:利用過(guò)程編寫(xiě)求三角形面積的程序
(2)把過(guò)程名作為一個(gè)語(yǔ)句來(lái)用
語(yǔ)法:過(guò)程名 [實(shí)參1[,實(shí)參2……]]
它與(1)的不同點(diǎn)是:去掉了關(guān)鍵字和實(shí)參列表的括號(hào)
如上例中可以改成:area a,b,c,w
6.2 函數(shù)過(guò)程(Function)的定義與調(diào)用
1.函數(shù)過(guò)程的定義
有兩種方法:
(1) 在代碼窗口中,利用“工具”菜單下的“添加過(guò)程”命令,插入一個(gè)函數(shù)過(guò)程模板來(lái)定義
(2)在代碼窗口中,把插入點(diǎn)放在所有現(xiàn)有過(guò)程之外,直接輸入函數(shù)來(lái)定義
[ Private | Public ] [ Static] Function 函數(shù)名([參數(shù)列表])[As 數(shù)據(jù)類(lèi)型]
[局部變量和常數(shù)聲明] ‘用Dim 或Static聲明
[ 語(yǔ)句塊]
[ 函數(shù)名=表達(dá)式]
[ Exit Function]
語(yǔ)句塊
[ 函數(shù)名=表達(dá)式]
End Function
2.注意事項(xiàng)
(1) 函數(shù)名的命名規(guī)則與變量命名規(guī)則相同;函數(shù)過(guò)程必須由函數(shù)名返回一個(gè)值。
(2) 如果函數(shù)體內(nèi)沒(méi)有給函數(shù)名賦值,則返回對(duì)應(yīng)類(lèi)型的缺省值,數(shù)值型返回0,字符型返回空字符串。
(3) 函數(shù)過(guò)程內(nèi)部不得再定義Sub過(guò)程或Function過(guò)程。
例:編寫(xiě)一個(gè)計(jì)算N!的函數(shù)過(guò)程
3.Function過(guò)程的調(diào)用
調(diào)用Function過(guò)程與調(diào)用VB內(nèi)部函數(shù)的方法一樣,即在表達(dá)式中寫(xiě)出它的名稱(chēng)和相應(yīng)的實(shí)在參數(shù)。
語(yǔ)法: 過(guò)程名([實(shí)參列表])
注意:(1)必須給參數(shù)加上括號(hào),即使沒(méi)有參數(shù)也不可省略括號(hào);
(2)VB中也允許象調(diào)用Sub過(guò)程一樣來(lái)調(diào)用Function,但這樣就沒(méi)有返回值。
4.調(diào)用其他模塊中的過(guò)程
(1)調(diào)用窗體中的過(guò)程
從窗體模塊的外部調(diào)用窗體中的公有過(guò)程,必須用窗體的名字作為調(diào)用前綴。如:
Call Form1.Examsub([實(shí)參表])
(2)調(diào)用標(biāo)準(zhǔn)模塊中的過(guò)程
如果在應(yīng)用程序中,過(guò)程名是唯一的,則調(diào)用時(shí)不必加模塊名。如果有同名的,則在同一模塊內(nèi)調(diào)用時(shí)可以不加模塊名,而在其他模塊中調(diào)用時(shí)必須加模塊名。
(3)類(lèi)模塊中的過(guò)程
調(diào)用類(lèi)模塊的公有過(guò)程時(shí),要求用指向該類(lèi)某一實(shí)例的變量修飾過(guò)程,即首先要聲明類(lèi)的實(shí)例為對(duì)象變量,并以此變量作為過(guò)程名前綴修飾詞,不可直接用類(lèi)名作為前綴修飾詞。
如:在類(lèi)模塊Class1中含有過(guò)程clssub,變量Democlass是類(lèi)Class1的一個(gè)實(shí)例,則調(diào)用clssub的方法是:
Dim Democlass AS New Class1
Call Democlass.clasub
例:函數(shù)過(guò)程與子過(guò)程的異同,計(jì)算級(jí)數(shù)的部分和
1+ x + x2/2! +……+ xn/n! +……, |xn/n!|<exp
6.3 參數(shù)的傳遞
1.形參與實(shí)參的概念
形參:指出現(xiàn)在Sub 和Function過(guò)程形參表中的變量名、數(shù)組名,過(guò)程被調(diào)用前,沒(méi)有分配內(nèi)存,其作用是說(shuō)明自變量的類(lèi)型和形態(tài)以及在過(guò)程中的角色。形參可以是:
1)除定長(zhǎng)字符串變量之外的合法變量名;
2)后面跟()括號(hào)的數(shù)組名。
實(shí)參:是在調(diào)用Sub 和Function過(guò)程時(shí),傳送給相應(yīng)過(guò)程的變量名、數(shù)組名、常數(shù)或表達(dá)式。在過(guò)程調(diào)用傳遞參數(shù)時(shí),形參與實(shí)參是按位置結(jié)合的,形參表和實(shí)參表中對(duì)應(yīng)的變量名可以不必相同,但位置必須對(duì)應(yīng)起來(lái)。
形參與實(shí)參的關(guān)系:形參如同公式中的符號(hào),實(shí)參就是符號(hào)具體的值;調(diào)用過(guò)程:即實(shí)現(xiàn)形參與實(shí)參的結(jié)合,也就是把值代入公式進(jìn)行計(jì)算。
2. 按值傳遞參數(shù)(定義時(shí)加ByVal)
按值傳遞參數(shù)(PassedBy Value)時(shí),是將實(shí)參變量的值復(fù)制一個(gè)到臨時(shí)存儲(chǔ)單元中,如果在調(diào)用過(guò)程中改變了形參的值,不會(huì)影響實(shí)參變量本身,即實(shí)參變量保持調(diào)用前的值不變。
3.按地址傳遞參數(shù)(定義時(shí)沒(méi)有修飾詞或帶關(guān)鍵字ByRef)
按地址傳遞參數(shù)時(shí),把實(shí)參變量的地址傳送給被調(diào)用過(guò)程,形參和實(shí)參共用內(nèi)存的同一地址。在被調(diào)用過(guò)程中,形參的值一旦改變,相應(yīng)實(shí)參的值也跟著改變。如果實(shí)參是一個(gè)常數(shù)或表達(dá)式,VB會(huì)按“傳值”方式來(lái)處理。
4.?dāng)?shù)組參數(shù)
VB允許把數(shù)組作為形參出現(xiàn)在形參表中,語(yǔ)法: 形參數(shù)組名() [As 數(shù)據(jù)類(lèi)型]
形參數(shù)組只能按地址傳遞參數(shù),對(duì)應(yīng)的實(shí)參也必須是數(shù)組,且數(shù)據(jù)類(lèi)型相同。調(diào)用過(guò)程時(shí),把要傳遞的數(shù)組名放在實(shí)參表中,數(shù)組名后面不跟圓括號(hào)。在過(guò)程中不可以用Dim語(yǔ)句對(duì)形參數(shù)組進(jìn)行聲明,否則會(huì)產(chǎn)生“重復(fù)聲明”的錯(cuò)誤。但在使用動(dòng)態(tài)數(shù)組時(shí),可以用ReDim語(yǔ)句改變形參數(shù)組的維界,重新定義數(shù)組的大小。
5. 對(duì)象參數(shù)
VB中可以向過(guò)程傳遞對(duì)象,在形參表中,把形參變量的類(lèi)型聲明為“Control”,可以向過(guò)程傳遞控件;若聲明為“Form”,則可向過(guò)程傳遞窗體。對(duì)象的傳遞只能按地址傳遞。
6.4 變量、過(guò)程的作用域
1. VB應(yīng)用程序的組成:
2. 過(guò)程的作用域 作用范圍
模塊級(jí)
全局級(jí)
窗體
標(biāo)準(zhǔn)模塊
窗體
標(biāo)準(zhǔn)模塊
定義方式
過(guò)程名前加Private
例:Private Sub my1(形參表)
過(guò)程名前加Pubilc 或默認(rèn)
例:[ Pubilc ] Sub my2(形參表)
能否被本模塊其他過(guò)程調(diào)用
能
能
能
能
能否被本應(yīng)用程序其他模塊調(diào)用
不能
不能
能,但必須在過(guò)程名前加窗體名。例:
Call 窗體名. My1(實(shí)參表)
能,但過(guò)程名必須唯一,否則需要加標(biāo)準(zhǔn)模塊名。例:
Call 標(biāo)準(zhǔn)模塊名.My2(實(shí)參表)
3. 變量的作用域
作用范圍
局部變量
窗體/模塊級(jí)變量
全局變量
窗體
標(biāo)準(zhǔn)模塊
聲明方式
Dim、Static
Dim、Private
Public
聲明位置
在過(guò)程中
窗體/模塊的“通用聲明”段
窗體/模塊的“通用聲明”段
能否被本模塊其他過(guò)程存取
不能
能
能
能否被其他模塊存取
不能
不能
能,但在變量名前加窗體名
能
4.靜態(tài)變量
用Static聲明的靜態(tài)變量,在每次調(diào)用過(guò)程時(shí)保持原來(lái)的值,不重新初始化。而用Dim聲明的變量,每次調(diào)用過(guò)程時(shí),重新初始化
例:顯示1到5個(gè)數(shù)。
5.同名變量
對(duì)不同范圍內(nèi)出現(xiàn)的同名變量,可以用模塊名加以區(qū)別。一般情況下,當(dāng)變量名相同而作用域不同時(shí),優(yōu)先訪問(wèn)局限性大的變量。
6.5 遞歸過(guò)程
1.遞歸的概念
通俗的講,用自身的結(jié)構(gòu)來(lái)描述自身就稱(chēng)為“遞歸”。如對(duì)階乘運(yùn)算的定義就是遞歸的:
n!=n(n-1)! (n-1)!=(n-1)(n-2)!
2.遞歸子過(guò)程和遞歸函數(shù)
VB 允許一個(gè)自定義子過(guò)程或函數(shù)過(guò)程在過(guò)程體的內(nèi)部調(diào)用自己,這樣的子過(guò)程或函數(shù)就叫遞歸子過(guò)程和遞歸函數(shù)。遞歸過(guò)程包含了遞推和回歸兩個(gè)過(guò)程。構(gòu)成遞歸的條件是:
(1)遞歸結(jié)束條件和結(jié)束時(shí)的值
(2)能用遞歸形式表示,并且遞歸向結(jié)束條件發(fā)展。
例:編制程序求fac(n)=n!的函數(shù)
3.注意事項(xiàng)
(1)遞歸算法設(shè)計(jì)簡(jiǎn)單,但消耗的上機(jī)時(shí)間和占據(jù)的內(nèi)存空間比非遞歸大
(2) 設(shè)計(jì)一個(gè)正確的遞歸過(guò)程或函數(shù)過(guò)程必須具備兩點(diǎn):1)具備遞歸條件;2)具備遞歸結(jié)束條件
(3) 一般而言,遞歸函數(shù)過(guò)程對(duì)于計(jì)算階乘、級(jí)數(shù)、指數(shù)運(yùn)算有特殊效果。