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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第八章

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

DimI%

prime=True'函數賦初值True

ForI=2ToSqr(x)

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

prime=False'函數取值False,則x不是素數

ExitFunction'函數結束

EndIf

NextIEndFunction‘在事件過程中調用以上定義的函數,得到結果。PrivateSubForm_Click()

DimI%,N,K%

I=1'計數

ForN=50To100Step2'取偶數

ForK=3ToN/2'第一個數的取值區間折半

Ifprime(K)Andprime(N-K)Then‘二次調用結果都是素數輸出

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

ExitFor'退出k循環

EndIf

NextK

I=I+1

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

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

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

8)

[ExitFunction]用于退出函數過程,該項一般嵌套在if結構中使用,在滿足if條件時退出該函數過程。

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

DimI%,T%,K%,C$

ForI=1ToLen(S)

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

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

NextI

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

DimC1%

C1=CountXw(Text1.Text)‘調用CountXw函數

Picture1.PrintText1'在Picture1中顯示統計的結果

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

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

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

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

分析:先編寫一個具有將兩個數進行交換的子過程,需要進行兩數交換時,調用該子過程,同時將待交換的兩個數傳送到該子過程中,在子過程實現兩數交換。子過程執行結束后,將被交換后的兩個數返回到主調過程中。‘Cp()子過程的定義

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

IfA=0Then

ExitSub

EndIf

A=A+B'A和B的值交換,帶回主調過程

B=A-B

A=A-B

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

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

DimStr1$,Va%,Vb%

Str1$="輸入對話框"

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

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

Print"在主調過程中調用子過程前的值"

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

CallCp(Va,Vb)

Print"在主調過程中調用子過程后的值"'輸出經子過程處理過后的返回值

Print"Va=";Va,"Vb=";VbEndSub運行結果:

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

Ifx=0andy=0ThenExitSub

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

CallLink(a,b)EndSub

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

Linka,b

EndSub8.4參數傳遞8.4.1形參與實參1、形參

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

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

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

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

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

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

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

Print"主過程在調用子過程之前:";"A1=";A;"";"B1=";BPrint"_____________________________________________"Print

Swap1A,B

‘調用子過程Sub1Print"主過程調用傳址子過程之后:";"A1=";A;"";"B1=";BEndSub8.4參數傳遞

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

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

A="ABCDE"B="12345"Print"主過程在調用子過程之前的原變量數據:";"A1=";A;"";"B1=";BPrint"_________________________________________________"

Swap1A,BPrint"主過程調用傳值子過程之后的變量數據:";"A1=";A;"";"B1=";BEndSub8.4參數傳遞

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

溫馨提示

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

評論

0/150

提交評論