收藏 分销(赏)

Visual Basic 程序设计基础:第四章 函数与过程.ppt

上传人:可**** 文档编号:10289827 上传时间:2025-05-16 格式:PPT 页数:54 大小:617KB
下载 相关 举报
Visual Basic 程序设计基础:第四章 函数与过程.ppt_第1页
第1页 / 共54页
Visual Basic 程序设计基础:第四章 函数与过程.ppt_第2页
第2页 / 共54页
点击查看更多>>
资源描述
*,*,单击此处编辑母版标题样式,gejinhuan,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第四章 函数与过程,2,4.1,过程的编写与调用,内部函数是,VB,事先定义好的函数,我们可以直接拿过来用,但内部函数并不能解决所有的问题,有很多地方需要我们亲自动手,编写,自定义的函数或者过程。,过程,函数,子过程,内部函数,自定义函数,事件过程,自定义子过程,2025/5/16 周五,3,gejinhuan,自定义函数的引入,Private Sub Form_click(),Dim a As Integer,temp As Integer,a=InputBox(please input a number),temp=1,For i=2 To a,temp=temp*i,Next i,Print temp,End Sub,2025/5/16 周五,4,gejinhuan,自定义函数的引入,Private Sub Form_click(),Dim a As Integer,temp As Long,a=InputBox(please input a number),temp=fact(a),Print temp,End Sub,Private Function fact(k As Integer)As Long,Dim i As Byte,fact=1,For i=2 To k,fact=fact*i,Next i,End Function,5,4.1.1,自定义函数的编写与调用,定义方式,Function,函数名,(,形参列表,),As,End Function,:,Public|PrivateStatic,,,不能是,Dim,。,(,形参列表,),:,表示在调用时传递给函数的参数的变量列表,,圆括号必须要有。有返回类型,关键字,Function,与,End Function,相呼应。,形参列表,的声明语法:,ByVal|ByRef,变量名,As,类型,6,4.1.1,自定义函数,Private Sub command1_Click(),Dim m&,n&,c&,t&,i%,Dim FacN&,FacM&,FacNM&,m=Val(InputBox(,请输入,m,的值,组合公式,),n=Val(InputBox(,请输入,n,的值,组合公式,),If n m Then,t=n,n=m,m=t,End If,FacN=1,For i=1 To n,FacN=FacN*i,Next i,FacM=1,For i=1 To m,FacM=FacM*i,Next i,FacNM=1,For i=1 To n-m,FacNM=FacNM*i,Next i,c=FacN/(FacM*FacNM),label1.Caption=Str(c),End Sub,7,可以将代码中功能重复的部分用自定义函数来编写,这将大大提高编程的效率。,Private Sub CmdOk_Click(),Dim m&,n&,c&,t&,m=Val(InputBox(,请输入,m,的值,组合公式,),n=Val(InputBox(,请输入,n,的值,组合公式,),If n m Then,t=n,n=m,m=t,End If,c=,Fac(n)/(Fac(m)*Fac(n-m),LblResult.Caption=Str(c),End Sub,Private Function,Fac(ByVal k As Long)As Long,Dim F&,i%,F=1,For i=1 To k,F=F*i,Next i,Fac=F,End Function,4.1.1,自定义函数,调用方式,2025/5/16 周五,8,gejinhuan,实例,4-3,显示,1,1000,之间的素数。,要求编制函数过程,用于判断一个整数是否是素数。,2025/5/16 周五,9,gejinhuan,自定义过程(,SUB,)的引入,注意,Msgbox,函数的用法,=MsgBox(prompt,,,button,,,title,),比如:,i=MsgBox(,“,请关机,“,0+64+0,”,关机确认,),如果有时候,并不需要用到返回值,,仅仅是一个操作过程的话,那就引入自定义过程。,比如:,MsgBox,“,请关机,“,0+64+0,”,关机确认,10,Sub,子过程名,(,形参列表,),End Sub,:,Public|PrivateStatic,,不能是,Dim,。,(,形参列表,),:,表示在调用时传递给子过程的参数的变量列表,,圆括号必须要有。没有返回类型,关键字,Sub,与,End Sub,相呼应。,形参列表,的声明语法:,ByVal|ByRef,变量名,As,类型,4.1.2,自定义子过程(,SUB,),Private Sub swap(a,b),Dim t,t=a,a=b,b=t,End Sub,11,4.1.2,自定义子过程,Private Sub Form_Click(),Dim First!,Second!,Temp!,First=InputBox(,请输入第一个数:,First),Second=InputBox(,请输入第二个数:,Second),Print,初始值:,First=;First,Second=;Second,If First Second Then,swap First,Second,End If,Print,交换后:,First=;First,Second=;Second,End Sub,Private Sub swap(a,b),Dim t,t=a,a=b,b=t,End Sub,12,4.1.2,自定义子过程(,SUB,),调用方式,两种调用方式:,(1),子过程名 实参列表,(2),Call,子过程名 (实参列表),使用,Call,关键字时,参数两边要加圆括号。,省略,Call,关键字,则必须省略参数两边的圆括号。,13,自定义子过程与自定义函数的异同,区别:,(,1,)子过程以关键字,Sub,开始,函数以关键字,Function,开始。,(,1,)子过程没有返回值,没有类型;,函数有返回值,有类型。,(,2,)调用时,子过程是一条独立的语句;,但函数不能作为独立的语句加以调用,,必须参与表达式运算,。,相同点:,(,1,)都属于过程。,(,2,)都能实现相同的功能。,过程,函数,子过程,内部函数,自定义函数,事件过程,自定义子过程,14,形参:,在函数定义中的参数列表称为形参。形参标明了调用自定义的函数或者过程所需参数的个数、位置和类型。形参仅仅是一个符号,是要被实际数据所代替的。,实参:,实际参与运算的数据就是实参。,参数传递:,程序在调用函数或过程时,实参代替形参的过程。,4.2,参数传递,15,4.2,参数传递,参数传递有两种方式:,按地址传递、按数值传递,形参前加“,ByRef,”,关键字或什么都不加的为按地址传递,,形参前加“,ByVal,”,关键字的是按数值传递。,2025/5/16 周五,16,gejinhuan,4.2.1,按值传递,形参变量名前的修饰符是,Byval,调用时,创建形参,用实参的表达式的值复制给形参变量,调用结束,形参变量被取消。它是一种,单向传递,,即对形参的改变不会导致对实参变量的任何改变。,17,4.2.1,参数传递,按数值传递,Private Sub Form_Click(),Dim First!,Second!,Temp!,First=InputBox(,请输入第一个数:,First),Second=InputBox(,请输入第二个数:,Second),Print,初始值:,First=;First,Second=;Second,Print,If First Second Then,Call swap(First,Second),End If,Print,交换后:,First=;First,Second=;Second,End Sub,Private Sub,swap(,ByVal,a,ByVal,b),Dim t,t=a,a=b,b=t,End Sub,形参,实参,2025/5/16 周五,18,gejinhuan,4.2.2,按地址传递,按地址传递的形参变量名前的修饰符是,Byref,如果形参变量名前不做任何说明默认是,Byref,按地址传递时,过程中对形参变量值的改变即是对实参变量的改变,即,双向传递,。,19,Private Sub Form_Click(),Dim First!,Second!,Temp!,First=InputBox(,请输入第一个数:,First),Second=InputBox(,请输入第二个数:,Second),Print,初始值:,First=;First,Second=;Second,Print,If First Second Then,Call swap(First,Second),End If,Print,交换后:,First=;First,Second=;Second,End Sub,Private Sub,swap(a,b),Dim t,t=a,a=b,b=t,End Sub,Private Sub,swap(,ByRef,a,ByRef,b),Dim t,t=a,a=b,b=t,End Sub,4.2.2,参数传递,按地址传递,按数值传递,将复印件上交,原件永远不受影响,按地址传递,将原件上交,改的就是原件,实参,形参,20,例:,单击,Command1,后的运行结果,Private Sub ss(ByVal x as integer,ByRef y%,z%),x=x+1,y=y+1,z=z+1,End Sub,1 3 4,Private Sub Command1_Click(),Dim A%,B%,C%,A=1,B=2,C=3,Call ss(A,B,C),Print A;B;C,End Sub,21,数组为参数,Private Function tim(n()As Integer),Dim t%,i%,t=1,For i=LBound(n)To UBound(n),t=t*n(i),Next i,tim=t,End Function,Private Sub Command1_Click(),Dim a(3)As Integer,Dim k As Integer,j As Integer,For j=LBound(a)To UBound(a),a(j)=InputBox(,请输入,a(&j&),的值,数组输入,),Next j,k=tim(a(),Print k,End Sub,形参的语法:,ByRef,数组名,()As,类型,无论是形参还是实参,,都应省略其维数,!形参括号不能省略!实参括号可以省略。,数组参数在传递时,只能按地址传递,!,2025/5/16 周五,22,gejinhuan,数组为参数,Private Sub Command1_Click(),Dim a(3)As Integer,Dim k As Integer,j As Integer,For j=0 To 3,a(j)=InputBox(,请输入,a(&j&),的值,数组输入,),Next j,k=tim(a(),3),Print k,End Sub,Private Function tim(n()As Integer,L As Integer)As Long,Dim t%,i%,t=1,For i=0 To L,t=t*n(i),Next i,tim=t,End Function,也可以这样自定义该函数,23,1,、过程的编写不能嵌套。,2,、如果在调用时该形参对应的实参是一个表达式,则按值传递方式调用过程。,3,、形参是数组时,只能是地址传递。,小结,:,前个例子里如果改成,Call ss(A,B,1,C),则输出结果为,1 2 4,24,4.3,多模块程序设计,工程文件,(*.vbp),窗体模块,文件,(*.frm),类模块,文件,(*.cls),标准模块,文件,(*.bas),函数过程、子过程、,事件过程,函数过程、子过程,过程的相互调用与通信必然会涉及到,过程的作用域以及变量的作用域和生存期的问题。,25,4.3.1,过程的作用域,用两个限定词加以区分:,Private,、,Public,当过程前的限定词为,Private,,则表明此过程只能被本模块中其他的过程所调用,我们称之为,模块级过程,。,当过程前的限定词为,Public,,则表明此过程不仅能被本模块所调用,也可以被其他模块中的过程所调用,我们称之为,全局过程,。,过程作用域:,过程能被调用的范围。,26,4.3.1,过程的作用域,过程前没有限定词时,,默认为,Public,。,Public,Sub swap(x%,y%),Dim T%,T=x,x=y,y=T,End Sub,(标准模块),Private,Sub Form_Click(),Dim a%,b%,T%,a=InputBox(,请输入第一个数:,a),b=InputBox(,请输入第二个数:,b),Print,初始值:,a=;a,b=;b,If a b Then Call,swap,(a,b),Print,交换后:,a=;a,b=;b,End Sub,Private,Sub Command1_Click(),Form2.Show,End Sub,(,Form1,模块),Private,Sub Form_Click(),Dim p%,q%,T%,p=InputBox(,请输入第一个数:,p),q=InputBox(,请输入第二个数:,q),Print,初始值:,p=;p,q=;q,If p q Then Call,swap,(p,q),Print,交换后:,p=;p,q=;q,End Sub,(,Form2,模块),27,4.3.1,过程的作用域,思考:,(,1,)如果,swap,在标准模块中是用,Private,定义的,,是否能被,Form1,和,Form2,调用?,(,2,)如果,swap,是在,Form1,中用,Private,定义的,,是否能被,Form1,和,Form2,调用?,(,3,)如果,swap,在在,Form1,中用,Public,定义的,,是否能被,Form1,和,Form2,调用?,(,4,)如果在两个标准模块里都有,swap,过程,,这时应该如何调用?,28,4.3.1,过程的作用域(调用规则),29,4.3.2,变量的作用域和生存期,变量的,作用域,:变量能被使用的,范围,。,变量的,生存期,:变量从产生到消亡的,时间,。,按照声明变量的,位置,和,限定词,的不同,变量分为三种:,局部变量、模块级变量、全局变量。,2025/5/16 周五,30,gejinhuan,回顾变量声明的格式,显示声明变量的,格式,:,as ,Dim,、,Static,、,Public,、,Private,31,什么样的变量才叫局部变量?,局部变量的作用域和生存期,局部变量,以,Dim,声明,动态,变量,以,Static,声明,静态,变量,用,Dim,或,Static,在,过程内,声明的变量称为局部变量。,2025/5/16 周五,32,gejinhuan,局部变量的作用域和生存期,局部变量的作用域:,只能在声明它的本过程中使用,而不能,被其它过程使用。,局部变量的生存期:,若是动态变量,生存期为变量所在过程的执行期,因此,过程结束,变量的值自动消失,;若是静态变量,生存期为整个应用程序的运行期,,过程结束,变量还会保持当前的值,。,33,局部变量的作用域和生存期,Private Sub Command1_Click(),Dim n As Integer,n=10,Print n,End Sub,Private Sub Command2_Click(),Dim n As Integer,n=20,Print n,End Sub,假设在工程,1,的,Form1,窗体中定义了如下两个,事件过程,:,打开工程,1,2025/5/16 周五,34,gejinhuan,Private Sub Command2_Click(),Static i As Integer,i=i+10,Print Spc(5);i,End Sub,Private Sub Command1_Click(),Dim i As Integer,i=i+10,Print i,End Sub,局部变量的作用域和生存期,假设在工程,1,的,Form1,窗体中定义了如下两个,事件过程,:,打开工程,1,35,要活用静态变量(,Static,),例如:,有一个人编了下面一段程序,想用变,量,n,记,录单击窗体的次数。,Private Sub Form_Click(),Dim n As Integer,n=n+1,Print,已单击次数:,;n&,次,End Sub,36,什么样的变量才叫,模块级变量,?,模块级变量的作用域和生存期,用,Private,或,Dim,在,模块内,的“,通用声明,”段声明的变量。,在我这里,2025/5/16 周五,37,gejinhuan,模块级变量的,作用域,:只能在声明它的,本模块,中使用,即能,被本模块中的其它过程使用。,模块级变量的,生存期:,整个应用程序的运行期。,模块级变量的作用域和生存期,38,Private Z As Integer,Private,Sub S(),Z=Z+2,Print Z,End Sub,Private Sub Command1_Click(),Z=Z+2,Call S,Print Z,End Sub,模块级变量的作用域和生存期,打开程序,程序执行时,鼠标单击命令按钮,1,一次,会在窗体上看到什么?,39,什么样的变量才叫全局变量?,全局变量的,作用域,:能被这个应用程序中所有模块的所有,过程使用。,全局变量的,生存期,:整个应用程序的运行期。,全局变量的作用域和生存期,用,Public,限定词在,模块内,的“,通用声明,”段声明的变量。在编程时,,全局变量越少越好,。,40,Rem Form1,Public i As Integer,Private Sub Command1_Click(),i=i+1,Print i,End Sub,Private Sub Command2_Click(),Form2.Show,End Sub,Rem Form2,Private Sub Command1_Click(),i=Form1.i+1,Print i,End Sub,全局变量的作用域和生存期,假设在工程,1,中的,Form1,当中定义,Command1_Click,事件和,Command2_Click,事件,,在,Form2,当中定义的另外一个,Command1_Click,事件。,打开程序,41,变量的,重名,问题:,我们可以在,不同的作用域,内声明具有,相同名称,的变量。它们是毫无关联的不同变量,不会相互影响。,如果发生,作用域重叠,,就应该采取,“就近原则”,。,即首先看这个变量在本过程中是否有声明它的语句,有则为局部变量;若无,再看这个变量在本模块中是否有声明它的语句,有则为模块级变量或者是全局变量。,4.3.2,变量的作用域和生存期,42,Private Sub Command1_Click(),Dim X As Integer,Y As Integer,Z As Integer,X=2,Y=3,Z=X+Y,Call S,Print X,Y,Z,End Sub,Private,Sub S(),Dim X As Integer,Y As Integer,Z As Integer,X=1,Y=2,Z=X+Y,Print X,Y,Z,End Sub,在工程,1,的,Form1,窗体中定义了,Command1_Click,事件过程和自定义了一个,S,子过程,4.3.2,变量的作用域和生存期,打开程序,43,4.3.2,变量的作用域和生存期,Private,i,As Integer,Private Sub Command1_Click(),Static,i,As Integer,i,=,i,+10,Print,i,End Sub,Private Sub Command2_Click(),Print,i,End Sub,再来看一个例子:,打开程序,我俩是一家,44,如果想在含有局部变量的过程中使用重名的,全局变量,,可以在变量名前,加上模块名,。,Public i,As Integer,Private Sub Command1_Click(),Static i As Integer,Form1.i,=,Form1.i,+10,Print i,End Sub,Private Sub Command2_Click(),Print i,End Sub,4.3.2,变量的作用域和生存期,45,Private x%,y%,z%,Private Sub Form_click(),Dim x as integer,x=1,y=2,Call AA(y+1),z=BB(x),Print x,y,z,End Sub,Private,Sub AA(byval z%),y=z+x,z=x+y,End Sub,Private,Function BB,(y%),y=y+1,BB=x+y,End function,综合应用例子:,232,注意,:所有形参都是局部变量,打开程序,2025/5/16 周五,46,gejinhuan,练习题,1,、工程的扩展名是,?,2,、对象的三要素是,?,3,、输入对话框,inputbox,的返回值的类型是?,4,、,Int(Rnd*100),表示的数的范围是?,5,、,Print,“,5*5,”,的执行结果是?,6,、表达式,16/2-23*7 Mod 9,的值是?,7,、,x,大于5小于10,和,a,和,b,中有且只有一个为,0,的表达式怎么写?,8,、用,Inputbox,函数为数组,B,的所有元素,B(0),、,B(1),、,B(9),依次赋值的语句怎么写?,9,、数组名作为参数,相应的形参传递方式是?,10,、函数名在函数体中必须被赋值?,2025/5/16 周五,47,gejinhuan,程序阅读题:,1,、,Private Sub form_click(),Dim a As Integer,s As Integer,a=5:s=0,Do While a a(j)Then,m=a(i):,?,:a(j)=m,End If,Next j,i,For i=1 To 30,If a(i)Mod 2 0 Then Print a(i);,Next i,End Sub,以下程序产生,30,个,两位,随机整数、并按,从小到大,的顺序存入数组,a,中,再将其中的,奇数,按从小到大的顺序在窗体中用,紧凑,格式输出。,2025/5/16 周五,52,gejinhuan,程序设计题,1,单击命令框按钮,弹出输入对话框,提示输入一元二次方程的系数,a,b,c,,判断,是否大于等于,0,,弹出消息框给用户说明有无实数解。,2025/5/16 周五,53,gejinhuan,程序设计题,2,编程,输入,x,值,按下式计算并输出,y,值,x+3 x3,Y=f(x)=x,2,1=x=3,x 0 x1,0 x=0,2025/5/16 周五,54,gejinhuan,程序设计题,3,编制通用函数过程,计算,Double,类型一维数组所有元素的平均值。,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服