过程调用与参数传递.ppt
关于过程调用与参数传递现在学习的是第1页,共50页知识要点知识要点1、过程的基本概念、过程的基本概念2、sub过程过程定义格式定义格式定义方法定义方法窗体事件的执行顺序窗体事件的执行顺序3、Function过程(定义格式、定义方过程(定义格式、定义方法)法)现在学习的是第2页,共50页7.3 7.3 过程调用过程调用7.3.1 7.3.1 事件过程的调用事件过程的调用7.3.2 7.3.2 调用调用SubSub过程过程7.3.3 7.3.3 调用调用FunctionFunction过程过程7.3.4 7.3.4 调用其它模块中的公有过程调用其它模块中的公有过程 现在学习的是第3页,共50页 事件过程由一个发生在事件过程由一个发生在Visual BasicVisual Basic中的事件来中的事件来自动调用或者由同一模块中的其它过程显式调自动调用或者由同一模块中的其它过程显式调用。用。请看示例。请看示例。p131p1317.3.1 7.3.1 事件过程的调用事件过程的调用现在学习的是第4页,共50页 Sub Sub过程和过程和functionfunction过程必须在事件过程或其他过程过程必须在事件过程或其他过程中中显式调用显式调用,否则过程代码就永远不会被执行。,否则过程代码就永远不会被执行。在调用程序时,程序执行到调用某通用过程的语句在调用程序时,程序执行到调用某通用过程的语句后,后,系统就会将控制转移到被调用的过程。系统就会将控制转移到被调用的过程。在被调用在被调用的过程中,的过程中,从第一条从第一条subsub或或functionfunction语句开始语句开始,依次执行,依次执行其中的所有语句,其中的所有语句,当执行到当执行到end subend sub或或end functionend function语语句后句后,返回到主调程序的断点返回到主调程序的断点,并,并从断点处继续从断点处继续程序的程序的执行。执行。7.3.2 7.3.2 调用调用SubSub过程过程现在学习的是第5页,共50页主调程序主调程序 调用过程调用过程AEnd Sub过程过程AEnd Sub调用调用SubSub通用过程流程通用过程流程现在学习的是第6页,共50页Sub子过程的调用子过程的调用(1)用用Call语句语句调用调用Sub过程过程 语法:语法:Call 过程名(实在参数表)过程名(实在参数表)实在参数的实在参数的个数个数、类型类型和和顺序顺序,应该与被调,应该与被调用过程的形式参数相匹配,有多个参数时,用用过程的形式参数相匹配,有多个参数时,用逗号分隔。如果被调用的过程是一个无参过程,逗号分隔。如果被调用的过程是一个无参过程,则括号可以省略则括号可以省略.现在学习的是第7页,共50页Private Sub Command1_Click()Dim a As Integer,b As Integer a=Val(Text1.Text):b=Val(Text2.Text)Call add(a,b)End Sub例:例:Private Sub add(x As Integer,y As Integer)s=x+y Text3.Text=sEnd Sub调用调用add子过程子过程现在学习的是第8页,共50页Private Sub Command1_Click()Dim a As Integer,b As Integer a=Val(Text1.Text):b=Val(Text2.Text)s=a+b Text3.Text=sEnd Sub等价于:等价于:现在学习的是第9页,共50页例7-2编写一个找出任意一个正整数的因子的程序编写一个找出任意一个正整数的因子的程序Private Sub Command1_Click()Dim Inta As Integer,St As String Inta=Text1.Text Call Factor(Inta,St)Text2.Text=StEnd SubPrivate Sub Factor(ByVal N As Integer,S As String)Dim I As Integer For I=1 To N-1 If N Mod I=0 Then S=S&Str(I)Next IEnd Sub现在学习的是第10页,共50页(2)把)把过程名作为一个语句过程名作为一个语句来用来用语法:过程名语法:过程名 实参实参1,实参,实参2它与(它与(1)的不同点是:)的不同点是:去掉了关键字去掉了关键字call和和实参列表的实参列表的括号括号Private Sub Command1_Click()Dim a As Integer,b As Integer a=Val(Text1.Text):b=Val(Text2.Text)add a,bEnd SubPrivate Sub add(x As Integer,y As Integer)s=x+y Text3.Text=sEnd Sub现在学习的是第11页,共50页练一练练一练:使用第使用第2种调用方式修改例种调用方式修改例7.2。Private Sub Command1_Click()Dim Inta As Integer,St As String Inta=Text1.Text Factor Inta,St Text2.Text=StEnd SubPrivate Sub Factor(ByVal N As Integer,S As String)Dim I As Integer For I=1 To N-1 If N Mod I=0 Then S=S&Str(I)Next IEnd Sub现在学习的是第12页,共50页课堂练习课堂练习2:编写一个实现两数交换的程序,要求程序:编写一个实现两数交换的程序,要求程序中定义一个交换两数的通用过程。中定义一个交换两数的通用过程。Private Sub command1_click()Dim a%,b%a=text1.text b=text2.text call swap(a,b)text1.text=a text2.text=bEnd SubPrivate Sub Swap(X As Integer,Y As Integer)Dim temp As Integer Temp=X:X=Y:Y=TempEnd Sub现在学习的是第13页,共50页 调调用用FunctionFunction过过程程的的方方法法与与调调用用Visual Visual BasicBasic内内部部函函数数方方法法相相同同。即即在在表表达达式式中中写写出出它它的的名名称称和和相相应应的实在参数:的实在参数:Function Function 过程名过程名(实在参数表实在参数表)1)1)调调用用FunctionFunction过过程程与与调调用用SubSub过过程程不不同同,必必须须给给参参数数加上括号,即使调用无参函数,加上括号,即使调用无参函数,括号也不能缺省括号也不能缺省;2)2)Visual BasicVisual Basic也允许像调用也允许像调用SubSub过程那样调用过程那样调用FunctionFunction过程。过程。(即使用即使用callcall语句和把函数名当作一个语句语句和把函数名当作一个语句使用。使用。)7.3.3 7.3.3 调用调用FunctionFunction过程过程现在学习的是第14页,共50页例例7-3 编写程序,求两个正整数的最大公约数。编写程序,求两个正整数的最大公约数。Private Sub Form_Click()Dim N As Integer,M As Integer,G As Integer N=InputBox(输入N)M=InputBox(输入M)G=Gcd(N,M)Print N;和;M;的最大公约数是:;GEnd SubPrivate Function Gcd(ByVal A As Integer,ByVal B As Integer)As Integer Dim R As Integer R=A Mod B Do While R 0 A=B:B=R:R=A Mod B Loop Gcd=BEnd Function现在学习的是第15页,共50页1.1.调用调用窗体窗体模块中的模块中的公有公有过程过程 Call Form1.ExamSubCall Form1.ExamSub(实参表实参表)2 2调用调用标准标准模块中的模块中的公有公有过程过程 Call CommonSub Call CommonSub(实在参数实在参数)或或 Call Module2.CommonSub(Call Module2.CommonSub(实实参表参表)7.3.4 7.3.4 调用其它模块中的公有过程调用其它模块中的公有过程(了解了解)现在学习的是第16页,共50页课堂练习课堂练习在调用过程中,下述说明中正确的是()A A)只能使用)只能使用CallCall语句调用语句调用SubSub过程过程B B)调用)调用SubSub过程时,实在参数必须用括号括起来过程时,实在参数必须用括号括起来CC)在表达式中调用)在表达式中调用FunctionFunction过程时,过程时,可以不用括号把实在参数括起来可以不用括号把实在参数括起来D D)FunctionFunction过程也可用过程也可用CallCall语句调用语句调用现在学习的是第17页,共50页课堂练习课堂练习在Visual Basic中,以下说法正确的是()A A)过程的定义可以嵌套,但过程的调用不能嵌套)过程的定义可以嵌套,但过程的调用不能嵌套B B)过程的定义不可以嵌套,但过程的调用能嵌套)过程的定义不可以嵌套,但过程的调用能嵌套CC)过程的定义和过程的调用均可以嵌套)过程的定义和过程的调用均可以嵌套D D)过程的定义和过程的调用均不可以嵌套)过程的定义和过程的调用均不可以嵌套现在学习的是第18页,共50页课堂练习课堂练习在语句Public Sub Sort(I As Integer)中,I是一个按()传递的参数A A)地址)地址B B)值)值CC)变量)变量D D)常量)常量现在学习的是第19页,共50页7.4 7.4 参数的传递参数的传递(重点、难点重点、难点)7.4.1 7.4.1 形参与实参形参与实参7.4.2 7.4.2 按值传递参数按值传递参数7.4.3 7.4.3 按地址传递参数按地址传递参数7.4.4 7.4.4 数组参数数组参数7.4.5 7.4.5 对象参数对象参数现在学习的是第20页,共50页 在调用一个有参数的过程时在调用一个有参数的过程时,首先进行的是首先进行的是“形实结形实结合合”,即按传值传递或按地址传递方式,实现调用程序,即按传值传递或按地址传递方式,实现调用程序和被调用的过程之间的数据传递。和被调用的过程之间的数据传递。Private Sub command1_click()Dim a%,b%a=text1.text b=text2.text call swap(a,b)text1.text=a text2.text=bEnd SubPrivate Sub Swap(X As Integer,Y As Integer)Dim temp As Integer Temp=X X=Y Y=TempEnd Sub实参实参形参形参7.4.1 7.4.1 形参与实参形参与实参现在学习的是第21页,共50页1.1.形参形参 出出现现在在SubSub过过程程和和FunctionFunction过过程程的的形形参参表表中中的的变变量量名名、数数组组名名称称之之为为形形式式参参数数,过过程程被被调调用用之之前前,并并未未为为其其分分配配内存内存,其作用是,其作用是用来接收传送给子过程的数据用来接收传送给子过程的数据 形参可以是:形参可以是:1)1)除定长字符串变量之外的合法变量名;除定长字符串变量之外的合法变量名;2)2)后后面面跟跟有有左左、右右圆圆括括号号(注注意意:不不含含下下标标)的的数数组名。组名。现在学习的是第22页,共50页2.2.实参实参 实实际际参参数数是是指指包包含含在在过过程程调调用用的的实实参参表表中中的的变变量量,数数组组等等。其其作作用用是是将将它它们们的的数数据据(数数值值或或地地址址)传传送送给给Sub或或Function过程与其对应的形参变量。过程与其对应的形参变量。实实参参可可以以是是常常量量、表表达达式式、有有效效的的变变量量名名、数数组组名名组成。组成。如如call test(x2,true,a,st)算术表达式算术表达式现在学习的是第23页,共50页 参数传递是按对应参数传递是按对应“位置位置”结合而不是按名字结合,即第一结合而不是按名字结合,即第一个实参与第一形参结合,第二个实参与第二个形参结合,依此个实参与第一形参结合,第二个实参与第二个形参结合,依此类推。类推。3 3、参数传递(虚实结合)、参数传递(虚实结合)参数传递指主调过程的实参(调用时参数传递指主调过程的实参(调用时已有确定值和内存地已有确定值和内存地址的参数址的参数)传递给被调过程的形参,参数的传递有两种方式:)传递给被调过程的形参,参数的传递有两种方式:按值传递、按地址传递。形参前加按值传递、按地址传递。形参前加“ByVal”关键字的是按关键字的是按值值传递传递,缺省缺省或加或加“ByRef”关键字的为按关键字的为按地址传递地址传递。现在学习的是第24页,共50页例:例:Private Sub command1_click()Dim a%,b%a=text1.text b=text2.text call swap(a,b)text1.text=a text2.text=bEnd SubPrivate Sub Swap(X As Integer,Y As Integer)Dim temp As Integer Temp=X X=Y Y=TempEnd Sub实参实参形参形参现在学习的是第25页,共50页 说明:(说明:(1 1)形参表和实参表中的对应变量名可以不必相)形参表和实参表中的对应变量名可以不必相同。同。Private sub examsub(x as integer,y as single).End subPrivate sub form_click()dim x as integer,y as single .Call examsub(y,x)End sub现在学习的是第26页,共50页形形 参参 实实 参参变量变量 变量、常数、表达式、数组元素、对象变量、常数、表达式、数组元素、对象数组数组 数组数组(2 2)形参与实参的个数必须相同,对应位置的参数类)形参与实参的个数必须相同,对应位置的参数类型必须一致。对应关系如下表型必须一致。对应关系如下表现在学习的是第27页,共50页 按按值值传递时,系统分配临时的变量单元给形参。系传递时,系统分配临时的变量单元给形参。系统仅把实参的值复制一份,然后把这个统仅把实参的值复制一份,然后把这个副本副本再传给形再传给形参。参。被调过程执行时,对形参的任何改变,都不会影响实参被调过程执行时,对形参的任何改变,都不会影响实参变量。变量。结论:按值传递,形参变,相应的实参不变。结论:按值传递,形参变,相应的实参不变。7.4.2 7.4.2 按按值值传递参数传递参数现在学习的是第28页,共50页分析下列程序的值 Private Sub Command1_Click()Dim M As Integer,N As Integer M=15:N=20 Call Value_Change(M,N)Print M,NEnd SubPrivate Sub Value_Change(ByVal X As Integer,ByVal Y As Integer)X=X+20 Y=X+Y Print“X=“;X,”Y=“;Y End Sub1520返回地址返回地址1520MNXY100010021004100510031520返回地址返回地址3555MNXY10001002100410051003现在学习的是第29页,共50页结论:按地址传递参数,形参变,相应的实参结论:按地址传递参数,形参变,相应的实参也跟着变也跟着变7.4.3 7.4.3 按按地址地址传递参数传递参数 按按地址地址传递参数是把实参变量的传递参数是把实参变量的地址地址传给形参,传给形参,即系统并不分配临时的变量单元给形参,而是即系统并不分配临时的变量单元给形参,而是形参与实形参与实参共用同一存储单元参共用同一存储单元,因此,被调过程执行时,形参变,因此,被调过程执行时,形参变量的任一变化,实参也相应改变。量的任一变化,实参也相应改变。按按地址地址传递参数可节省内存,执行效率高,但也可传递参数可节省内存,执行效率高,但也可能对程序运行产生某些干扰。能对程序运行产生某些干扰。现在学习的是第30页,共50页分析下列程序的值分析下列程序的值 Private Sub Command1_Click()Dim M As Integer,N As Integer M=15:N=20 Call Value_Change(M,N)Print M,N End Sub Private Sub Value_Change(X As Integer,by value Y As Integer)X=X+20 Y=X+Y Print“X=“;X,”Y=“;Y End SubX=35 y=55M=35 N=20现在学习的是第31页,共50页1520返回地址返回地址1000(地址地址)20MNXY100010021004100510033520返回地址返回地址1000(地址(地址)55MNXY10001002100410051003现在学习的是第32页,共50页Private Sub Form_Click()Dim sum As Integer,i As Integer For i=5 To 1 Step-1 sum=sum+fact(i)Next i Print sum=;sumEnd Sub编写程序计算编写程序计算5!+4!+3!+2!+1!的值的值调用函数,循环变调用函数,循环变量作为实参量作为实参Public Function fact(n As Integer)As Integer fact=1 Do While n 0 fact=fact*n n=n-1 LoopEnd Function按地址传递参数产生不良干扰的示例:按地址传递参数产生不良干扰的示例:(1)循环变量循环变量作为实参作为实参Why?如何修改?如何修改?结果:结果:120120正确结果应为:正确结果应为:153153现在学习的是第33页,共50页参数数据类型转换的例子Private SubPrivate Sub Form_Click()Form_Click()Dim S as Single Dim S as Single S=125.5 S=125.5 Call Convert(S),”12”+”.5”)Call Convert(S),”12”+”.5”)End SubEnd Sub如果为如果为Call Convert(S),”125a”)Call Convert(S),”125a”)呢?呢?Private Sub Convert(Inx As Integer,Sing As Single)Inx=Inx*2 Sing=Sing+23 Print“Inx+”;Inx,”sing=”;SingEnd Sub现在学习的是第34页,共50页Private Sub Form_Click()Dim v1 As Integer,v2 As Integer,v3 As Integer v1=2:v2=3:v3=4 Print v1+v2+v3*f(v1,v2,v3)End SubPublic Function f(a As Integer,b As Integer,c As Integer)a=a+10 b=b+10 c=c+10 f=a+b+cEnd Function调用函数语句,调用函数语句,实参是传地址实参是传地址的。的。实参变量又出现在实参变量又出现在表达式中表达式中结果是结果是571571,而非,而非161161。why?why?(2)实参出现在表达式中)实参出现在表达式中现在学习的是第35页,共50页 因为因为在在print语句中语句中,计算表达式时,计算表达式时,优优先执行函数调用先执行函数调用。调用结束时。调用结束时f=39,而,而v1,v2,v3的值也变了,的值也变了,不是不是2,3,4 而是而是 12,13,14所以结果是:所以结果是:12+13+14*39=571现在学习的是第36页,共50页Private Sub Form_Click()Dim v1 As Integer,v2 As Integer,v3 As Integer v1=2:v2=3:v3=4 V4=v1+v2+v3*f(v1,v2,v3)Print v4End Sub修改成赋值语句修改成赋值语句结果为结果为161 因为因为执行赋值语句执行赋值语句时,计算右侧表达式的值不是首先调时,计算右侧表达式的值不是首先调用函数,而是用函数,而是按从左到右的顺序按从左到右的顺序进行的,即计算进行的,即计算2+3+4*39现在学习的是第37页,共50页如果修改成如果修改成:Private Sub Form_Click()Dim v1 As Integer,v2 As Integer,v3 As Integer v1=2:v2=3:v3=4 V4=v1+v2+v3*f(v1,v2,v3)*1.0)Print v4End Sub这是一个非整型的这是一个非整型的()也也叫实型表达式叫实型表达式 结果又是结果又是571了,因为了,因为计算实型表达式时优先调用函数计算实型表达式时优先调用函数现在学习的是第38页,共50页 结论结论:函数调用的优先级是不确定的,函数调用的优先级是不确定的,与诸多因素有关。编程时尽量不把按地址传与诸多因素有关。编程时尽量不把按地址传递的实参变量放在函数调用的前面,可能会递的实参变量放在函数调用的前面,可能会使算术表达式的值难以预料。使算术表达式的值难以预料。现在学习的是第39页,共50页 形参数组形参数组只能是按只能是按地址地址传递的参数。传递的参数。对应实参对应实参必须也是必须也是数组数组且数据类型必须和形且数据类型必须和形参数组的数据类型相一致参数组的数据类型相一致。7.4.4 7.4.4 数组参数数组参数现在学习的是第40页,共50页对数组作形参作几点说明:对数组作形参作几点说明:1)如果形参数组的类型是变长字符串型,)如果形参数组的类型是变长字符串型,则对应的实参数组的类型也必须是变长字符则对应的实参数组的类型也必须是变长字符串型。串型。现在学习的是第41页,共50页Private sub form_click()Dim array(5)as string*8 Call changedim(array)End subPrivate sub changedim(a()as string)Dim i as integer Redim preserve a(7)For i=1 to 7 a(i)=i Next IEnd sub形参是变长形参是变长数组数组 错误:实参是错误:实参是定长数组定长数组现在学习的是第42页,共50页Private sub form_click()Dim array(5)as string*10 Call changedim(array)End subPrivate sub changedim(a()as string*8)Dim i as integer Redim preserve a(7)For i=1 to 7 a(i)=i Next IEnd sub形参是定长形参是定长数组数组实参也是定实参也是定长数组长数组 2)如果形参数组的类型定长字符串型,则对应的实参数组)如果形参数组的类型定长字符串型,则对应的实参数组的类型也必须是定长字符串型,但长度可以不同。的类型也必须是定长字符串型,但长度可以不同。现在学习的是第43页,共50页3)调用过程时,只要把传递的数组名放在)调用过程时,只要把传递的数组名放在实参表中即可,数组名后面不跟圆括号。实参表中即可,数组名后面不跟圆括号。Private sub form_click()Dim array(5)as string*8 Call changedim(array)End sub现在学习的是第44页,共50页4)在过程中不可以用)在过程中不可以用dim语句对形参数组语句对形参数组进行声明,否则将产生进行声明,否则将产生“重复声明重复声明”的错误的错误,但是使用动态数组时,可以用,但是使用动态数组时,可以用redim语句语句改变形参数组的维界,重新定义数组的大小。改变形参数组的维界,重新定义数组的大小。当控制返回调用程序时,对应参数的维界也当控制返回调用程序时,对应参数的维界也跟着发生变化。跟着发生变化。现在学习的是第45页,共50页Private sub form_click()Dim array()as integer,i as integer Redim array(5)Print“调用前数组上界:调用前数组上界:”;ubound(array)Call changedim(array)Print“调用后数组上界:调用后数组上界:”;ubound(array)Print“数组各元素的值为:数组各元素的值为:”For i=1 to ubound(array)print array(i);Next IEnd subPrivate sub changedim(a()as interger)Dim i as integer Redim preserve a(7)For i=1 to 7 a(i)=i Next IEnd sub现在学习的是第46页,共50页 在在Visual BasicVisual Basic中也可以把对象作为参数向过程传递。中也可以把对象作为参数向过程传递。在形参表中,把形参变量的类型声明为在形参表中,把形参变量的类型声明为“ControlControl”就可以向过程传递就可以向过程传递控件控件。若把类型声明为若把类型声明为“FormForm”则可向过程传递则可向过程传递窗体窗体。对象的传递只能是按对象的传递只能是按地址地址传递。传递。7.4.5 7.4.5 对象参数对象参数现在学习的是第47页,共50页Private Sub frmarg(f As Form)f.Left=(Screen.Width-f.Width)/2 f.Top=(Screen.Height-f.Height)/2 frmfirst.Hide f.ShowEnd SubPrivate Sub objarg(lad As Control)lad.BackColor=vbRed lad.ForeColor=vbGreen lad.Font=14 lad.FontItalic=True lad.Caption=对象参数的传递对象参数的传递End Sub传窗体传窗体传控件传控件现在学习的是第48页,共50页Private Sub cmd1_Click()Call objarg(lab1)End SubPrivate Sub cmd2_Click()Call frmarg(frmsecond)End SubPrivate Sub Form_Load()frmfirst.Left=2000frmfirst.Top=1500End Sub将将lab1作为实参传作为实参传递给过程递给过程将窗体将窗体2作为实参传作为实参传递给过程递给过程现在学习的是第49页,共50页感谢大家观看现在学习的是第50页,共50页