子過程和函數過程_第1頁
子過程和函數過程_第2頁
子過程和函數過程_第3頁
子過程和函數過程_第4頁
子過程和函數過程_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

子過程和函數過程1第一頁,共八十六頁,編輯于2023年,星期二本章主要介紹:定義Sub過程定義Function函數過程調用Sub過程或Function函數過程調用事件過程變量的存儲類別和作用域。編寫過程,可以實現代碼重復使用。2第二頁,共八十六頁,編輯于2023年,星期二8.1.1什么是過程過程是編寫程序的功能模塊使用過程主要有以下兩方面的原因:1.可以把復雜的問題簡單化任務分解為子任務,子任務用過程實現使程序結構清晰、易讀,也便于調試和維護。2.可以實現代碼重復使用可以避免重復編寫的煩瑣可以減少出錯。8.1概述3第三頁,共八十六頁,編輯于2023年,星期二8.1.2

過程分類與調用流程VB中的過程分成兩大類:事件過程:由對象的某個事件驅動執(zhí)行如Click事件過程、Load事件過程等通用過程由用戶自已定義的完成某一功能的過程。通用過程不屬于任一對象,不由事件驅動使用專用的調用語句來執(zhí)行它4第四頁,共八十六頁,編輯于2023年,星期二通用過程又分兩類:Sub過程(子過程、子程序)往往用于處理不需要有返回值的一些基本任務如顯示矩陣。Function函數過程:可作為函數使用,它一般應有一個返回值如求階乘。5第五頁,共八十六頁,編輯于2023年,星期二調用流程如圖:VB的應用程序就是由若干個過程構成的。6第六頁,共八十六頁,編輯于2023年,星期二【例8-1】設計程序,其作用是根據姓名查電話號碼。輸入姓名后,單擊“確定”或按回車鍵,使姓名與內部儲存的一批姓名核對,若存在,則顯示“歡迎查詢”內并使窗體只顯示標簽,且文字為姓名和對應的電話號碼。最多允許輸入3遍??丶?個標簽、1個文本框1個“確定”命令按鈕8.2查詢電話號碼7第七頁,共八十六頁,編輯于2023年,星期二過程:Form_Load事件:儲存一批姓名和電話號碼等Command1_Click事件:核對姓名,顯示提示Text1_KeyPress事件:核對姓名,顯示提示CheckName函數過程:判斷此人是否存在,得下標/-1。姓名和電話號碼為模塊級變量、N為靜態(tài)變量。8第八頁,共八十六頁,編輯于2023年,星期二DimName1,Phone'聲明Name1,Phone為模塊級Variant類型變量

PrivateSubCommand1_Click()

'核對姓名,顯示提示

StaticNAsInteger'聲明N為靜態(tài)整型變量

DimTAsInteger

T=CheckName(Text1.Text)'以姓名為參數,調用函數CheckBook

IfT<>-1Then

MsgBox"歡迎查詢!",,"提示"

Text1.Visible=False:Command1.Visible=False

Label1.Caption="姓名:"&Text1.Text&Chr(13)&"電話:"&Phone(T)

Label1.Left=(Form1.ScaleWidth-Label1.Width)/2'讓標簽在中間9第九頁,共八十六頁,編輯于2023年,星期二Else

N=N+1'核對次數加1

IfN<3Then

MsgBox"你輸錯了,這是第"&N&"次錯,請重輸!",,"提示"

Text1.Text="":Text1.SetFocus

Else

MsgBox"你已經輸錯3次了!再見!",,"提示"

End

EndIf

EndIf

EndSub10第十頁,共八十六頁,編輯于2023年,星期二

PrivateSubForm_Load()'初始化數組、設置屬性

Label1.AutoSize=True

Text1.Text="":Label1.Caption="姓名:":Command1.Caption="確定"

Name1=Array("張小紅","李小芳","王小華","王力","李季","黃大海")

Phone=Array(8820123,8882011,7812321,2444522,1243211,3434555)

EndSub

11第十一頁,共八十六頁,編輯于2023年,星期二

FunctionCheckName(NaAsString)AsInteger

‘函數過程,返回位置

DimiAsInteger

CheckName=-1

Fori=LBound(Name1)ToUBound(Name1)’線性查找法

IfName1(i)=NaThenCheckName=i:ExitFor

NextIEndFunctionPrivateSubText1_KeyPress(KeyAsciiAsInteger)

IfKeyAscii=13ThenCommand1_Click

‘遇回車時,調用事件過程

EndSub12第十二頁,共八十六頁,編輯于2023年,星期二VB中的模塊屬于工程資源它由過程或聲明構成,以獨立的文件管理。工程中包含窗體、類和標準模塊文件本節(jié)介紹窗體模塊標準模塊。8.3窗體模塊和標準模塊13第十三頁,共八十六頁,編輯于2023年,星期二8.3.1

窗體模塊窗體模塊是大多數VB應用程序的基礎窗體模塊與窗體對應,存放窗體上所有信息:窗體及窗體上各控件界面信息、屬性、事件過程通用過程變量和常量的聲明等。窗體模塊文件的擴展名為.Frm一個應用程序可以創(chuàng)建多個窗體模塊14第十四頁,共八十六頁,編輯于2023年,星期二8.3.2

標準模塊和SubMain過程標準代碼模塊一般存放與特定窗體或控件無關的通用過程、全局變量的聲明等如求階乘一個過程要被多個不同對象或模塊調用時,那么該過程一般可放在標準模塊中。一個應用程序可建立多個標準模塊建立標準模塊的方法是:使用“工程”菜單的“添加模塊”命令項。15第十五頁,共八十六頁,編輯于2023年,星期二應用程序啟動時,可先裝載窗體,也可先運行

SubMain過程SubMain是過程名為Main的特殊過程SubMain過程必須放在標準模塊中才可作為啟動對象。啟動對象可以在工程屬性中設置16第十六頁,共八十六頁,編輯于2023年,星期二8.4.1定義Sub過程Sub過程一般指通用子過程,可在程序中調用執(zhí)行,執(zhí)行完畢后無返回值。它可以定義在窗體模塊的通用對象中,也可以定義在標準模塊中。格式:

Sub過程名([參數列表])

[語句塊]

EndSub8.4Sub過程17第十七頁,共八十六頁,編輯于2023年,星期二1.關于格式過程名的命名方式與變量名命名一致。參數列表為調用時傳遞給Sub過程的參數,用逗號間隔。Sub過程也可以沒有參數,但括號不可省。參數的常用語法是:參數名[As類型說明]定義時的參數,又稱為形式參數,簡稱形參。Sub和EndSub必須成對出現18第十八頁,共八十六頁,編輯于2023年,星期二2.關于語句塊語句塊即為過程體,與事件過程的代碼編寫一樣包含變量聲明和可執(zhí)行的語句、方法等可以由順序、分支、循環(huán)三種結構綜合而成。語句塊中可直接使用參數說明:語句塊中不能重復聲明形式參數。Sub過程名([參數列表])

[語句塊]

EndSub19第十九頁,共八十六頁,編輯于2023年,星期二3.過程定義步驟打開代碼窗口,對象框中選“通用”,然后輸入過程首行并回車,VB自動顯示EndSub然后再輸入過程體就可以了。如:定義過程Hello:實現以姓名為參數顯示“XXX你好!”(XXX具體內容由參數決定)Sub過程名([參數列表])

[語句塊]

EndSub20第二十頁,共八十六頁,編輯于2023年,星期二完整代碼應為:

SubHello(XXXAsString)

MsgBoxXXX&"你好!"

EndSub以上過程的過程名為Hello形式參數為XXX且是字符串型過程體只用了一句MsgBox,并同時使用了參數XXX。21第二十一頁,共八十六頁,編輯于2023年,星期二程序中使用調用語句可調用Sub過程過程運行完畢或跳出過程運行后,返回到調用處。1.調用Sub過程的方法過程定義在當前模塊或標準模塊中使用以下兩種格式之一:

格式一:過程名[實參數列表]

格式二:Call過程名[(實參數列表)]如Hello過程,可以使用:

Hello"王小紅"或CallHello("王小紅")22第二十二頁,共八十六頁,編輯于2023年,星期二過程定義在窗體模塊中而調用語句在其它模塊中采用以下兩種格式之一:

格式一:窗體名.過程名[實參數列表]

格式二:Call窗體名.過程名[(實參數列表)]調用Sub過程的方法也可以用來調用事件過程,如例4-10,可用:

PrivateSubCheck2_Click()

Check1_Click'這時調用的過程名即為Check1_Click

EndSub23第二十三頁,共八十六頁,編輯于2023年,星期二2.關于過程調用時的參數過程調用時的參數稱為實際參數,簡稱實參。它可以變量、常量或表達式。實參與形參的個數應相同、類型應一致若實參是表達式,則先計算值,再將值送給對應的形參。實參和形參可以使用同名變量。如果定義的過程沒有形參,則調用時就沒有實參。24第二十四頁,共八十六頁,編輯于2023年,星期二使用Call調用時,實參部分要加上括號不使用Call關鍵字,直接用過程名調用時,參數部分不能加上括號,但過程名和第一個參數之間要有空格。例如,編程:要求輸入姓名,調用Hello過程,則程序如下:

PrivateSubCommand1_Click()

DimSAsString

S=InputBox("請輸入姓名")

HelloS

EndSub25第二十五頁,共八十六頁,編輯于2023年,星期二【例8-2】分析以下程序:

SubA(nAsInteger)

DimiAsInteger

Fori=1Ton:Printi;:Next

CallB

Print

EndSub

SubB()

Print"BBBBBB"

EndSub

PrivateSubCommand1_Click()

CallA(9)

B

'直接使用過程名調用過程B()

EndSub26第二十六頁,共八十六頁,編輯于2023年,星期二8.4.2

調用Sub過程【例8-3】設計一個如圖所示的程序,其作用是顯示字符圖案。顯示的字符和行數由輸入決定,形狀可以是正三角形或倒三角形。編寫通用過程Print_triangle,輸出三角形圖案。顯示的字符S、行數Line、及作為正或倒的三角形標志Flag均作為參數Print_triangle供兩個命令按鈕調用兩個命令按鈕的Click事件:輸入1個字符和行數,調用

Print_triangle過程。8.4Sub過程27第二十七頁,共八十六頁,編輯于2023年,星期二8.4.2調用Sub過程—字符三角形SubPrint_triangle(SAsString,LineAsInteger,FlagAsInteger)'通用過程

DimAAsInteger,BAsInteger,iAsInteger,jAsInteger

ClsIfFlag=-1ThenA=Line:B=1ElseA=1:B=Line

Fori=AToBStepFlag'正:從小到大循環(huán),倒:從大到小循環(huán)

PrintTab(Line+10-i);

Forj=1To2*i–1:PrintS;:Nextj

Print

Nexti

EndSub28第二十八頁,共八十六頁,編輯于2023年,星期二

PrivateSubCommand1_Click()

DimChAsString*1,LineAsInteger'Ch只容納1個字符

Ch=InputBox("請輸入一個要顯示的字符")

Line=Val(InputBox("請輸入顯示的行數"))

Print_triangleCh,Line,1'以標志1調用過程

EndSub

PrivateSubCommand2_Click()

DimChAsString*1,LineAsInteger

Ch=InputBox("請輸入一個要顯示的字符")

Line=Val(InputBox("請輸入顯示的行數"))

Print_triangleCh,Line,-1'以標志-1調用過程

EndSub29第二十九頁,共八十六頁,編輯于2023年,星期二8.4.3

ExitSub語句使用ExitSub語句可以中途結束子過程的運行。程序不再執(zhí)行ExitSub到EndSub之間的代碼,而是直接返回到調用處。ExitSub語句一般往往與If語句合用,如:修改例8-3中的Print_triangle過程,當Line參數小于等于0,Flag參數不等于±1時,顯示“參數錯誤”并退出過程。30第三十頁,共八十六頁,編輯于2023年,星期二則可以在Print_triangle過程的Cls前增加一句:

IfLine<=0OrAbs(Flag)<>1ThenMsgbox"參數錯誤":ExitSubExitSub也可以用在事件過程特別注意:在過程中途退出過程不能使用EndSub。31第三十一頁,共八十六頁,編輯于2023年,星期二8.5.1

定義Function函數過程Function函數過程執(zhí)行完畢后有一個返回值。函數過程定義后,可像系統(tǒng)函數一樣使用。函數可定義在窗體模塊的通用對象中或標準模塊中。格式:

Function函數名([參數列表])[As類型說明]

[函數體]

EndFunction8.5Function函數過程32第三十二頁,共八十六頁,編輯于2023年,星期二1.關于格式函數名、參數列表的要求與Sub過程的過程名、參數相同。Function必須在EndFunction之前出現,且必須成對Function語句中的類型說明,是返回值的類型。如編一個判斷整型參數n是否為素數的函數,首行可寫為:

FunctionPrime(nAsInteger)AsBoolean33第三十三頁,共八十六頁,編輯于2023年,星期二8.5.1定義Function函數過程2.關于函數體函數體是一系列用于完成某一功能的代碼包含變量聲明和可執(zhí)行語句可由順序、分支、循環(huán)三種結構合成。一般格式:

[語句塊]

函數名=表達式

[語句塊]一般,函數體中應有一句“函數名=表達式”,表示該表達式的值就作為函數的返回值該表達式的類型應該與函數的類型說明一致34第三十四頁,共八十六頁,編輯于2023年,星期二3.函數定義步驟同編寫過程一樣,在“通用”對象代碼窗口輸入函數首行。如定義函數過程Max,實現求三個數的最大值:

FunctionMax(aAsInteger,bAsInteger,cAsInteger)AsInteger

Max=a

Ifb>Max

ThenMax=b

Ifc>Max

ThenMax=c

EndFunction35第三十五頁,共八十六頁,編輯于2023年,星期二以上函數過程的過程名為Hello形式參數a、b、c為整型函數體中多次使用了函數名Max,并使用了參數特別說明:不能寫成Max(a,b,c)=a。

36第三十六頁,共八十六頁,編輯于2023年,星期二8.5.2調用Function函數過程函數調用方式如同調用VB內部函數調用格式:

函數過程名[(實參數列表)]調用函數往往在可以使用表達式的代碼中出現,只要類型相同就可以了。如對Max函數過程,可以使用:

A=Max(1,43,5):PrintMax(Max(1,3,21),56,4)如果函數定義在窗體模塊中而調用語句在其它模塊中,則調用時應在函數名前加上所屬的窗體名。實參用法和要求,與子過程調用相同。37第三十七頁,共八十六頁,編輯于2023年,星期二【例8-4】編程計算,在本文框輸出。要求計算n!使用函數過程Factorial(n)實現。控件:2個文本框、3個標簽

1個命令按鈕。過程:通用函數過程Factorial(n):求階乘Command1_Click事件:求屬性:大部分屬性在Form_Load中設置命令按鈕為圖形按鈕,更改Style、Caption和Picture屬性38第三十八頁,共八十六頁,編輯于2023年,星期二FunctionFactorial(NAsInteger)AsDouble'通用函數過程,求n!

DimiAsInteger,TAsDouble

T=1

Fori=1ToN:T=T*i:Nexti

Factorial=TEndFunctionPrivateSubCommand1_Click()'計算結果,要求m≥n

DimMAsInteger,NAsInteger

M=Val(Text1.Text):N=Val(Text2.Text)

IfM<NThen'當m<n時,給出提示,清除數據,跳出過程39第三十九頁,共八十六頁,編輯于2023年,星期二

MsgBox"m必須大于等于n。",,"提示“

Text1.Text="":Text2.Text="":Text1.SetFocusExitSubEndIfLabel3.Caption="答案:"&Factorial(M)/(Factorial(N)*Factorial(M-N))

EndSubPrivateSubForm_Load()

‘初始化控件屬性

Label1.Caption="m=":Label2.Caption="n=":Label3.Caption="“Text1.Text="":Text2.Text="“EndSub40第四十頁,共八十六頁,編輯于2023年,星期二8.5.3ExitFunction語句使用ExitFunction語句跳出Function函數過程。ExitFunction語句一般與If語句合用,即在滿足某種條件時退出該函數過程,返回調用處。如修改例8-4中的Factorial函數過程,當N<0時顯示“參數錯誤”并退出Factorial函數過程。則可以增加:IfN<0ThenFactorial=1:MsgBox"參數錯誤":ExitFunction注意:在函數過程中途退出不能使用EndFunction。41第四十一頁,共八十六頁,編輯于2023年,星期二形式參數(形參)是過程定義時的參數實際參數(實參)是過程調用時的參數過程調用時,實參向形參傳遞數據傳遞的方法分為:“引用傳遞”(“引用調用”)“按值傳遞”(“按值調用”)(這里的過程是統(tǒng)指子過程和函數過程)8.6引用調用和按值調用42第四十二頁,共八十六頁,編輯于2023年,星期二8.6.1

引用調用引用調用:形參變量與實參變量共享一個內存單元。此時,過程中對形參的修改,影響實參變量即可實現把過程中對形參修改的結果帶回調用過程。前面格式中,所有參數都采用引用調用,除非實參是表達式。單擊Command1后,N1和N為同一個內存單元,所以N1的值就變成8。最終窗體顯示8。43第四十三頁,共八十六頁,編輯于2023年,星期二引用調用的形參說明,可使用格式:ByRaf參數名[As類型說明]缺省ByRaf表示引用調用。如:

SubAbc1(NAsInteger)

N=N+5

EndSub

PrivateSubCommand1_Click()

DimN1AsInteger

N1=3:CallAbc1(n1):PrintN1

EndSub44第四十四頁,共八十六頁,編輯于2023年,星期二8.6.2

按值調用按值調用時,實參值被復制到形式參數中如果實參為變量,相當于兩者用了不同的存儲單元對形參的操作不會影響實參的內容。按值調用的形式參數的說明,使用格式:ByVal

參數名

[As類型說明]若實參是表達式,則一律使用按值調用單擊Command1后,N1和N實際上

是不同的內存單元,調用時只將

N1的值送入形參N中,最終顯示3。45第四十五頁,共八十六頁,編輯于2023年,星期二如:

SubAbc2(ByValNAsInteger)

N=N+5

EndSub

PrivateSubCommand1_Click()

DimN1AsInteger

N1=3:CallAbc2(N1)

PrintN1

EndSub

46第四十六頁,共八十六頁,編輯于2023年,星期二【例8-5】編寫求一元二次方程實數解的過程并調用它。由于方程有兩個解。而函數返回一個值。解決方法:編寫Sub過程Root,X1和X2為引用調用,A、B、C為按值調用。

Sub

Root(ByValAAsSingle,ByValBAsSingle,_

ByValCAsSingle,X1AsSingle,X2AsSingle)

DimDAsSingle

D=B*B-4*A*C

IfA=0ThenMsgBox"不是一元二次方程!":ExitSub

IfD<0ThenMsgBox"方程無實數解!":ExitSub

X1=(-B+Sqr(D))/(2*A):X2=(-B-Sqr(D))/(2*A)

EndSub47第四十七頁,共八十六頁,編輯于2023年,星期二PrivateSubCommand1_Click()

DimAAsSingle,BAsSingle,CAsSingle,X1AsSingle,X2AsSingle

A=3:B=9:C=5

RootA,B,C,X1,X2

‘A、B、C按值,X1和X2引用調用

PrintX1,X2EndSub程序調用前,X1和X2沒有賦過值,通過

引用調用,使它們得到了方程的實數解。48第四十八頁,共八十六頁,編輯于2023年,星期二8.6.3

傳遞數組傳遞數組,形式參數的格式:

參數名()[As類型說明]數組不能按值調用,只能引用調用【例8-6】隨機產生兩個3×4的矩陣A和B,矩陣元素值為1~50的整數。求兩個矩陣的和C。并輸出矩陣A、B和C。運行如圖。矩陣加法使元素C(i,j)=A(i,j)+B(i,j)49第四十九頁,共八十六頁,編輯于2023年,星期二編寫過程:通用過程PrintM:實現矩陣輸出通用過程CreateM:產生矩陣事件過程Form_Load:初始化隨機數種事件過程Command1_Click:調用通用過程并實現題目50第五十頁,共八十六頁,編輯于2023年,星期二8.6.3

傳遞數組--矩陣加法SubCreateM(A()AsInteger)

'創(chuàng)建

Fori=1ToUBound(A,1)Forj=1ToUBound(A,2)A(i,j)=Int(Rnd*50)+1NextjNextiEndSub51第五十一頁,共八十六頁,編輯于2023年,星期二SubPrintM(A()AsInteger)'輸出

Fori=1ToUBound(A,1)Forj=1ToUBound(A,2)PrintA(i,j),NextjPrintNextiEndSub

說明:UBound函數的第2個參數指數組的維,當該數為1時,指它的第1維上界,該數為2時,指它的第2維上界。52第五十二頁,共八十六頁,編輯于2023年,星期二PrivateSubCommand1_Click()

DimA(3,4)AsInteger,B(3,4)AsInteger

DimC(3,4)AsInteger,iAsInteger,jAsInteger

CreateMA

‘創(chuàng)建矩陣A

CreateMB

’創(chuàng)建矩陣B

Fori=1To3

‘矩陣加法

Forj=1To4

C(i,j)=A(i,j)+B(i,j)

Nextj

NextiCls

53第五十三頁,共八十六頁,編輯于2023年,星期二

PrintTab(22);"A矩陣":PrintMA'輸出A

PrintTab(22);"B矩陣":PrintMB

'輸出B

PrintTab(22);"C矩陣":PrintMC

'輸出CEndSubPrivateSubForm_Load()

RandomizeEndSub

54第五十四頁,共八十六頁,編輯于2023年,星期二8.6.4可選參數可選參數表示調用時該參數可選(可不寫)定義可選參數是在形參的前加Optional關鍵字若該形參后還有參數,則后面必須都定義為可選。IsMissing函數判斷是否提供可選參

數,若未提供,則值為True。這時兩個過程調用語句可分別改為:

Print_triangleCh,Line

'2個參數

Print_triangleCh,Line,-1

'3個參數。55第五十五頁,共八十六頁,編輯于2023年,星期二如例8-3的Print_triangle過程,可將第3個參數Flag設置為可選:若調用時不用Flag表示輸出正三角形:

SubPrint_triangle(SAsString,LineAsInteger,OptionalFlagAsInteger)

DimAAsInteger,BAsInteger,CAsInteger,iAsInteger,jAsInteger

Cls:A=1:B=Line:C=1

IfNotIsMissing(Flag)Then

IfFlag<0ThenA=Line:B=1:C=-1

EndIf Fori=AToBStepC

PrintTab(Line+10-i);

Forj=1To2*i–1:PrintS;:Nextj

Print

NextiEndSub56第五十六頁,共八十六頁,編輯于2023年,星期二8.6.5可變參數使用可變參數可使參數個數不受限制可變參數其實是一種數組表示法可變參數在形參前加上ParamArray關鍵字。如將Max函數定義為使用可變參數的函數:57第五十七頁,共八十六頁,編輯于2023年,星期二FunctionMax(ParamArrayA())AsInteger'使用可變參數

DimiAsInteger,MAsInteger

M=A(1)

Fori=LBound(A)ToUBound(A)

IfA(i)>MThenM=A(i)

Nexti

Max=M

EndFunction

PrivateSubCommand1_Click()'調用時,參數個數可以不限

PrintMax(6,4,3,2,1)'使用了5個參數

PrintMax(10,34,5,56,2,55,67,83,9)'使用了9個參數

EndSub58第五十八頁,共八十六頁,編輯于2023年,星期二8.6.6對象參數過程可以使用對象如在7.8節(jié)的“選擇聯系人”例子中,List1_KeyDown事件過程和List2_KeyDown事件過程的代碼除了對象名不同外,其它是可以相同,因此可用參數為對象的通用過程Delete:59第五十九頁,共八十六頁,編輯于2023年,星期二

SubDelete(aAsObject,keyCodeAsInteger)'將a定義為對象變量

DimiAsInteger

IfkeyCode=vbKeyDeleteThen'按下了Delete鍵,刪除已選項目

Fori=a.ListCount-1To0Step-1

Ifa.Selected(i)=TrueThena.RemoveItemi

Next

EndIfEndSubPrivateSubList1_KeyDown(keyCodeAsInteger,ShiftAsInteger)

DeleteList1,keyCodeEndSubPrivateSubList2_KeyDown(keyCodeAsInteger,ShiftAsInteger)

DeleteList2,keyCodeEndSub60第六十頁,共八十六頁,編輯于2023年,星期二變量是存放數據的單元,其中的數據隨著程序的運行而變化。過程中使用Dim語句聲明的變量,將隨著過程的結束而消失,其中的儲存的數據也就不再存在。其實,程序還可以使用多種存儲類別的變量:可以整個應用程序都可使用可以在定義的過程中繼續(xù)使用…8.7存儲類和作用域61第六十一頁,共八十六頁,編輯于2023年,星期二8.7.1

存儲類別根據存儲類別,變量分成靜態(tài)變量和動態(tài)變量。1.動態(tài)變量指程序運行進入變量所在過程時,才給變量分配內存空間,退出該過程時,變量所占用內存空間自動釋放,其值消失,變量不再存在。在過程中使用Dim語句聲明的變量屬于動態(tài)變量。62第六十二頁,共八十六頁,編輯于2023年,星期二如有以下過程:

PrivateSubCommand1_Click()

DimAAsInteger

A=A+1:PrintA

EndSub窗體啟動后,無論用戶單擊Command1多少次,

顯示的數據總是1。63第六十三頁,共八十六頁,編輯于2023年,星期二8.7.1

存儲類別2.靜態(tài)變量靜態(tài)變量指程序運行中雖然退出變量所在的過程,但變量所占用的空間沒有釋放,值仍保留,若下次再進入該過程,原值仍可使用。使用Static語句在過程中聲明的變量屬于靜態(tài)變量。Static變量只能在過程中聲明。格式:

Static變量名As類型說明64第六十四頁,共八十六頁,編輯于2023年,星期二例如以下事件過程,單擊顯示:

PrivateSubCommand1_Click()

DimAAsInteger'A為動態(tài)變量

StaticBAsInteger'B為靜態(tài)變量

A=A+1:B=B+1:PrintA,B

EndSub111213…65第六十五頁,共八十六頁,編輯于2023年,星期二8.7.2

作用域作用域指變量或符號常量在程序哪個范圍中有效。作用域分成:局部的、模塊級的和全局的三類。1.局部變量/局部符號常量局部變量是指在過程中聲明的變量它在過程內采用Dim語句或Static語句聲明局部符號常量是指在過程中定義的符號常量它在過程內采用Const語句定義。它們只能在該過程中有效。66第六十六頁,共八十六頁,編輯于2023年,星期二其它過程中出現同名量,則代表著另一個量。如:

PrivateSubCommand1_Click()'事件過程Command1

DimXAsInteger'X變量僅在該過程中有效

ConstPI=3.1415926'符號常量PI僅在該過程中有效

X=3:Print"有效的值";X*PI

EndSub

PrivateSubCommand2_Click()'事件過程Command2

PrintX,PI'無效

EndSub若用了OptionExplicit語句,單擊Command2時還會出錯67第六十七頁,共八十六頁,編輯于2023年,星期二2.模塊級變量/模塊級符號常量模塊級變量或符號常量可在一個模塊的各過程中使用窗體模塊級變量/常量是在通用對象的聲明部分用Dim或Private語句聲明變量,或用Const定義符號常量。如:

PrivateXAsInteger'也可以使用Dim,將x聲明為模塊級變量

PrivateSubForm_Load()

X=5

EndSub

68第六十八頁,共八十六頁,編輯于2023年,星期二PrivateSubCmd1_Click()

X=X+1

Print"過程1中的X=";X

EndSub

PrivateSubCmd2_Click()

X=X+1

Print"過程2中的X=";X

EndSub按序單擊Cmd1和Cmd2,顯示:

過程1中的X=6

過程2中的X=7

只要應用程序不停止運行,即使

窗體卸下后再次裝載,原值仍可用69第六十九頁,共八十六頁,編輯于2023年,星期二8.7.2

作用域3.全局變量/全局符號常量全局變量在整個應用程序中有效全局變量在窗體通用對象或標準模塊中Public聲明:Public變量名As類型說明定義全局符號常量的格式為:PublicConst符號常量名=常量表達式70第七十頁,共八十六頁,編輯于2023年,星期二說明:過程中不能用Public和Private聲明變量和定義符號常量;窗體模塊中不能用Public定義全局符號常量,也不能聲明數組、定長字符串和用戶自定義類型,它們只能在標準模塊中用。71第七十一頁,共八十六頁,編輯于2023年,星期二標準模塊中聲明的全局變量,在其它模塊中可直接使用窗體模塊聲明的全局變量,其它模塊采用格式:

窗體名.變量名

如:Form1.X=100與模塊級變量一樣,全局變量在靜態(tài)存儲區(qū)分配空間。72第七十二頁,共八十六頁,編輯于2023年,星期二8.7.3生存期生存期是指變量的存在時間只有動態(tài)變量,生存只在過程的一次執(zhí)行中靜態(tài)變量、模塊級變量和全局變量的生存期將持續(xù)到整個應用程序運行結束。73第七十三頁,共八十六頁,編輯于2023年,星期二8.7.4

過程的作用域和局部變量存儲類別定義過程時,可加上作用域關鍵字Public或Private,可加存儲類別的關鍵字Static。過程定義首行格式可以寫成:[Private|Public][Static]Sub過程名[(參數列表)][Private|Public][Static]Function函數名[(參數列表)]As類型說明Public:表示所有過程都可以調用該過程定義在窗體模塊中,其他模塊調用時使用:窗體名.過程名如果定義在標準模塊或本模塊中,可以直接使用。缺省Public,也沒有Private關鍵字,則等同Public的特性。74第七十四頁,共八十六頁,編輯于2023年,星期二Private:表示該過程只能在本模塊中可以調用Static:表示過程中所有局部變量都作為靜態(tài)變量。如:

StaticSubBb()

DimAAsInteger

A=A+1

MsgBox"Bb"&A

EndSub若Cmd1的Click中有CallBb語句,

則單擊Cmd1將顯示:Bb1、Bb2、Bb3……75第七十五頁,共八十六頁,編輯于2023年,星期二8.8.1

用遞歸實現求階乘遞歸調用是指在一個過程內直接或間接調用自己?!纠?-7】利用遞歸調用編寫的求n!的函數Fact(n)。求n!時,n!=n×(n-1)!,(n-1)!=(n-1)×(n-2)!,……,若知道1!=1或0!=1,則可回推可以算出n!。在求n!時要調用Fact(n-1),產生了遞歸調用。

FunctionFact(nAsInteger)AsDouble

Ifn=0Orn=1Then

Fact=1

Else

Fact=n*Fact(n-1)

EndIf

EndFunction8.8程序舉例76第七十六頁,共八十六頁,編輯于2023年,星期二編寫遞歸過程,需要兩個必須的條件:形成遞歸式。如:Fact=n*Fact(n-1)必須有一個出口。如:Ifn=0Orn=1ThenFact=177第七十七頁,共八十六頁,編輯于2023年,星期二8.8.2

冒泡分類法【例8-8】

實現30個數據的排序輸出。要求使用冒泡分類法。其中數據排序、產生和輸出分別用通用過程實現。冒泡分類法的基本思想:大的數逐層往下沉,而小的數逐層往上浮,就氣泡上浮一樣。算法:1.從數組元素a(1)到a(N),將相鄰的兩個數兩兩進行比較(共比較N-1次),若前一個數大于后一個數,則進行對調。一趟操作后,a(N)已為最大數。78第七十八頁,共八十六頁,編輯于2023年,星期二2.再從數組元素a(1)到a(N-1)作同樣操作后,結果是a(N-1)成為次大數。3.重復以上步驟,直至只剩a(1)和a(2)作比較。由此可見,對N個數據第1趟比較N-1次,第2趟比較N-2次,……,第i趟比較N-i次。共進行N-1趟比較就可以排好順序。79第七十九頁,共八十六頁,編輯于2023年,星期二SubOrderArray(A()AsInteger)'排序

DimiAsInteger,jAsInteger,NAsInteger,TAsInteger

N=UBound(A)

Fori=1ToN-1'開始冒泡排序,共進行n-1趟

Forj=

溫馨提示

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

評論

0/150

提交評論