第八章 VB自定義函數(shù)與子過程_第1頁
第八章 VB自定義函數(shù)與子過程_第2頁
第八章 VB自定義函數(shù)與子過程_第3頁
第八章 VB自定義函數(shù)與子過程_第4頁
第八章 VB自定義函數(shù)與子過程_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第八章

自定義函數(shù)與子過程幾個概念一、VB程序的基本構(gòu)成是過程。二、VB6.0中過程有兩大類:內(nèi)部過程和外部過程。1、內(nèi)部過程:系統(tǒng)提供的,不需要用戶編寫,如內(nèi)部函數(shù)。2、外部過程:用戶根據(jù)需要定義的,供調(diào)用的程序段,外部過程分為子過程、函數(shù)過程。幾個概念三、在VB中使用過程編程有兩個優(yōu)點:1、過程可使程序劃分成離散的邏輯單元,每個單元都比沒有使用過程的整個程序容易調(diào)試。2、一個程序中的過程,往往不必修改或只需稍作改動,便可以成為另一個程序的構(gòu)件。四、VisualBasic的兩類過程:1、Sub過程(子過程),不返回值或多個返回值。2、Function過程(函數(shù)過程),有一個返回值。8.2自定義函數(shù)過程例8.1設(shè)計程序?qū)50,100]區(qū)間內(nèi)的偶數(shù)拆成兩個素數(shù)之和分析:可先將偶數(shù)拆分成兩個數(shù)之和,在分別對這兩個數(shù)進行素數(shù)判定,若都是素數(shù)就輸出。例如:可將50拆分為:3+47、4+46、…..47+3,然后對每種組合中的兩個數(shù)分別進行素數(shù)判斷。因此,可以定義一個專門用于素數(shù)判斷的函數(shù)過程。8.2自定義函數(shù)過程PrivateFunctionprime(ByValxAsInteger)AsBoolean

DimI%

prime=True'函數(shù)賦初值True

ForI=2ToSqr(x)

IfxModI=0Then'判斷x是否可被i整除

prime=False'函數(shù)取值False,則x不是素數(shù)

ExitFunction'函數(shù)結(jié)束

EndIf

NextIEndFunction‘在事件過程中調(diào)用以上定義的函數(shù),得到結(jié)果。PrivateSubForm_Click()

DimI%,N,K%

I=1'計數(shù)

ForN=50To100Step2'取偶數(shù)

ForK=3ToN/2'第一個數(shù)的取值區(qū)間折半

Ifprime(K)Andprime(N-K)Then‘二次調(diào)用結(jié)果都是素數(shù)輸出

PrintI;":";N;"=";K;"+";N-K

ExitFor'退出k循環(huán)

EndIf

NextK

I=I+1

NextNEndSub8.2自定義函數(shù)過程8.2.2函數(shù)過程的定義函數(shù)過程在被調(diào)用前,一定要先定義,函數(shù)定義的方式一般有兩種:1.利用“添加過程”對話框定義打開窗體或模塊的代碼窗口,單擊“工具”菜單,選擇“添加過程”命令,即可打開“添加過程”對話框。8.2自定義函數(shù)過程

在“添加過程”對話框中輸入并選擇相應(yīng)的內(nèi)容和項目即可。在“名稱”文本框內(nèi)輸入待定義函數(shù)過程的名稱,在“類型”選項組中選擇“函數(shù)”單選按鈕。單擊確定按鈕,則可建立一個函數(shù)過程的框架。8.2自定義函數(shù)過程2.直接在代碼窗口定義進入代碼窗口后,在左側(cè)顯示對象名的下拉列表框中選擇“(通用)”,在右側(cè)顯示過程的下拉列表框中選擇“(聲明)”,然后輸入Function及函數(shù)名即可。自定義函數(shù)過程的格式如下:[Public|Private][Static]Function<函數(shù)名>[(<形參列表>)][As<類型>][<語句塊1>][函數(shù)名=<表達式>][ExitFunction][<語句塊2>]

[函數(shù)名=<表達式>]EndFunction8.2自定義函數(shù)過程1)[Public或Private]:表示函數(shù)是“公有的”或“私有的”。Public表示該函數(shù)為公有過程,定義后整個程序范圍內(nèi)均可調(diào)用該函數(shù),但調(diào)用時必須加上該函數(shù)所在的窗體或標(biāo)準(zhǔn)模塊作為前輟,而Private表示私有子過程,用它定義的函數(shù)只能在本窗體或模塊中被調(diào)用。缺省默認是公有的。2)[Static]:表示函數(shù)中的局部變量是靜態(tài)變量,在函數(shù)被調(diào)用后,其值仍然被保留;說明3)[(<形參列表>)]:該項中的參數(shù)為形式參數(shù),又稱啞元,可以是變量名或數(shù)組名,當(dāng)參數(shù)為數(shù)組名時,形參和實參在參數(shù)聲明時應(yīng)省略其維數(shù),但括號()不能省略。當(dāng)參數(shù)有多項時,參數(shù)間要用逗號分隔開。使用格式為[ByVal|ByRef]<變量名>[As<數(shù)據(jù)類型>]4)ByVal:表示調(diào)用時參數(shù)為值傳遞方式,實參的值不隨形參值的變化而變化;說明說明5)ByRef:參數(shù)默認選項,表示參數(shù)為地址傳遞方式,實參的值隨形參值的改變而改變,數(shù)組只能以傳地址的方式引用;6)As<類型>表示函數(shù)返回值的類型,默認為變體型。在函數(shù)體內(nèi)至少應(yīng)對對函數(shù)名賦值一次。7)[函數(shù)名=<表達式>],用于函數(shù)運行后返回一個值。如在定義中未對函數(shù)名賦值,則將返回一個默認值。其中,數(shù)值型為0,字符型為“”,變量型為Empty。

8)

[ExitFunction]用于退出函數(shù)過程,該項一般嵌套在if結(jié)構(gòu)中使用,在滿足if條件時退出該函數(shù)過程。

例8.2設(shè)計一個程序統(tǒng)計字符串中西文字符個數(shù)。算法:漢字的Asc()函數(shù)的返回值小于0;西文字符的Asc()函數(shù)的返回值大于0。FunctionCountXw%(ByValS$)

DimI%,T%,K%,C$

ForI=1ToLen(S)

C=Mid(S,I,1)'逐個地取出字符

IfAsc(C)>0ThenK=K+1'字符ASCII碼大于0,則個數(shù)累加1

NextI

CountXw=K'返回函數(shù)值EndFunction例8.2設(shè)計一個程序統(tǒng)計字符串中西文字符個數(shù)。PrivateSubCommand1_Click()

DimC1%

C1=CountXw(Text1.Text)‘調(diào)用CountXw函數(shù)

Picture1.PrintText1'在Picture1中顯示統(tǒng)計的結(jié)果

Picture1.Print"有";C1;"個西文字符數(shù)"EndSub8.2.3函數(shù)過程的調(diào)用1.函數(shù)調(diào)用的形式其調(diào)用形式如下:變量=函數(shù)過程名(實參列表)其中,實參列表中的實參是傳遞給被調(diào)用過程的變量或表達式。例題8.2中的C1=CountXw(Text1.Text)就是一次函數(shù)調(diào)用。

注意:調(diào)用函數(shù)后,函數(shù)過程名將有一個返回值,函數(shù)是一個特殊的表達式。因此,函數(shù)不能作為單獨的一條語句,而必須要以給變量賦值或與命令一起使用的形式。例如:Ifprime(K)Andprime(N-K)Then8.2自定義函數(shù)過程8.2函數(shù)過程的定義和調(diào)用2.函數(shù)過程調(diào)用的執(zhí)行流程在事件過程調(diào)用一個函數(shù)過程時,程序在執(zhí)行這兩個過程時的流程如下圖所示。FunctionHypotenuse(x%,y%)

Hypotenuse=Sqr(x^2+y^2)EndFunctionPrivateSubCommand1_Click()……s=Hypotenuse(a,b)

……EndSub①②③④⑤函數(shù)過程調(diào)用的執(zhí)行流程圖過程調(diào)用時執(zhí)行順序如下:1)事件過程Command1_Click()在執(zhí)行到函數(shù)過程調(diào)用語句“s=Hypotenuse(a,b)”時,程序執(zhí)行控制權(quán)轉(zhuǎn)移到Hypotenuse()函數(shù)過程中;2)執(zhí)行控制權(quán)轉(zhuǎn)移時,實參a和b的值將分別傳遞給Hypotenuse()函數(shù)中的形參x和y;①②③④⑤3)x和y獲得初值后,即可執(zhí)行函數(shù)過程中的程序代碼并給函數(shù)過程名賦值,該值即為整個函數(shù)過程的返回值;4)函數(shù)執(zhí)行結(jié)束后,函數(shù)的返回值將賦給主調(diào)事件過程的變量s;5)變量s得到賦值后,接著執(zhí)行調(diào)用函數(shù)過程后面的剩余語句。①②③④⑤8.3子過程的定義和調(diào)用引例調(diào)用函數(shù)后,將得到函數(shù)的返回值,但是,在有些問題的中,過程執(zhí)行結(jié)束后不需要返回值,用函數(shù)過程實現(xiàn)就會非常困難,而應(yīng)該使用子過程的形式。例8.3試編寫一個將兩個數(shù)進行交換的過程供其它過程多次調(diào)用。

分析:先編寫一個具有將兩個數(shù)進行交換的子過程,需要進行兩數(shù)交換時,調(diào)用該子過程,同時將待交換的兩個數(shù)傳送到該子過程中,在子過程實現(xiàn)兩數(shù)交換。子過程執(zhí)行結(jié)束后,將被交換后的兩個數(shù)返回到主調(diào)過程中?!瓹p()子過程的定義

PrivateSubCp(AAsInteger,BAsInteger)'形參為傳址方式

IfA=0Then

ExitSub

EndIf

A=A+B'A和B的值交換,帶回主調(diào)過程

B=A-B

A=A-B

Print"在子過程中交換后的值"

Print"A=";A,"B=";BEndSub‘主調(diào)程序Cp子過程PrivateSubCommand1_Click()

DimStr1$,Va%,Vb%

Str1$="輸入對話框"

Va=InputBox("Va=",Str1$)

Vb=InputBox("Vb=",Str1$)

Print"在主調(diào)過程中調(diào)用子過程前的值"

Print"Va=";Va,"Vb=";Vb'輸出原始值

CallCp(Va,Vb)

Print"在主調(diào)過程中調(diào)用子過程后的值"'輸出經(jīng)子過程處理過后的返回值

Print"Va=";Va,"Vb=";VbEndSub運行結(jié)果:

程序運行后,單擊窗體以觸發(fā)Form_Click()事件過程,運行結(jié)果如下圖所示。從程序中可以看到,Va和Vb的初值分別是45和23,而在窗體中輸出時Va和Vb的值分別是23和45,達到了兩個數(shù)交換的目的。8.3子過程的定義和調(diào)用8.3.1子過程的定義子過程以過程名來標(biāo)識,被其它過程調(diào)用。子過程與事件過程有一定區(qū)別,事件過程可以在該事件觸發(fā)或調(diào)用時執(zhí)行,而用戶自定義的子過程只有在被其它過程調(diào)用時才能執(zhí)行。子過程的定義跟函數(shù)過程的定義相類似,在代碼窗口中輸入Sub及子過程名即可,系統(tǒng)會自動加上EndSub與子過程名后的一對括號(),然后即可在子過程的框架中輸入程序代碼。子過程的定義格式:[Private|Public][Static]Sub<過程名>[(<參數(shù)列表>)][<語句塊1>][ExitSub][<語句塊2>]EndSub———————————說明:[Public]|[Private]與[Static]:它們的含義和作用與函數(shù)過程中相應(yīng)的這些關(guān)鍵詞相同。[(<參數(shù)列表>)]:該項中參數(shù)的形式和調(diào)用方法也與函數(shù)過程相同。[ExitSub]:退出過程,該項一般嵌套在if結(jié)構(gòu)中使用,在滿足if條件時退出該過程。6.2子過程的定義和調(diào)用例:分別計算兩個數(shù)的和與差,而當(dāng)兩個數(shù)的值均為0時則不進行任何計算。SubOperation(xAsInteger,yAsInteger)Dimt1asInteger,t2asInteger

Ifx=0andy=0ThenExitSub

EndIft1=x+yt2=x-yPrint“t1=”;t1;“t2=”;t2EndSub6.2子過程的定義和調(diào)用在Sub過程與Function過程之間的區(qū)別:1)子過程名無類型說明,在子過程中不能對子過程名進行賦值。2)子過程的形式參數(shù)沒有具體的值,只代表參數(shù)的個數(shù)、位置、類型。3)子過程的調(diào)用必須是一條獨立的語句。8.3子過程的定義和調(diào)用8.3.2子過程的調(diào)用1.使用Call語句調(diào)用格式:Call子過程名[(實參列表)]說明:①實參的個數(shù),數(shù)據(jù)類型都應(yīng)與被調(diào)用過程的形參一一對應(yīng)。用Call語句調(diào)用時,若有實參,括號不能省略,否則,可以省略括號。②若子過程要通過實參向主調(diào)過程中返回值,則實參只能是簡單變量、數(shù)組名或自定義類型變量。8.3子過程的定義和調(diào)用例如:PrivateSubCommand1_Click()a=”VisualBasic”b=“6.0”

CallLink(a,b)EndSub

此時,將輸入的值a和b作為實參調(diào)用Link子過程,通過調(diào)用將兩個實參傳遞給形參,然后在過程中計算。8.3子過程的定義和調(diào)用2.直接使用過程名調(diào)用格式:子過程名[實參列表]說明:此形式調(diào)用子過程時,實參不用加括號,否則在有的編譯版本中出現(xiàn)編譯錯誤,若有多個實參,則實參之間用逗號分隔。例如:PrivateSubCommand1_Click()a=”VisualBasic”b=“6.0”

Linka,b

EndSub8.4參數(shù)傳遞8.4.1形參與實參1、形參

指出現(xiàn)在Sub和Function過程形參表中的變量名、數(shù)組名,該過程在被調(diào)用前,沒有為它們分配內(nèi)存,其作用是說明自變量的類型和形態(tài)以及在過程中的作用。形參可以是除定長字符串變量之外的合法變量名,也可以帶括號的數(shù)組名。2、實參

實參就是在調(diào)用Sub和Function過程時,從主調(diào)過程傳遞給被調(diào)用過程的參數(shù)值。實參可以是變量名、數(shù)組名、常數(shù)或表達式。在過程調(diào)用傳遞參數(shù)時,形參與實參是按位置結(jié)合的,形參表和實參表中對應(yīng)的變量名可以不必相同,但它們的數(shù)據(jù)類型、參數(shù)個數(shù)及位置必須一一對應(yīng)。8.4參數(shù)傳遞3、形參與實參的關(guān)系形參如同公式中的符號,實參就是符號具體的值,在調(diào)用過程前必須得到賦值;調(diào)用過程就是實現(xiàn)形參與實參的結(jié)合,把實參的值通過調(diào)用傳遞給形參,相當(dāng)于把值代入公式進行計算。8.4參數(shù)傳遞8.4.2地址傳遞與值傳遞在VisualBasic中,實參與形參的結(jié)合有兩種方式,即地址傳遞(ByRef)與值傳遞(ByVal),地址傳遞又稱為引用。101020a的地址地址傳遞值傳遞實參b形參y實參a形參

x8.4參數(shù)傳遞1.地址傳遞在VB6.0中,在形參前加ByRef或在缺省該關(guān)鍵字,則實參與形參的結(jié)合就是地址傳遞方式。例8.5通過調(diào)用子過程實現(xiàn)將兩個字符串進行互換。

分析:首先定義一個能夠?qū)崿F(xiàn)字符串交換的子過程Swap1,該子過程包含兩個形參。在主調(diào)過程中,分別對兩個字符變量A和B進行賦值,將這兩個變量作為調(diào)用子過程Swap1的實參,要使得形參的改變能夠影響實參的值,應(yīng)該采用地址傳遞的方式。8.4參數(shù)傳遞程序代碼如下:‘傳址子過程Swap1PublicSubSwap1(XAsString,YAsString)DimTAsString

T=X‘下面三行語句用于交換形參的值X=YY=TPrint“傳址子過程中互換變量值后:”;“X1=”;X;“”;“Y1=”;Y;Print“_____________________________________________"PrintEndSub8.4參數(shù)傳遞‘以下為主調(diào)過程(事件過程)PrivateSubForm_Click()DimAAsString,BAsString‘定義字符串變量A、BCls‘清除窗體文字

A="ABCDE"‘為變量A賦值

B="12345"‘為變量B賦值

Print"主過程在調(diào)用子過程之前:";"A1=";A;"";"B1=";BPrint"_____________________________________________"Print

Swap1A,B

‘調(diào)用子過程Sub1Print"主過程調(diào)用傳址子過程之后:";"A1=";A;"";"B1=";BEndSub8.4參數(shù)傳遞

程序運行結(jié)果如下圖:從程序的運行結(jié)果可以看出,對形參的改變就是對實參的改變。如果不希望這種改變,則在被調(diào)用過程中不要出現(xiàn)對形參值改變的語句,或使用按值傳送方式傳遞數(shù)據(jù),將不會引起實參值的改變。8.4參數(shù)傳遞2.值傳遞傳值就是通過傳送實參的值而不是傳送地址的方法給被調(diào)用過程中傳遞數(shù)據(jù)。這樣,被調(diào)用的過程并沒有訪問實參的地址,因而也不會改變實參的值。格式:PrivateSubJc(ByVala%)……EndSub8.4參數(shù)傳遞

例8.6將兩個字符串在子過程中實現(xiàn)互換,但主調(diào)過程的字符串不互換。分析:首先定義一個能夠?qū)崿F(xiàn)字符串交換的子過程Swap1,該子過程包含兩個形參。在主調(diào)過程中,分別對兩個字符變量A和B進行賦值,將這兩個變量作為調(diào)用子過程Swap1的實參,要使得子過程中形參的值進行互換而不影響主調(diào)過程的實參,應(yīng)該采用值傳遞的方式。8.4參數(shù)傳遞代碼如下:‘傳值子過程Swap1PublicSubSwap1(ByValXAsString,ByValYAsString)DimTAsStringT=XX=YY=TPrint"傳值子過程中互換變量值后的變量數(shù)據(jù):";"X1=";X;"";"Y1=";YEndSub8.4參數(shù)傳遞‘以下為主調(diào)過程(事件過程)PrivateSubForm_Click()DimAAsString,BAsStringCls'清除窗體文字

A="ABCDE"B="12345"Print"主過程在調(diào)用子過程之前的原變量數(shù)據(jù):";"A1=";A;"";"B1=";BPrint"_________________________________________________"

Swap1A,BPrint"主過程調(diào)用傳值子過程之后的變量數(shù)據(jù):";"A1=";A;"";"B1=";BEndSub8.4參數(shù)傳遞

運行結(jié)果如下圖所示。從程序的運行結(jié)果可以看出,使用按值傳送方式傳遞數(shù)據(jù),將不會引起實參值的改變。也就是說,兩個形參的值雖然進行了互換,但沒有影響實參的值,實

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論