過程調用與參數傳遞_第1頁
過程調用與參數傳遞_第2頁
過程調用與參數傳遞_第3頁
過程調用與參數傳遞_第4頁
過程調用與參數傳遞_第5頁
已閱讀5頁,還剩45頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

關于過程調用與參數傳遞知識要點1、過程的基本概念2、sub過程定義格式定義方法窗體事件的執行順序3、Function過程(定義格式、定義方法)第2頁,共50頁,星期六,2024年,5月7.3過程調用7.3.1事件過程的調用7.3.2調用Sub過程7.3.3調用Function過程7.3.4調用其它模塊中的公有過程第3頁,共50頁,星期六,2024年,5月

事件過程由一個發生在VisualBasic中的事件來自動調用或者由同一模塊中的其它過程顯式調用。

請看示例。p1317.3.1事件過程的調用第4頁,共50頁,星期六,2024年,5月Sub過程和function過程必須在事件過程或其他過程中顯式調用,否則過程代碼就永遠不會被執行。在調用程序時,程序執行到調用某通用過程的語句后,系統就會將控制轉移到被調用的過程。在被調用的過程中,從第一條sub或function語句開始,依次執行其中的所有語句,當執行到endsub或endfunction語句后,返回到主調程序的斷點,并從斷點處繼續程序的執行。7.3.2調用Sub過程第5頁,共50頁,星期六,2024年,5月主調程序

調用過程AEndSub過程AEndSub調用Sub通用過程流程第6頁,共50頁,星期六,2024年,5月Sub子過程的調用(1)用Call語句調用Sub過程語法:Call過程名(實在參數表)

實在參數的個數、類型和順序,應該與被調用過程的形式參數相匹配,有多個參數時,用逗號分隔。如果被調用的過程是一個無參過程,則括號可以省略.第7頁,共50頁,星期六,2024年,5月PrivateSubCommand1_Click()DimaAsInteger,bAsIntegera=Val(Text1.Text):b=Val(Text2.Text)Calladd(a,b)EndSub例:PrivateSubadd(xAsInteger,yAsInteger)s=x+yText3.Text=sEndSub調用add子過程第8頁,共50頁,星期六,2024年,5月PrivateSubCommand1_Click()DimaAsInteger,bAsIntegera=Val(Text1.Text):b=Val(Text2.Text)s=a+bText3.Text=sEndSub等價于:第9頁,共50頁,星期六,2024年,5月例7-2編寫一個找出任意一個正整數的因子的程序PrivateSubCommand1_Click()DimIntaAsInteger,StAsStringInta=Text1.Text

CallFactor(Inta,St)Text2.Text=StEndSubPrivateSubFactor(ByValNAsInteger,SAsString)DimIAsIntegerForI=1ToN-1IfNModI=0ThenS=S&Str(I)NextIEndSub第10頁,共50頁,星期六,2024年,5月(2)把過程名作為一個語句來用語法:過程名[實參1[,實參2……]]它與(1)的不同點是:去掉了關鍵字call和實參列表的括號PrivateSubCommand1_Click()DimaAsInteger,bAsIntegera=Val(Text1.Text):b=Val(Text2.Text)

adda,bEndSubPrivateSubadd(xAsInteger,yAsInteger)s=x+yText3.Text=sEndSub第11頁,共50頁,星期六,2024年,5月練一練:使用第2種調用方式修改例7.2。

PrivateSubCommand1_Click()DimIntaAsInteger,StAsStringInta=Text1.TextFactorInta,StText2.Text=StEndSubPrivateSubFactor(ByValNAsInteger,SAsString)DimIAsIntegerForI=1ToN-1IfNModI=0ThenS=S&Str(I)NextIEndSub第12頁,共50頁,星期六,2024年,5月課堂練習2:編寫一個實現兩數交換的程序,要求程序中定義一個交換兩數的通用過程。PrivateSubcommand1_click()

Dima%,b%a=text1.textb=text2.textcallswap(a,b)

text1.text=atext2.text=bEndSubPrivateSubSwap(XAsInteger,YAsInteger)

DimtempAsInteger

Temp=X:X=Y:Y=TempEndSub第13頁,共50頁,星期六,2024年,5月

調用Function過程的方法與調用VisualBasic內部函數方法相同。即在表達式中寫出它的名稱和相應的實在參數:

Function過程名([實在參數表])1)調用Function過程與調用Sub過程不同,必須給參數加上括號,即使調用無參函數,括號也不能缺省;

2)VisualBasic也允許像調用Sub過程那樣調用Function過程。(即使用call語句和把函數名當作一個語句使用。)7.3.3調用Function過程第14頁,共50頁,星期六,2024年,5月例7-3編寫程序,求兩個正整數的最大公約數。PrivateSubForm_Click()DimNAsInteger,MAsInteger,GAsIntegerN=InputBox("輸入N")M=InputBox("輸入M")

G=Gcd(N,M)PrintN;"和";M;"的最大公約數是:";GEndSubPrivateFunctionGcd(ByValAAsInteger,ByValBAsInteger)AsIntegerDimRAsIntegerR=AModBDoWhileR<>0A=B:B=R:R=AModBLoopGcd=BEndFunction第15頁,共50頁,星期六,2024年,5月1.調用窗體模塊中的公有過程

CallForm1.ExamSub([實參表])2.調用標準模塊中的公有過程

CallCommonSub(實在參數)或CallModule2.CommonSub([實參表])

7.3.4調用其它模塊中的公有過程(了解)第16頁,共50頁,星期六,2024年,5月課堂練習在調用過程中,下述說明中正確的是()A)只能使用Call語句調用Sub過程B)調用Sub過程時,實在參數必須用括號括起來C)在表達式中調用Function過程時,可以不用括號把實在參數括起來D)Function過程也可用Call語句調用第17頁,共50頁,星期六,2024年,5月課堂練習在VisualBasic中,以下說法正確的是()A)過程的定義可以嵌套,但過程的調用不能嵌套B)過程的定義不可以嵌套,但過程的調用能嵌套C)過程的定義和過程的調用均可以嵌套D)過程的定義和過程的調用均不可以嵌套第18頁,共50頁,星期六,2024年,5月課堂練習在語句PublicSubSort(IAsInteger)中,I是一個按()傳遞的參數A)地址B)值C)變量D)常量第19頁,共50頁,星期六,2024年,5月7.4參數的傳遞(重點、難點)7.4.1形參與實參7.4.2按值傳遞參數7.4.3按地址傳遞參數7.4.4數組參數7.4.5對象參數第20頁,共50頁,星期六,2024年,5月

在調用一個有參數的過程時,首先進行的是“形實結合”,即按傳值傳遞或按地址傳遞方式,實現調用程序和被調用的過程之間的數據傳遞。PrivateSubcommand1_click()

Dima%,b%a=text1.textb=text2.textcallswap(a,b)

text1.text=a

text2.text=bEndSubPrivateSubSwap(XAsInteger,YAsInteger)

DimtempAsInteger

Temp=X

X=Y

Y=TempEndSub實參形參7.4.1形參與實參第21頁,共50頁,星期六,2024年,5月1.形參

出現在Sub過程和Function過程的形參表中的變量名、數組名稱之為形式參數,過程被調用之前,并未為其分配內存,其作用是用來接收傳送給子過程的數據

形參可以是:

1)除定長字符串變量之外的合法變量名;

2)后面跟有左、右圓括號(注意:不含下標)的數組名。

第22頁,共50頁,星期六,2024年,5月2.實參

實際參數是指包含在過程調用的實參表中的變量,數組等。其作用是將它們的數據(數值或地址)傳送給Sub或Function過程與其對應的形參變量。

實參可以是常量、表達式、有效的變量名、數組名組成。

如calltest(x^2,true,a,st)算術表達式第23頁,共50頁,星期六,2024年,5月

參數傳遞是按對應“位置”結合而不是按名字結合,即第一個實參與第一形參結合,第二個實參與第二個形參結合,依此類推。3、參數傳遞(虛實結合)

參數傳遞指主調過程的實參(調用時已有確定值和內存地址的參數)傳遞給被調過程的形參,參數的傳遞有兩種方式:按值傳遞、按地址傳遞。形參前加“ByVal”關鍵字的是按值傳遞,缺省或加“ByRef”關鍵字的為按地址傳遞。第24頁,共50頁,星期六,2024年,5月例:PrivateSubcommand1_click()

Dima%,b%a=text1.textb=text2.textcallswap(a,b)

text1.text=a

text2.text=bEndSubPrivateSubSwap(XAsInteger,YAsInteger)

DimtempAsInteger

Temp=X

X=Y

Y=TempEndSub實參形參第25頁,共50頁,星期六,2024年,5月

說明:(1)形參表和實參表中的對應變量名可以不必相同。Privatesubexamsub(xasinteger,yassingle)…….EndsubPrivatesubform_click()dimxasinteger,yassingle…….Callexamsub(y,x)Endsub第26頁,共50頁,星期六,2024年,5月形參實參變量變量、常數、表達式、數組元素、對象數組數組(2)形參與實參的個數必須相同,對應位置的參數類型必須一致。對應關系如下表第27頁,共50頁,星期六,2024年,5月

按值傳遞時,系統分配臨時的變量單元給形參。系統僅把實參的值復制一份,然后把這個副本再傳給形參。被調過程執行時,對形參的任何改變,都不會影響實參變量。結論:按值傳遞,形參變,相應的實參不變。7.4.2按值傳遞參數第28頁,共50頁,星期六,2024年,5月分析下列程序的值

PrivateSubCommand1_Click()DimMAsInteger,NAsIntegerM=15:N=20CallValue_Change(M,N)PrintM,NEndSubPrivateSubValue_Change(ByValXAsInteger,ByValYAsInteger)X=X+20Y=X+YPrint“X=“;X,”Y=“;YEndSub1520返回地址1520MNXY100010021004100510031520返回地址3555MNXY10001002100410051003第29頁,共50頁,星期六,2024年,5月結論:按地址傳遞參數,形參變,相應的實參也跟著變7.4.3按地址傳遞參數

按地址傳遞參數是把實參變量的地址傳給形參,即系統并不分配臨時的變量單元給形參,而是形參與實參共用同一存儲單元,因此,被調過程執行時,形參變量的任一變化,實參也相應改變。按地址傳遞參數可節省內存,執行效率高,但也可能對程序運行產生某些干擾。第30頁,共50頁,星期六,2024年,5月分析下列程序的值PrivateSubCommand1_Click()DimMAsInteger,NAsIntegerM=15:N=20

CallValue_Change(M,N)PrintM,NEndSubPrivateSubValue_Change(XAsInteger,byvalueYAsInteger)X=X+20Y=X+YPrint“X=“;X,”Y=“;YEndSubX=35y=55M=35N=20第31頁,共50頁,星期六,2024年,5月1520返回地址1000(地址)20MNXY100010021004100510033520返回地址1000(地址)55MNXY10001002100410051003第32頁,共50頁,星期六,2024年,5月PrivateSubForm_Click()DimsumAsInteger,iAsIntegerFori=5To1Step-1sum=sum+fact(i)NextiPrint"sum=";sumEndSub編寫程序計算5!+4!+3!+2!+1!的值調用函數,循環變量作為實參PublicFunctionfact(nAsInteger)AsIntegerfact=1DoWhilen>0fact=fact*nn=n-1LoopEndFunction按地址傳遞參數產生不良干擾的示例:(1)循環變量作為實參Why?如何修改?結果:120正確結果應為:153第33頁,共50頁,星期六,2024年,5月參數數據類型轉換的例子PrivateSubForm_Click()DimSasSingleS=125.5CallConvert((S),”12”+”.5”)EndSub如果為CallConvert((S),”125a”)呢?PrivateSubConvert(Inx

As

Integer,Sing

As

Single)Inx=Inx*2Sing=Sing+23Print“Inx+”;Inx,”sing=”;SingEndSub第34頁,共50頁,星期六,2024年,5月PrivateSubForm_Click()Dimv1AsInteger,v2AsInteger,v3AsIntegerv1=2:v2=3:v3=4Printv1+v2+v3*f(v1,v2,v3)EndSubPublicFunctionf(aAsInteger,bAsInteger,cAsInteger)a=a+10b=b+10c=c+10f=a+b+cEndFunction調用函數語句,實參是傳地址的。實參變量又出現在表達式中結果是571,而非161。why?(2)實參出現在表達式中第35頁,共50頁,星期六,2024年,5月

因為在print語句中,計算表達式時,優先執行函數調用。調用結束時f=39,而v1,v2,v3的值也變了,不是2,3,4而是12,13,14所以結果是:12+13+14*39=571第36頁,共50頁,星期六,2024年,5月PrivateSubForm_Click()Dimv1AsInteger,v2AsInteger,v3AsIntegerv1=2:v2=3:v3=4V4=v1+v2+v3*f(v1,v2,v3)Printv4EndSub修改成賦值語句結果為161

因為執行賦值語句時,計算右側表達式的值不是首先調用函數,而是按從左到右的順序進行的,即計算2+3+4*39第37頁,共50頁,星期六,2024年,5月如果修改成:PrivateSubForm_Click()Dimv1AsInteger,v2AsInteger,v3AsIntegerv1=2:v2=3:v3=4V4=v1+v2+v3*f((v1,v2,v3)*1.0)Printv4EndSub這是一個非整型的()也叫實型表達式

結果又是571了,因為計算實型表達式時優先調用函數第38頁,共50頁,星期六,2024年,5月

結論:函數調用的優先級是不確定的,與諸多因素有關。編程時盡量不把按地址傳遞的實參變量放在函數調用的前面,可能會使算術表達式的值難以預料。第39頁,共50頁,星期六,2024年,5月

形參數組只能是按地址傳遞的參數。對應實參必須也是數組且數據類型必須和形參數組的數據類型相一致。7.4.4數組參數第40頁,共50頁,星期六,2024年,5月對數組作形參作幾點說明:

1)如果形參數組的類型是變長字符串型,則對應的實參數組的類型也必須是變長字符串型。第41頁,共50頁,星期六,2024年,5月Privatesubform_click()Dimarray(5)asstring*8Callchangedim(array)EndsubPrivatesubchangedim(a()asstring)DimiasintegerRedimpreservea(7)Fori=1to7a(i)=iNextIEndsub形參是變長數組

錯誤:實參是定長數組第42頁,共50頁,星期六,2024年,5月Privatesubform_click()Dimarray(5)asstring*10Callchangedim(array)EndsubPrivatesubchangedim(a()asstring*8)DimiasintegerRedimpreservea(7)Fori=1to7a(i)=iNextIEndsub形參是定長數組實參也是定長數組2)如果形參數組的類型定長字符串型,則對應的實參數組的類型也必須是定長字符串型,但長度可以不同。第43頁,共50頁,星期六,2024年,5月3)調用過程時,只要把傳遞的數組名放在實參表中即可,數組名后面不跟圓括號。Privatesubform_click()Dimarray(5)asstring*8Callchangedim(array)Endsub第44頁,共50頁,星期六,2024年,5月4)在過程中不可以用dim語句對形參數組進行聲明,否則將產生“重復聲明”的錯誤,但是使用動態數組時,可以用redim語句改變形參數組的維界,重新定義數組的大小。當控制返回調用程序時,對應參數的維界也跟著發生變化。第45頁,共50頁,星期六,2024年,5月Privatesubform_click()Dimarray()asinteger,iasintegerRedimarray(5)Print“調用前數

溫馨提示

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

評論

0/150

提交評論