




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
上节课复习,知识要点,1、过程的基本概念 2、sub过程 定义格式 定义方法 窗体事件的执行顺序 3、Function过程(定义格式、定义方法),7.3 过程调用,7.3.1 事件过程的调用 7.3.2 调用Sub过程 7.3.3 调用Function过程 7.3.4 调用其它模块中的公有过程,事件过程由一个发生在Visual Basic中的事件来自动调用或者由同一模块中的其它过程显式调用。 请看示例。p131,7.3.1 事件过程的调用,Sub过程和function过程必须在事件过程或其他过程中显式调用,否则过程代码就永远不会被执行。 在调用程序时,程序执行到调用某通用过程的语句后,系统就会将控制转移到被调用的过程。在被调用的过程中,从第一条sub或function语句开始,依次执行其中的所有语句,当执行到end sub或end function语句后,返回到主调程序的断点,并从断点处继续程序的执行。,7.3.2 调用Sub过程,主调程序,调用过程A,End Sub,过程A,End Sub,调用Sub通用过程流程,Sub子过程的调用,(1) 用Call语句调用Sub过程 语法:Call 过程名(实在参数表) 实在参数的个数、类型和顺序,应该与被调用过程的形式参数相匹配,有多个参数时,用逗号分隔。如果被调用的过程是一个无参过程,则括号可以省略.,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 = s End Sub,调用add子过程,Private Sub Command1_Click() Dim a As Integer, b As Integer a = Val(Text1.Text): b = Val(Text2.Text) s = a + b Text3.Text = s End Sub,等价于:,例7-2,编写一个找出任意一个正整数的因子的程序,Private Sub Command1_Click() Dim Inta As Integer, St As String Inta = Text1.Text Call Factor(Inta, St) Text2.Text = St End Sub,Private 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 I End Sub,(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, b End Sub Private Sub add(x As Integer, y As Integer) s = x + y Text3.Text = s End Sub,练一练:使用第2种调用方式修改例7.2。,Private Sub Command1_Click() Dim Inta As Integer, St As String Inta = Text1.Text Factor Inta, St Text2.Text = St End Sub,Private 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 I End Sub,课堂练习2:编写一个实现两数交换的程序,要求程序中定义一个交换两数的通用过程。,Private Sub command1_click() Dim a%,b% a=text1.text b=text2.text call swap(a,b) text1.text=a text2.text=b End Sub,Private Sub Swap( X As Integer, Y As Integer) Dim temp As Integer Temp=X : X=Y : Y=Temp End Sub,调用Function过程的方法与调用Visual Basic内部函数方法相同。即在表达式中写出它的名称和相应的实在参数: Function 过程名(实在参数表) 1)调用Function过程与调用Sub过程不同,必须给参数加上括号,即使调用无参函数,括号也不能缺省; 2) Visual Basic也允许像调用Sub过程那样调用Function过程。(即使用call语句和把函数名当作一个语句使用。),7.3.3 调用Function过程,例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; “的最大公约数是:“; G End Sub,Private 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 = B End Function,1. 调用窗体模块中的公有过程 Call Form1.ExamSub(实参表) 2调用标准模块中的公有过程 Call CommonSub (实在参数) 或 Call Module2.CommonSub(实参表),7.3.4 调用其它模块中的公有过程(了解),课堂练习,课堂练习,课堂练习,7.4 参数的传递(重点、难点),7.4.1 形参与实参 7.4.2 按值传递参数 7.4.3 按地址传递参数 7.4.4 数组参数 7.4.5 对象参数,在调用一个有参数的过程时,首先进行的是“形实结合”,即按传值传递或按地址传递方式,实现调用程序和被调用的过程之间的数据传递。,Private Sub command1_click() Dim a%,b% a=text1.text b=text2.text call swap(a,b) text1.text=a text2.text=b End Sub,Private Sub Swap ( X As Integer, Y As Integer) Dim temp As Integer Temp=X X=Y Y=Temp End Sub,实参,形参,7.4.1 形参与实参,1. 形参 出现在Sub过程和Function过程的形参表中的变量名、数组名称之为形式参数,过程被调用之前,并未为其分配内存,其作用是用来接收传送给子过程的数据 形参可以是: 1) 除定长字符串变量之外的合法变量名; 2) 后面跟有左、右圆括号(注意:不含下标)的数组名。,2. 实参 实际参数是指包含在过程调用的实参表中的变量,数组等。其作用是将它们的数据(数值或地址)传送给Sub或Function过程与其对应的形参变量。 实参可以是常量、表达式、有效的变量名、数组名组成。 如call test(x2,true,a,st),算术表达式,参数传递是按对应“位置”结合而不是按名字结合,即第一个实参与第一形参结合,第二个实参与第二个形参结合,依此类推。,3、参数传递(虚实结合),参数传递指主调过程的实参(调用时已有确定值和内存地址的参数)传递给被调过程的形参,参数的传递有两种方式:按值传递、按地址传递。形参前加“ByVal”关键字的是按值传递,缺省或加“ByRef”关键字的为按地址传递。,例:,Private Sub command1_click() Dim a%,b% a=text1.text b=text2.text call swap(a,b) text1.text=a text2.text=b End Sub,Private Sub Swap ( X As Integer, Y As Integer) Dim temp As Integer Temp=X X=Y Y=Temp End Sub,实参,形参,说明:(1)形参表和实参表中的对应变量名可以不必相同。,Private sub examsub(x as integer,y as single) . End sub,Private sub form_click() dim x as integer,y as single . Call examsub(y,x) End sub,(2)形参与实参的个数必须相同,对应位置的参数类型必须一致。对应关系如下表,按值传递时,系统分配临时的变量单元给形参。系统仅把实参的值复制一份,然后把这个副本再传给形参。 被调过程执行时,对形参的任何改变,都不会影响实参变量。,结论:按值传递,形参变,相应的实参不变。,7.4.2 按值传递参数,分析下列程序的值,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(ByVal X As Integer, ByVal Y As Integer) X=X+20 Y=X+Y Print “X=“;X,”Y=“;Y End Sub,结论:按地址传递参数,形参变,相应的实参也跟着变,7.4.3 按地址传递参数,按地址传递参数是把实参变量的地址传给形参,即系统并不分配临时的变量单元给形参,而是形参与实参共用同一存储单元,因此,被调过程执行时,形参变量的任一变化,实参也相应改变。 按地址传递参数可节省内存,执行效率高,但也可能对程序运行产生某些干扰。,分析下列程序的值,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 Sub,X=35 y=55 M=35 N=20,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=“; sum End 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 Loop End Function,按地址传递参数产生不良干扰的示例: (1)循环变量作为实参,Why?如何修改?,结果:120 正确结果应为:153,参数数据类型转换的例子,Private Sub Form_Click() Dim S as Single S=125.5 Call Convert(S),”12”+”.5”) End Sub,如果为Call Convert(S),”125a”)呢?,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 Sub Public Function f(a As Integer, b As Integer, c As Integer) a = a + 10 b = b + 10 c = c + 10 f = a + b + c End Function,调用函数语句,实参是传地址的。,实参变量又出现在表达式中,结果是571,而非161。why?,(2)实参出现在表达式中,因为在print语句中,计算表达式时,优先执行函数调用。调用结束时f=39,而v1,v2,v3的值也变了,,不是2,3,4 而是 12,13,14,所以结果是:12+13+14*39=571,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 v4 End Sub,修改成赋值语句,结果为161,因为执行赋值语句时,计算右侧表达式的值不是首先调用函数,而是按从左到右的顺序进行的,即计算2+3+4*39,如果修改成:,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 v4 End Sub,这是一个非整型的()也叫实型表达式,结果又是571了,因为计算实型表达式时优先调用函数,结论:函数调用的优先级是不确定的,与诸多因素有关。编程时尽量不把按地址传递的实参变量放在函数调用的前面,可能会使算术表达式的值难以预料。,形参数组只能是按地址传递的参数。 对应实参必须也是数组且数据类型必须和形参数组的数据类型相一致。,7.4.4 数组参数,对数组作形参作几点说明: 1)如果形参数组的类型是变长字符串型,则对应的实参数组的类型也必须是变长字符串型。,Private sub form_click() Dim array(5) as string * 8 Call changedim(array) End sub,Private sub changedim(a() as string) Dim i as integer Redim preserve a(7) For i =1 to 7 a(i)=i Next I End sub,形参是变长数组,错误:实参是定长数组,Private sub form_click() Dim array(5) as string * 10 Call changedim(array) End sub,Private sub changedim(a() as string*8) Dim i as integer Redim preserve a(7) For i =1 to 7 a(i)=i Next I End sub,形参是定长数组,实参也是定长数组,2)如果形参数组的类型定长字符串型,则对应的实参数组的类型也必须是定长字符串型,但长度可以不同。,3)调用过程时,只要把传递的数组名放在实参表中即可,数组名后面不跟圆括号。,Private sub form_click() Dim array(5) as string * 8 Call changedim(array) End sub,4)在过程中不可以用dim语句对形参数组进行声明,否则将产生“重复声明”的错误 ,但是使用动态数组时,可以用redim语句改变形参数组的维界,重新定义数组的大小。当控制返回调用程序时,对应参数的维界也跟着发生变化。,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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度分公司股权转让及利益再分配执行合同
- 2025版房产交易合同规范范本
- 二零二五年度美容院美容护肤产品研发与推广合作协议书
- 二零二五年度大型活动赞助广告合同协议
- 二零二五年度屋顶花园草皮供应合同样本
- 二零二五年度电子产品销售与供应链管理合同
- 二零二五年度环保科技厂房及场地租赁服务协议
- 二零二五年度特色餐厅承包与员工福利保障合同
- 早读神器课件WPS
- 二零二五年度车辆抵押贷款担保与金融创新合同
- GB/T 45000-2024表面活性剂蔗糖脂肪酸酯的组成分析液相色谱法
- 《高速公路边坡光伏光环境影响评价方法》
- 氯化亚砜MSDS安全技术说明书
- 肠梗阻护理新进展
- 红星美凯龙展厅租赁合同
- 单纯疱疹患者的护理
- 养老护理员职责培训课件
- 酒店员工接待礼仪培训
- 车位租赁协议
- 医疗器械生产质量管理手册
- 2024年新沪教牛津版三年级上册英语全册教学课件
评论
0/150
提交评论