VB考試教程:過(guò)程之Function過(guò)程

字號(hào):

3、Function過(guò)程
    VB包含內(nèi)置的或內(nèi)部的函數(shù),還可用Function語(yǔ)句編寫自己的Function過(guò)程。在定義了一個(gè)函數(shù)之后,可以像調(diào)用任何一個(gè)VB的內(nèi)部函數(shù)一樣使用它,即可以在任何表達(dá)式,語(yǔ)句或函數(shù)中引用它。
    函數(shù)過(guò)程是標(biāo)準(zhǔn)模塊中位中Function語(yǔ)句與End Function 語(yǔ)句之間的一系列語(yǔ)句。函數(shù)中的這些語(yǔ)句完成某些有意義的工作,一般是處理文本,進(jìn)行輸入或計(jì)算一個(gè)值。
    通過(guò)將函數(shù)名與任何所需的參數(shù)一起置于一條程序語(yǔ)句中,可以調(diào)用該函數(shù)。換句話說(shuō),使用函數(shù)過(guò)程與使用內(nèi)置函數(shù)(比如Time,Int或Str等)的方法完全相同。
    每個(gè)函數(shù)完成一種服務(wù),比如進(jìn)行計(jì)算并返回一個(gè)值。
    在標(biāo)準(zhǔn)模塊中聲明的函數(shù)在缺省的狀態(tài)下是公用函數(shù),它們可在任何事件中過(guò)程中使用。
    (1)Function(函數(shù))過(guò)程的定義
    Function過(guò)程的定義格式:
    [Public|Private|Friend|Static]Function 過(guò)程名[(參數(shù)列表)][As數(shù)據(jù)類型]
     [程序段]
     [過(guò)程名=表達(dá)式]
     [Exit Function]
     [程序段]
     [過(guò)程名=表達(dá)式]
    End Function
    說(shuō)明:
    1)Function過(guò)程以Function開(kāi)頭,End Function 結(jié)束,之間是描述過(guò)程操作的語(yǔ)句塊,即“過(guò)程體”或“函數(shù)體”。格式中的“過(guò)程名”、“參數(shù)列表”、Public、Private、Friend、Static、Exit Function的含義與Sub過(guò)程相同?!癆s數(shù)據(jù)類型”是由Function過(guò)程返回的值的數(shù)據(jù)類型,如省略,則為Variant。
    如:已知直角三角形兩直角邊的值,計(jì)算斜邊,可定義一個(gè)Function函數(shù)。
    Function hypotenuse(A as integer,B as integer) as string
     hypotenuse=sqr(A^2+B^2)
    End function
    再例如:
    Function BinarySearch(Lower,Upper As Integer) As Boolean
     ……
     If Lower = Upper Then
     BinarySearch = True
     Exit Function
     Else
     BinarySearch = False '過(guò)程名=表達(dá)式
     End If
     ……
    End Function
    2)調(diào)用Sub過(guò)程相當(dāng)于執(zhí)行一個(gè)語(yǔ)句,不返回值;而調(diào)用Function過(guò)程要返回一個(gè)值,因此可以像內(nèi)部函數(shù)一樣在表達(dá)式中使用。
    在VB中調(diào)用Function過(guò)程的方法和調(diào)用任何內(nèi)部函數(shù)的方法是一樣的,如調(diào)用上面的“hypotenuse”函數(shù):
    label1.caption=hypotenuse(Cint(text1.text),cint(text2.text))
    strX=hypotenuse(width,height)
    函數(shù)總是以該函數(shù)的名稱返回給調(diào)用過(guò)程一個(gè)值。因此,函數(shù)中的最后一行語(yǔ)句往往是將函數(shù)的最終計(jì)算結(jié)果放入“過(guò)程名”中的賦值語(yǔ)句。例如,下文中的函數(shù)過(guò)程total1用來(lái)為某個(gè)工程計(jì)算,然后將結(jié)果賦值給total1名。
    Function total1(cost)
    t1=cost*0.05
    t2=cost*0.015
    total1=t1+t2 '將結(jié)果賦值給Function函數(shù)total1。
    end function
    由Function過(guò)程返回的值放在上述格式中的“表達(dá)式”中,并通過(guò)“過(guò)程名=表達(dá)式”把它的值賦給“過(guò)程名”,如果在Function過(guò)程中省略“過(guò)程名=表達(dá)式,則該過(guò)程返回一個(gè)默認(rèn)值:數(shù)值函數(shù)過(guò)程返回0值;字符串函數(shù)過(guò)程返回空字符串;variat函數(shù)則返回empty。如果在返回對(duì)象引用的Function過(guò)程中沒(méi)有將對(duì)象引用賦給name(通過(guò)set),則函數(shù)返回nothing。一般地,為了能使一個(gè)Function過(guò)程完成所指定的操作,通常要在過(guò)程體中為“過(guò)程名”賦值。
    3)前面講過(guò),過(guò)程不能嵌套。因此不能在事件過(guò)程中定義通用過(guò)程(包括Sub過(guò)程和Function過(guò)程),只能在事件的過(guò)程內(nèi)調(diào)用通用過(guò)程。
    (2)建立Function過(guò)程
    前面提到的建立Sub過(guò)程的三種方法也可用來(lái)建立Function過(guò)程,只是當(dāng)用第一種方法建立時(shí),在對(duì)話框的“類型”欄內(nèi)選擇“函數(shù)”。
    (3)調(diào)用函數(shù)過(guò)程
    例如:編寫一個(gè)求公約數(shù)(GCD)的函數(shù)過(guò)程。
    程序如下:
    Function gcd(ByVal x As Integer, ByVal y As Integer) As Integer
     Do While y <> 0
     reminder = x Mod y
     x = y
     y = reminder
     Loop
     gcd = x
    End Function
    求公約數(shù)的方法:
    兩個(gè)數(shù)a、b,如果b能除盡a,則是這兩個(gè)數(shù)的公約數(shù)(如6和3的公約數(shù)是3),否則:
     GCD(a,b)=GCD(b,a Mod b)
    例如:GCD(126,12)=GCD(12,126 Mod 12)=GCD(12,6)=6
    下面介紹如何調(diào)用這個(gè)過(guò)程。
    調(diào)用Function過(guò)程比較簡(jiǎn)單,可以像使用VB內(nèi)部函數(shù)一樣調(diào)用。因?yàn)镕unction過(guò)程返回一個(gè)值,所以完全可以將它看成一個(gè)函數(shù),與內(nèi)部函數(shù)(如Sqr,Str,Chr等)沒(méi)什么區(qū)別,只不過(guò)內(nèi)部函數(shù)由語(yǔ)言系統(tǒng)提供,而Function過(guò)程由用戶自己定義。