版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
关于过程调用与参数传递第1页,讲稿共50页,2023年5月2日,星期三知识要点1、过程的基本概念2、sub过程定义格式定义方法窗体事件的执行顺序3、Function过程(定义格式、定义方法)第2页,讲稿共50页,2023年5月2日,星期三7.3过程调用7.3.1事件过程的调用7.3.2调用Sub过程7.3.3调用Function过程7.3.4调用其它模块中的公有过程第3页,讲稿共50页,2023年5月2日,星期三
事件过程由一个发生在VisualBasic中的事件来自动调用或者由同一模块中的其它过程显式调用。
请看示例。p1317.3.1事件过程的调用第4页,讲稿共50页,2023年5月2日,星期三Sub过程和function过程必须在事件过程或其他过程中显式调用,否则过程代码就永远不会被执行。在调用程序时,程序执行到调用某通用过程的语句后,系统就会将控制转移到被调用的过程。在被调用的过程中,从第一条sub或function语句开始,依次执行其中的所有语句,当执行到endsub或endfunction语句后,返回到主调程序的断点,并从断点处继续程序的执行。7.3.2调用Sub过程第5页,讲稿共50页,2023年5月2日,星期三主调程序
调用过程AEndSub过程AEndSub调用Sub通用过程流程第6页,讲稿共50页,2023年5月2日,星期三Sub子过程的调用(1)用Call语句调用Sub过程语法:Call过程名(实在参数表)
实在参数的个数、类型和顺序,应该与被调用过程的形式参数相匹配,有多个参数时,用逗号分隔。如果被调用的过程是一个无参过程,则括号可以省略.第7页,讲稿共50页,2023年5月2日,星期三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页,2023年5月2日,星期三PrivateSubCommand1_Click()DimaAsInteger,bAsIntegera=Val(Text1.Text):b=Val(Text2.Text)s=a+bText3.Text=sEndSub等价于:第9页,讲稿共50页,2023年5月2日,星期三例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页,2023年5月2日,星期三(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页,2023年5月2日,星期三练一练:使用第2种调用方式修改例7.2。
PrivateSubCommand1_Click()DimIntaAsInteger,StAsStringInta=Text1.TextFactorInta,StText2.Text=StEndSubPrivateSubFactor(ByValNAsInteger,SAsString)DimIAsIntegerForI=1ToN-1IfNModI=0ThenS=S&Str(I)NextIEndSub第12页,讲稿共50页,2023年5月2日,星期三课堂练习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页,2023年5月2日,星期三
调用Function过程的方法与调用VisualBasic内部函数方法相同。即在表达式中写出它的名称和相应的实在参数:
Function过程名([实在参数表])1)调用Function过程与调用Sub过程不同,必须给参数加上括号,即使调用无参函数,括号也不能缺省;
2)VisualBasic也允许像调用Sub过程那样调用Function过程。(即使用call语句和把函数名当作一个语句使用。)7.3.3调用Function过程第14页,讲稿共50页,2023年5月2日,星期三例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页,2023年5月2日,星期三1.调用窗体模块中的公有过程
CallForm1.ExamSub([实参表])2.调用标准模块中的公有过程
CallCommonSub(实在参数)或CallModule2.CommonSub([实参表])
7.3.4调用其它模块中的公有过程(了解)第16页,讲稿共50页,2023年5月2日,星期三课堂练习在调用过程中,下述说明中正确的是()A)只能使用Call语句调用Sub过程B)调用Sub过程时,实在参数必须用括号括起来C)在表达式中调用Function过程时,可以不用括号把实在参数括起来D)Function过程也可用Call语句调用第17页,讲稿共50页,2023年5月2日,星期三课堂练习在VisualBasic中,以下说法正确的是()A)过程的定义可以嵌套,但过程的调用不能嵌套B)过程的定义不可以嵌套,但过程的调用能嵌套C)过程的定义和过程的调用均可以嵌套D)过程的定义和过程的调用均不可以嵌套第18页,讲稿共50页,2023年5月2日,星期三课堂练习在语句PublicSubSort(IAsInteger)中,I是一个按()传递的参数A)地址B)值C)变量D)常量第19页,讲稿共50页,2023年5月2日,星期三7.4参数的传递(重点、难点)7.4.1形参与实参7.4.2按值传递参数7.4.3按地址传递参数7.4.4数组参数7.4.5对象参数第20页,讲稿共50页,2023年5月2日,星期三
在调用一个有参数的过程时,首先进行的是“形实结合”,即按传值传递或按地址传递方式,实现调用程序和被调用的过程之间的数据传递。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页,2023年5月2日,星期三1.形参
出现在Sub过程和Function过程的形参表中的变量名、数组名称之为形式参数,过程被调用之前,并未为其分配内存,其作用是用来接收传送给子过程的数据
形参可以是:
1)除定长字符串变量之外的合法变量名;
2)后面跟有左、右圆括号(注意:不含下标)的数组名。
第22页,讲稿共50页,2023年5月2日,星期三2.实参
实际参数是指包含在过程调用的实参表中的变量,数组等。其作用是将它们的数据(数值或地址)传送给Sub或Function过程与其对应的形参变量。
实参可以是常量、表达式、有效的变量名、数组名组成。
如calltest(x^2,true,a,st)算术表达式第23页,讲稿共50页,2023年5月2日,星期三
参数传递是按对应“位置”结合而不是按名字结合,即第一个实参与第一形参结合,第二个实参与第二个形参结合,依此类推。3、参数传递(虚实结合)
参数传递指主调过程的实参(调用时已有确定值和内存地址的参数)传递给被调过程的形参,参数的传递有两种方式:按值传递、按地址传递。形参前加“ByVal”关键字的是按值传递,缺省或加“ByRef”关键字的为按地址传递。第24页,讲稿共50页,2023年5月2日,星期三例: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页,2023年5月2日,星期三
说明:(1)形参表和实参表中的对应变量名可以不必相同。Privatesubexamsub(xasinteger,yassingle)…….EndsubPrivatesubform_click()dimxasinteger,yassingle…….Callexamsub(y,x)Endsub第26页,讲稿共50页,2023年5月2日,星期三形参实参变量变量、常数、表达式、数组元素、对象数组数组(2)形参与实参的个数必须相同,对应位置的参数类型必须一致。对应关系如下表第27页,讲稿共50页,2023年5月2日,星期三
按值传递时,系统分配临时的变量单元给形参。系统仅把实参的值复制一份,然后把这个副本再传给形参。被调过程执行时,对形参的任何改变,都不会影响实参变量。结论:按值传递,形参变,相应的实参不变。7.4.2按值传递参数第28页,讲稿共50页,2023年5月2日,星期三分析下列程序的值
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页,2023年5月2日,星期三结论:按地址传递参数,形参变,相应的实参也跟着变7.4.3按地址传递参数
按地址传递参数是把实参变量的地址传给形参,即系统并不分配临时的变量单元给形参,而是形参与实参共用同一存储单元,因此,被调过程执行时,形参变量的任一变化,实参也相应改变。按地址传递参数可节省内存,执行效率高,但也可能对程序运行产生某些干扰。第30页,讲稿共50页,2023年5月2日,星期三分析下列程序的值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页,2023年5月2日,星期三1520返回地址1000(地址)20MNXY100010021004100510033520返回地址1000(地址)55MNXY10001002100410051003第32页,讲稿共50页,2023年5月2日,星期三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页,2023年5月2日,星期三参数数据类型转换的例子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页,2023年5月2日,星期三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页,2023年5月2日,星期三
因为在print语句中,计算表达式时,优先执行函数调用。调用结束时f=39,而v1,v2,v3的值也变了,不是2,3,4而是12,13,14所以结果是:12+13+14*39=571第36页,讲稿共50页,2023年5月2日,星期三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页,2023年5月2日,星期三如果修改成:PrivateSubForm_Click()Dimv1AsInteger,v2AsInteger,v3AsIntegerv1=2:v2=3:v3=4V4=v1+v2+v3*f((v1,v2,v3)*1.0)Printv4EndSub这是一个非整型的()也叫实型表达式
结果又是571了,因为计算实型表达式时优先调用函数第38页,讲稿共50页,2023年5月2日,星期三
结论:函数调用的优先级是不确定的,与诸多因素有关。编程时尽量不把按地址传递的实参变量放在函数调用的前面,可能会使算术表达式的值难以预料。第39页,讲稿共50页,2023年5月2日,星期三
形参数组只能是按地址传递的参数。对应实参必须也是数组且数据类型必须和形参数组的数据类型相一致。7.4.4数组参数第40页,讲稿共50页,2023年5月2日,星期三对数组作形参作几点说明:
1)如果形参数组的类型是变长字符串型,则对应的实参数组的类型也必须是变长字符串型。第41页,讲稿共50页,2023年5月2日,星期三Privatesubform_click()Dimarray(5)asstring*8Callchangedim(array)EndsubPrivatesubchangedim(a()asstring)DimiasintegerRedimpreservea(7)Fori=1to7a(i)=iNextIEndsub形参是变长数组
错误:实参是定长数组第42页,讲稿共50页,2023年5月2日,星期三Privatesubform_click()Dimarray(5)asstring*10Callchangedim(array)EndsubPrivatesubchangedim(a()asstring*8)DimiasintegerRedimpreservea(7)Fori=1to7a(i)=iNextIEndsub形参是定长数组实参也是定长数组2)如果形参数组的类型定长字符串型,则对应的实参数组的类型也必须是定长字符串型,但长度可以不同。第43页,讲稿共50页,2023年5月2日,星期三3)调用过程时,只要把传递的数组名放在实参表中即可,数组名后面不跟圆括号。Privatesubform_click()Dimarray(5)asstring*8Callchangedim(array)Endsub第44页,讲稿共50页,2023年5月2日,星期三4)在过程中不可以用dim语句对形参数组进行声明,否则将产生“重复声明”的错误,但是使用动态数组时,可以用redim语句改变形参数组的维界,重新定义数组的大小。当控制返回调用程序时,对应参数的维界也跟着发生变化。第45页,讲稿共50页,2023年5月2日,星期三Privatesubform_click()Dimarray()asinteger,iasintegerRedimarray(5)Print“调
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 前后台工作制度
- 一休一工作制度
- 刅公室工作制度
- 农业工作制度
- 两种工作制度
- 2026 年中职钢铁冶炼(钢铁冶炼工艺)试题及答案
- 寝室用电安全教育
- 幼儿园大班水墨画培训
- 车间用电安全检查
- 新教师入职培训会标
- 保洁员消毒隔离培训
- 雨课堂在线学堂《资治通鉴》导读课后作业单元考核答案
- 2025年南京市事业单位招聘考试综合类专业能力测试试卷(管理类)真题
- 2025年劳动教育课考试题库(含答案)
- 中文俄文贸易合同范本
- 知道智慧树网课《工程伦理(武汉科技大学)》章节测试答案
- 深圳市工务署参考品牌库(2021.12)
- 电线电缆市场营销方案
- 翻车机岗位存在的安全风险
- 货物损坏应急预案(3篇)
- 上海事业单位笔试真题2025
评论
0/150
提交评论