![《Visual Basic程序設(shè)計(jì)教程(第二版)》課件6_第1頁](http://file4.renrendoc.com/view11/M01/31/37/wKhkGWV5qX2Ac0lTAAGp-MGcpPs022.jpg)
![《Visual Basic程序設(shè)計(jì)教程(第二版)》課件6_第2頁](http://file4.renrendoc.com/view11/M01/31/37/wKhkGWV5qX2Ac0lTAAGp-MGcpPs0222.jpg)
![《Visual Basic程序設(shè)計(jì)教程(第二版)》課件6_第3頁](http://file4.renrendoc.com/view11/M01/31/37/wKhkGWV5qX2Ac0lTAAGp-MGcpPs0223.jpg)
![《Visual Basic程序設(shè)計(jì)教程(第二版)》課件6_第4頁](http://file4.renrendoc.com/view11/M01/31/37/wKhkGWV5qX2Ac0lTAAGp-MGcpPs0224.jpg)
![《Visual Basic程序設(shè)計(jì)教程(第二版)》課件6_第5頁](http://file4.renrendoc.com/view11/M01/31/37/wKhkGWV5qX2Ac0lTAAGp-MGcpPs0225.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第1章過程【本章導(dǎo)讀】
在VisualBasic中有一類過程屬于自定義過程,它由用戶建立,供事件過程或其他自定義過程調(diào)用。每個自定義過程都具有獨(dú)立的功能,自定義過程的使用符合結(jié)構(gòu)化程序設(shè)計(jì)的原則,它的好處是使程序簡練、便于調(diào)試和維護(hù)。這一章我們主要介紹自定義過程的設(shè)計(jì)和使用。在VisualBasic中,根據(jù)是否有返回值,把自定義過程分為兩類:子過程和函數(shù)過程。第1章VisualBasic程序設(shè)計(jì)概述【本章要點(diǎn)】
面子過程的建立和使用函數(shù)過程的建立和使用過程中參數(shù)的傳遞變量和過程的作用域過程的遞歸和嵌套
Sub(子程序)過程可以描述兩種過程:事件過程和通用過程。
表示窗體事件或控件事件的格式:
PrivateSubForm|控件名_事件名(參數(shù)列表)
<語句組>
EndSub6.1.1事件過程和通用過程1.事件過程建立方法:1.手工鍵入。
2.使用模板。2.通用過程
通用過程是獨(dú)立于事件過程之外,不與任何特定的事件相聯(lián)系,它可以存儲在窗體模塊或標(biāo)準(zhǔn)模塊中。6.1子過程一般格式:
[Static][Private|Public]Sub過程名[(參數(shù)表列)]
語句塊
[ExitSub][語句塊]EndSub6.1.2建立Sub過程1.定義Sub過程說明:(1)Sub過程以Sub開頭,以EndSub結(jié)束,在它們之間是描述過程操作的語句塊,稱為“過程體”或“子程序體”。格式中各參量的含義如下:Static:指定過程中的局部變量在內(nèi)存中的存儲方式。如果使用了
Static,則過程中的局部變量就是“靜態(tài)”變量。
Private|Public
:表示Sub過程是私有過程或公有過程。過程名:是一個長度不超過40個字符的變量名,命名規(guī)則與變量名規(guī)則相同。參數(shù)表列:含有在調(diào)用時傳送給過程的簡單變量名或數(shù)組名,各名字之間用逗號隔開?!皡?shù)表列”指明了調(diào)用時傳送給過程的參數(shù)的類型和個數(shù),每個參數(shù)的格式為:
[ByVal][Byref]變量名[()][As數(shù)據(jù)類型]
如果加上“ByVal”,則表明該參數(shù)是“傳值”參數(shù),沒有加“ByVal”(或者加ByRef)的參數(shù)稱為“傳址”參數(shù)。數(shù)據(jù)類型為前面介紹的。
說明:(2)EndSub標(biāo)志著Sub過程的結(jié)束。當(dāng)程序執(zhí)行到EndSub時,將退出該過程,并立即返回到調(diào)用語句下面的語句。此外,在過程體內(nèi)可以用一個或多個ExitSub語句從過程中退出。(3)Sub過程不能嵌套定義。說明:
例:編一個交換兩個整型變量值的子過程。
PrivateSubSwap(XAsInteger,YAsInteger)DimtempAsIntegerTemp=X:X=Y:Y=TempEndSub
(1)利用工具中“添加過程”對話框定義。
2.創(chuàng)建Sub過程(2)直接在代碼窗口定義
打開模塊代碼窗口,然后直接鍵入
過程的名字即可。例:鍵入“SubTestProc”,按回車鍵后就會自動顯示:
SubTestProc()
EndSub
1.用Call語句調(diào)用Sub過程格式:Call過程名[(實(shí)際參數(shù))]
例如:CallTestProc(a,b)2.把過程名作為一個語句來使用
格式:過程名[實(shí)際參數(shù)]
例如:TestProca,b6.1.3調(diào)用Sub過程第二種方式與第一種方式相比,它有兩點(diǎn)不同:(1)去掉關(guān)鍵字call。(2)去掉“實(shí)際參數(shù)”的括號。Sub過程示例【例6.1】編寫交換兩個數(shù)的子過程,并調(diào)用該過程交換a和b,c和d兩組變量的值。分析:首先要編寫一個交換兩個數(shù)的過程。我們把兩個數(shù)分別放入兩個變量中,交換兩個數(shù)時要引入第三個變量t,先把第一個數(shù)放在t中,然后把第二個變量的值賦給第一個變量,再把t的值賦給第二個變量,從而實(shí)現(xiàn)兩個數(shù)的交換。子過程編成后,交換a和b的值時,調(diào)用該過程一次,交換c和d的值時再調(diào)用該過程一次。設(shè)計(jì)步驟如下:1.編寫兩個數(shù)交換的子過程代碼。
例:編一個交換兩個整型變量值的子過程。
PrivateSubSwap(XAsInteger,YAsInteger)DimtempAsIntegerTemp=X:X=Y:Y=TempEndSub
2.編寫事件過程來調(diào)用通用過程。
PrivateSubCmdchange1_Click()DimaAsInteger,bAsIntegera=4:b=5Print"交換前a,b的值為:"Print"a=";a,"b=";bCallswap(a,b)Print"交換后a,b的值為:"Print"a=";a,"b=";bEndSub
PrivateSubCmdchange2_Click()DimcAsInteger,dAsIntegerc=2:d=3Print"交換前c,d的值為:"Print"c=";c,"d=";dSwapc,dPrint"交換后c,d的值為:"Print"c=";c,"d=";dEndSub程序運(yùn)行結(jié)果如下圖所示:
一般格式:[Static][Public|Private]Function函數(shù)名[(參數(shù)表列)][As類型]
語句塊
[函數(shù)名=表達(dá)式][ExitFunction][語句塊]EndFunction6.2.1建立Function過程
函數(shù)是過程的另一種形式,當(dāng)過程的執(zhí)行返回一個值時,使用函數(shù)就比較簡單。與子程序過程不同的是函數(shù)過程將返回一個值。6.2
Function過程說明:1.過程名即Function過程的名字。As類型指定Function過程返回值的類型,可以是Integer、Long、Single、Double、String、Currency或boolean。如果沒有As子句,默認(rèn)的數(shù)據(jù)類型為Variant。
2.Sub過程不能嵌套定義。3.表達(dá)式的值是函數(shù)返回的結(jié)果。在語法中通過賦值語句將值賦給函數(shù)名,該值就是Function過程返回的值。如果在Function過程中省略
“函數(shù)名=表達(dá)式”,則該過程返回一個默認(rèn)值,如數(shù)值函數(shù)返回0。4.語句塊是程序段,語句塊中可以用一個或多個ExitFunction語句從函數(shù)中退出。5.在VB集成環(huán)境建立的方法與Sub過程完全一樣。【例6.2】編寫計(jì)算任意整數(shù)n的階乘的函數(shù)過程fact。
Function過程示例
Functionfact(nAsInteger)AsLongDimpAsLong,IAsintegerp=1ForI=1tonp=p*INextIFact=pEndfunction函數(shù)返回值的類型。把求出的結(jié)果賦給函數(shù)名?!纠?.3】編寫一個求兩個數(shù)最大公約數(shù)的函數(shù)過程。Functiongcd(mAsinteger,nAsInteger)AsIntegerDimrasAsIntegerr=mmodnDoWhiler<>0m=nn=rr=mmodnLoopGcd=nEndFunction函數(shù)返回值的類型。把求出的結(jié)果賦給函數(shù)名。分析:我們采用輾轉(zhuǎn)相除法求最大公約數(shù)。
調(diào)用格式:函數(shù)名(實(shí)參列表)說明:在調(diào)用時實(shí)參和形參的數(shù)據(jù)類型、順序、個數(shù)必須匹配。函數(shù)調(diào)用只能出現(xiàn)在表達(dá)式中,其功能是求得函數(shù)的返回值。6.2.2調(diào)用Function過程【例6.4】利用階乘函數(shù)過程fact求解表達(dá)式2!+4!+6!+8!+10!的值。分析:要計(jì)算2!+4!+6!+8!+10!,首先要計(jì)算出2!、4!、6!、8!、10!。可以用函數(shù)過程fact來計(jì)算n!,每次調(diào)用求階乘函數(shù)前給n分別賦值為2、4、6、8、10,調(diào)用5次,把每次調(diào)用的結(jié)果累加起來就能求得表達(dá)式的值。PrivateSubcmdjs_Click()DimsumAsLongDimtAsLongDimiAsIntegersum=0Fori=2To10Step2Sum=Sum+fact(i)
'調(diào)用函數(shù)過程factNextiLbloutput.Caption=sumEndSub
編寫Command1事件代碼。
調(diào)用fact函數(shù)語句?!纠?.5】定義一個在復(fù)數(shù)范圍內(nèi)求平方根的函數(shù)。輸入一個數(shù),輸出該數(shù)的平方根。分析:用內(nèi)部函數(shù)Sqr可以得到一個數(shù)的平方根,但該數(shù)必須大于或等于0,如果是負(fù)數(shù)該函數(shù)會出現(xiàn)錯誤信息。我們定制一個自定義函數(shù)過程MySqr來解決自變量為負(fù)數(shù)的情況。PrivateFunctionmysqr(xAsDouble)AsDoubleSelectCaseSgn(x)Case1mysqr=Sqr(x)Case0mysqr=0Case-1mysqr=Sqr(Abs(x))EndSelectEndFunction
1.函數(shù)過程MYSQR。
PrivateSubCmdjs_Click()DimxAsDouble,msgAsStringx=Val(Txtx.Text)msg=x&"的平方根是:"Ifx>=0Thenmsg=msg&mysqr(x)Elsemsg=msg&mysqr(x)&"i"EndIfMsgBoxmsgEndSub2.編寫事件過程來調(diào)用通用過程。
6.3過程中參數(shù)的傳遞
形式參數(shù)是指在定義通用過程時,出現(xiàn)在Sub或Function語句中的變量名,是接收數(shù)據(jù)的變量。形參的兩種形式:(1)后面跟有左右圓括號的數(shù)組名。(2)除定長字符串之外的合法變量名。
6.3.1形參和實(shí)參VisualBasic中不同模塊(過程)之間數(shù)據(jù)的傳遞有兩種方式:
通過過程調(diào)用實(shí)參與形參的結(jié)合實(shí)現(xiàn);使用全局變量來實(shí)現(xiàn)各過程中共享數(shù)據(jù)。1.形式參數(shù)
實(shí)際參數(shù)是指在調(diào)用Sub或Function過程時,傳送給Sub或Function過程的常量、變量、表達(dá)式或數(shù)組名。其作用是將它們的數(shù)據(jù)(數(shù)值或地址)傳送給Sub或Function過程與其對應(yīng)的形參變量。2.實(shí)際參數(shù)實(shí)參表和行參表中對應(yīng)的變量名不必相同,但變量的個數(shù)必須相等,而且各實(shí)際參數(shù)的書寫順序必須與相應(yīng)形式參數(shù)的類型相同。例如:傳值參數(shù)的兩種形式:(1)定義過程時選用ByVal關(guān)鍵字,就是按值傳遞。(2)實(shí)際參數(shù)是常量或表達(dá)式。(3)定義過程時選用ByRef關(guān)鍵字,調(diào)用時變量用小括號括起來。傳值參數(shù)的特點(diǎn):形參得到的是實(shí)參的值,形參值的改變不會影響實(shí)參的值。6.3.2傳值參數(shù)和傳址參數(shù)1.傳值參數(shù)【例6.6】運(yùn)行一個程序,理解按值傳遞參數(shù)的含義。PrivateSubForm_Click()DimaAsInteger,bAsInteger,cAsIntegera=5:b=3:c=9ClsPrintPrint"主程序調(diào)用前的變量值a,b,c:";a;b;cCallproc(a,b,c)′實(shí)參量不變PrintPrint"主程序調(diào)用后的變量值a,b,c:";a;b;cEndSubSubproc(ByValaAsInteger,ByValbAsInteger,_ByValcAsInteger)PrintPrint"子程序中運(yùn)算前的變量值a,b,c:";a;b;ca=6:b=8:c=a*bPrintPrint"子程序中運(yùn)算后的變量值a,b,c:";a;b;cEndSub【例6.7】在例6.3求兩個數(shù)最大公約數(shù)的基礎(chǔ)上,使用傳值調(diào)用Function過程,求兩個整數(shù)的最大公約數(shù)和最小公倍數(shù)。
1.設(shè)計(jì)用戶界面如下:
傳值參數(shù)示例
PrivateSubCmdjs_Click()DimtempAsStringDimmAsInteger,nAsIntegerm=Val(InputBox("請輸入第一個整數(shù):"))n=Val(InputBox("請輸入第二個整數(shù):"))Ifn*m=0ThenExitSubLblgys.Caption=m&","&n&"的最大公約數(shù)是:"&Str(gcd((m),(n)))Lblgbs.Caption=m&","&n&"的最小公倍數(shù)是:"&_Str(m*n/gcd((m),(n)))EndSub2.編寫事件代碼。
m、n如果不用括號括起來,結(jié)果會是什么呢?
系統(tǒng)默認(rèn)按地址傳遞參數(shù),或者定義過程時選用ByRef關(guān)鍵字。傳址參數(shù)就是讓過程根據(jù)變量的內(nèi)存地址去訪問實(shí)際變量的內(nèi)容,即形式參數(shù)和實(shí)際參數(shù)使用相同的內(nèi)存地址單元,這樣通過子過程可以改變變量本身的值。傳址參數(shù)對應(yīng)的實(shí)參必須也是變量,否則無法達(dá)到傳址。常量和表達(dá)式無法傳址。2.傳址參數(shù)【例6.8】運(yùn)行一個程序,理解按址傳遞參數(shù)的含義。PrivateSubForm_Click()DimaAsInteger,bAsInteger,cAsIntegera=5:b=3:c=9ClsPrintPrint"主程序調(diào)用前的變量值a,b,c:";a;b;cCallproc(a,b,c)'實(shí)參量發(fā)生變化PrintPrint"主程序調(diào)用后的變量值a,b,c:";a;b;cEndSubSubproc(aAsInteger,bAsInteger,cAsInteger)
'按地址傳遞PrintPrint"子程序中運(yùn)算前的變量值a,b,c:";a;b;ca=6:b=8:c=a*bPrintPrint"子程序中運(yùn)算后的變量值a,b,c:";a;b;cEndSub
在使用通用過程時,可以將數(shù)組或數(shù)組元素作為參數(shù)進(jìn)行傳遞。在傳送數(shù)組時,除遵守參數(shù)傳送的一般規(guī)則外,還應(yīng)注意以下兩點(diǎn):
傳遞整個數(shù)組時,應(yīng)將數(shù)組名分別放入實(shí)參表和形參表中,并略去數(shù)組的上下界,但括號不能省。如:
Calltest(arr())如果不需要把整個數(shù)組傳送給過程,而是傳遞數(shù)組中的某一元素,則需要在數(shù)組名后面的括號中寫上指定元素的下標(biāo)。如:Calltest(arr(1))6.3.3數(shù)組參數(shù)的傳遞【例6.9】編寫ArrayReverse子程序?qū)?shù)組反向。PrivateSubarrayreverse(a()AsInteger)DimiAsInteger,lAsInteger,uAsInteger,_tempAsInteger
l=LBound(a)′給出數(shù)組的最小下標(biāo)值
u=UBound(a)′給出數(shù)組的最大下標(biāo)值
Fori=1To(u-l+1)\2temp=a(i)a(i)=a(u-i+1)a(u-i+1)=tempNextiEndSub
編寫數(shù)組反向通用過程代碼如下:從數(shù)組頭尾開始把對應(yīng)的元素互換。
調(diào)用數(shù)組反向事件過程代碼如下:PrivateSubForm_click()Dimarr1(1To10)AsIntegerDimiAsIntegerFori=1To10'給數(shù)組賦值
arr1(i)=iNextiPrint"顯示原數(shù)組:"Fori=1To10Printarr1(i);Nextiarrayreversearr1()'調(diào)用數(shù)組反向函數(shù)
PrintPrintPrint"顯示逆序數(shù)組:"Fori=1To10Printarr1(i);
NextiEndSub1.可變參數(shù)
在前面的例子中,一個過程中的形參是固定的,調(diào)用時提供的實(shí)參也是固定的。但在VisualBasic中,可以指定一個或多個參數(shù)作為可選參數(shù)。6.3.4可選參數(shù)和可變參數(shù)
為了定義帶可選參數(shù)的過程,必須在參數(shù)表中使用Optional關(guān)鍵字,并在過程體中通過IsMissing函數(shù)測試調(diào)用時是否傳送可選參數(shù)。IsMissing函數(shù)有一個參數(shù),它是由Optional指定的形參的名字,其返回值為Boolean類型,在調(diào)用過程時,如果沒有向這個可選參數(shù)傳送實(shí)參,則IsMissing函數(shù)的返回值為True,否則返回False?!纠?.10】定義一個可選參數(shù)過程,用可選參數(shù)實(shí)現(xiàn)對兩個數(shù)或三個數(shù)求和。分析:因?yàn)閰?shù)個數(shù)不定,可以用可選參數(shù)解決這個問題。其過程代碼如下:
SubAdd(FirAsInteger,SecAsInteger,OptionalThird) n=Fir+Sec IfNotIsMissing(Third)Then n=n+Third EndIf Printn EndSub可選參數(shù)實(shí)例2.可變參數(shù)
如果參數(shù)個數(shù)為任意個,可使用可變參數(shù)來實(shí)現(xiàn)。6.3.4可選參數(shù)和可變參數(shù)
一般格式為:
Sub過程名(ParamArray數(shù)組名)
說明:這里的“數(shù)組名”是一個形參。只有名字和括號,沒有上下界。由于省略了變量類型,“數(shù)組”的類型默認(rèn)為變體類型?!纠?.11】定義一個可變參數(shù)過程,用這個過程可以求任意多個數(shù)的和。分析:定義一個可變參數(shù)過程,用于求任意個數(shù)的和。
SubAdd(ParamArrayNumbers()) Sum=0 ForEachxInNumbers Sum=Sum+x Nextx PrintSum EndSub可變參數(shù)實(shí)例
在VisualBasic中,過程的形式參數(shù)不僅可以是變量,還可以是對象,即窗體或控件。在定義過程的形參時,如果用“AsForm”聲明,則表示該形參是一個窗體。如果用“AsControl”聲明,則表示該形參是一個控件。6.3.5對象參數(shù)【例6.12】設(shè)計(jì)一個包含三個窗體的程序,這些窗體按照窗體號依次循環(huán)顯示,直到關(guān)閉窗體為止。分析:三個窗體在大小、位置上都相同,因此可以設(shè)計(jì)一個子過程,用以初始化各窗體的屬性,包括Left、Top、Width和Height。這個子過程的代碼是:SubFormSet(FormNumAsForm)FormNum.Left=2000FormNum.Top=3000FormNum.Width=5000FormNum.Height=3000EndSub對Form1編寫如下的事件過程:
PrivateSubForm_Load() FormSetForm1 FormSetForm2 FormSetForm3EndSub
對3個窗體分別編寫如下的事件過程:
PrivateSubForm_Click() Form1.Hide′隱藏窗體Form1 Form2.Show′顯示窗體Form2 EndSub PrivateSubForm_Click() Form2.Hide′隱藏窗體Form2 Form3.Show′顯示窗體Form3 EndSub PrivateSubForm_Click() Form3.Hide′隱藏窗體Form3 Form1.Show′顯示窗體Form1 EndSub
6.4過程和變量的作用域
VB應(yīng)用程序的結(jié)構(gòu)為:
通用過程可以出現(xiàn)在窗體模塊、標(biāo)準(zhǔn)模塊中。在每個模塊和過程中都可以定義和使用變量,每個過程和變量都有自己的適用范圍。
過程可被訪問的范圍稱為過程的作用域。它隨所定義語句的不同而不同。按過程的作用范圍來劃分,過程可分為:模塊級過程和全局級過程。
模塊級過程:在某個窗體或標(biāo)準(zhǔn)模塊中定義的過程前加上Private關(guān)鍵字,則該過程只能被包含過程的窗體或標(biāo)準(zhǔn)模塊中的過程調(diào)用。
全局級:在某個窗體或標(biāo)準(zhǔn)模塊中定義的過程前加上Pulbic關(guān)鍵字或缺省,則該過程為全局級過程,可以被應(yīng)用程序的所有窗體或標(biāo)準(zhǔn)模塊中的過程調(diào)用。
6.4.1過程的作用域
其調(diào)用方式根據(jù)過程所處的位置有如下兩種:
1)在窗體中定義的過程,當(dāng)外部過程要調(diào)用時,應(yīng)在被調(diào)用的過程名前加上所處的窗體名。
2)在標(biāo)準(zhǔn)模塊中定義的過程,如果過程名唯一,則任何外部過程都可以直接調(diào)用,否則應(yīng)在被調(diào)用的過程名前加上所處的標(biāo)準(zhǔn)模塊名。1.局部變量(動態(tài)變量)在一個過程內(nèi)部使用Dim或Static關(guān)鍵字聲明的變量。局部變量是只能在一個函數(shù)或過程中訪問的變量,其他過程或函數(shù)不能訪問此變量的數(shù)據(jù)。2.窗體/模塊級變量窗體/模塊級變量是指在一個窗體/模塊的任何過程之外,即在“通用聲明”段中用Dim或Private語句聲明的變量。其作用域是整個窗體和模塊。6.4.2變量的作用域3.全局變量全局變量是指在一個窗體/模塊的任何過程之外聲明的變量,即在“通用聲明”段中用Public語句聲明的變量。它的作用范圍是整個應(yīng)用程序。調(diào)用窗體模塊定義的全局變量,應(yīng)加上窗體名,在標(biāo)準(zhǔn)模塊中定義的全局,如果名字唯一,則直接調(diào)用?!纠?.13】在以下程序定義三種級別的同名變量x,單擊命令按鈕分析程序運(yùn)行的結(jié)果。
本應(yīng)用程序由一個標(biāo)準(zhǔn)模塊和一個窗體模塊組成,界面設(shè)計(jì)如圖所示。
變量的作用域示例
標(biāo)準(zhǔn)模塊代碼如下:OptionExplicitPublicxAsInteger窗體模塊代碼如下:OptionExplicitPrivatexAsIntegerPrivateSubCommand1_Click()DimxAsIntegerx=x+1Text1.Text=xModule1.x=Module1.x+3Text3.Text=Module1.xEndSub
程序代碼如下:PrivateSubCommand2_Click()x=x+1Text2.Text=xModule1.x=Module1.x+5Text3.Text=Module1.xEndSub
除作用域外,變量還有存活期,在這一期間變量能夠保持它們的值。局部變量只在過程運(yùn)行時有效,過程結(jié)束變量所占據(jù)的內(nèi)存也被釋放。靜態(tài)變量在過程結(jié)束后仍保留變量的值,即其占用的內(nèi)存單元未釋放。靜態(tài)變量的定義:
Static<變量名>[As<類型>]
或StaticSub/Function<過程名>([<參數(shù)列表>])6.4.3靜態(tài)變量【例6.14】下面程序,用變量n記錄單擊窗體的次數(shù)。PrivateSubForm_Click()StaticnAsIntegern=n+1Print"已單擊的次數(shù):";n&"次"EndSub
6.5過程的嵌套與遞歸調(diào)用
VB在定義過程時,不能嵌套定義過程,但可以嵌套地調(diào)用過程,即被主程序調(diào)用的過程還可以調(diào)用另外的過程,這種程序結(jié)構(gòu)稱為過程的嵌套。例如:6.5.1過程的嵌套
在一個過程(Sub過程或Function過程)中調(diào)用另外一個過程,這稱為過程的嵌套調(diào)用,而過程直接或間接地調(diào)用自身,則稱為過程的遞歸調(diào)用。【例6.15】輸入?yún)?shù)n和m,求組合數(shù)的值。
過程嵌套示例
分析:把求階乘與求組合數(shù)公式分別定義為Function過程。求組合數(shù)用一個過程Comb來實(shí)現(xiàn),而求n!的工作則由過程Fact來實(shí)現(xiàn)。在Comb過程中需要多次調(diào)用Fact過程,這就是過程的嵌套調(diào)用。PrivateFunctionFact(x)AsLongDimpAsLong,iAsIntegerp=1Fori=1Toxp=p*iNextFact=pEndFunctionPrivateFunctionComb(n,m)Comb=Fact(n)/(Fact(m)*Fact(n-m))EndFunctionPrivateSubCmdjs_Click()DimmAsInteger,nAsIntegerm=Val(Txtm.Text)n=Val(Txtn.Text)Ifm>nThenMsgBox"參數(shù)輸入時必須符合n≥m!"ExitSubEndIfLblouput.Caption=Comb(n,m)EndSub過程中又調(diào)用其它過程
過程的遞歸調(diào)用是指一個過程直接或間接地調(diào)用自身。當(dāng)一個問題可以基于更小規(guī)模的同類問題求解,而最小規(guī)模的問題可以直接求解,則這個問題可以用過程的遞歸調(diào)用解決。例如,階乘、級數(shù)運(yùn)算、冪指數(shù)運(yùn)算都是可以借助過程的遞歸調(diào)用求解。6.5.2過程的遞歸【例6.16】利用遞歸調(diào)用,計(jì)算n!。
分析:0的階乘規(guī)定為1,正整數(shù)都有其階乘,定義為n×(n-1)×(n-2)×…×2×1。因此,正整數(shù)n的階乘可用下式定義。PrivateSubCommand1_Click()DimnAsIntegern=Val(Txtn.Text)Ifn>0Andn<=20ThenLbloutput.Caption=n&"的階乘為"&fact(n)ElseMsgBox"數(shù)據(jù)輸入超出范圍!"Txtn=""Txtn.SetFocusExitSubEndIfEndSubStaticFunctionfact(nAsInteger)AsDouble
'Function過程fact的程序代碼
Ifn>0Thenfact=n*fact(n-1)Elsefact=1EndIfEndFunction6.6常用算法舉例
【例6.17】判斷一個數(shù)是否是回文數(shù)。分析:所謂回文數(shù)是指順讀和倒讀這個數(shù)都相同。我們把輸入的正整數(shù)看成一個數(shù)字串,從兩頭到中間逐一比較,如果都相同就是回文數(shù),有一個不相同就不是。判斷一個數(shù)是否是回文數(shù)的子過程代碼:PublicSubhw(ByValnAsLong,flagAsBoolean)DimsAsString,iAsIntegerflag=True'flag為回文數(shù)標(biāo)志,為真是回文數(shù),為假不是
s=Trim(Str(n))Fori=1ToInt(Len(s)/2)IfMid(s,i,1)<>Mid(s,Len(s)-i+1,1)Thenflag=FalseExitForEndIfNextiEnd命令按鈕Cmdpd的單擊事件代碼:PrivateSubcmdpd_Click()DimxAsLong,ishwAsBooleanx=Val(Txtx.Text)Callhw(x,ishw)IfishwThenlbloutput.Caption=x&"是回文數(shù)"Elselbloutput.Caption=x&"不是回文數(shù)"EndIfEndSub命令按鈕Cmdclear的單擊事件代碼:PrivateSubCmdclear_Click()Txtx=""lbloutput=""Txtx.SetFocusEndSub【例6.18】顯示100以內(nèi)的所有素?cái)?shù),并計(jì)算這些素?cái)?shù)的和。分析:素?cái)?shù)是指只能被1和它本身整除的數(shù)。我們可以編寫一個函數(shù)過程Isprime判斷一個數(shù)是否是素?cái)?shù),然后對100以內(nèi)的數(shù)反復(fù)調(diào)用Isprime函數(shù)來判斷該數(shù)是否為素?cái)?shù),如果是則顯示出來,并把這些素?cái)?shù)累加起來,最后輸出它們的和。判斷一個數(shù)是否是素?cái)?shù)的函數(shù)過程代碼:PublicFunctionisprime(xAsInteger)AsBooleanDimflagAsBooleanDimiAsIntegerflag=True'flag為標(biāo)志變量,為真是素?cái)?shù),為假不是
Fori=2Tox-1IfxModi=0Thenflag=FalseExitForEndIfNextiisprime=flagEndFunction命令按鈕Cmddisp的單擊事件代碼:PrivateSubCmddisp_Click()DimiAsInteger,sAsInteger,nAsIntegers=0:n=0's用來表示素?cái)?shù)的和,n用來記錄素?cái)?shù)的個數(shù)
Fori=2To99Ifisprime(i)Thenn=n+1Picdisp.Printi;
'每行輸出10個素?cái)?shù)
IfnMod10=0ThenPicdisp.Prints=s+iEndIfNextiPicdisp.PrintPicdisp.PrintPicdisp.PrintTab(8);"100以內(nèi)素?cái)?shù)的和為:";sEndSub【例6.19】生成10個100以內(nèi)互不相等的隨機(jī)整數(shù),并求出其中的最小值。分析:編寫一個函數(shù)過程產(chǎn)生10個互不相等的隨機(jī)整數(shù)并存入數(shù)組,再編寫一個函數(shù)過程求數(shù)組中的最小值,即可把這一問題解決。
考慮到要在不同的過程中使用數(shù)組,所以首先在模塊的通用段聲明數(shù)組:Dima(1To10)AsInteger產(chǎn)生一個隨機(jī)數(shù)組并將數(shù)組中10個數(shù)組元素連成一個字符串的函數(shù)過程代碼:PublicFunctionSjs(p()AsInteger)AsStringDimTemp
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年全球及中國超微細(xì)合金線材行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國低浴比氣液染色機(jī)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025-2030全球汽車油漆測厚儀行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025年全球及中國眼內(nèi)液體填充物行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國初創(chuàng)企業(yè)媒體服務(wù)平臺行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025-2030全球知識產(chǎn)權(quán)審計(jì)服務(wù)行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025-2030全球設(shè)備用墊圈和密封材料行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025-2030全球微膠囊脂質(zhì)粉行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025年全球及中國車規(guī)級數(shù)字功放電感行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025-2030全球螺旋繞線機(jī)行業(yè)調(diào)研及趨勢分析報(bào)告
- 第二章《有理數(shù)的運(yùn)算》單元備課教學(xué)實(shí)錄2024-2025學(xué)年人教版數(shù)學(xué)七年級上冊
- DB31-T 596-2021 城市軌道交通合理通風(fēng)技術(shù)管理要求
- 華為智慧園區(qū)解決方案介紹
- 2022年江西省公務(wù)員錄用考試《申論》真題(縣鄉(xiāng)卷)及答案解析
- 人教版八年級英語上冊期末專項(xiàng)復(fù)習(xí)-完形填空和閱讀理解(含答案)
- 一例蛇串瘡患者個案護(hù)理課件
- 低壓電工理論考試題庫低壓電工考試題
- 國家電網(wǎng)培訓(xùn)課件
- 五年級上冊口算練習(xí)400題及答案
- 駱駝祥子選擇題100道及答案
- 2024年公務(wù)員考試題庫附答案【完整版】
評論
0/150
提交評論