1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,3,*,*,VB,程序设计,第六章 过程,高级程序语言设计(,Visual Basic,),主讲教师,胡 滨,Hubin_xy,西安邮电学院计算机系,2008,年,3,月,第六章 过程,1,第六章 过程,6.1,函数过程的定义与调用,6.2,子过程的定义与调用,6.3,参数传递,6.4,变量、过程的作用域,6.5,递归,6.6,常用算法(三,),6.7,重点和难点,2,过程,VB,应用程序是由过程组成的,除了定义一些公共的常量、,变量或数组外,编写代码都是在事件过程中进行的。,事件过程由,VB,预先定义,编程
2、人员所要做的工作就是在已经存在的过程中编写代码。减少代码的重复性,将重复性较大的代码段独立出来形成一个过程,这种独立定义的过程叫做“,通用过程,”。,通用过程由编程人员建立,供事件过程或其他通用过程使用,(,调用,),,通用过程也称为“,子过程,”或“,子程序,”,可以被多次调用。而调用该子过程的过程称为“,调用过程,”。,3,过程,在,VB5.0/6.0,中,除了系统提供的内部函数过程和事件过程外,用户可自定义过程下列四种过程:,“,Sub,”,保留字开始的为子过程,“,Function,”,保留字开始的为函数过程,“,Property”,保留字开始的为属性过程,“,Event”,保留字开始
3、的事件过程,4,已知多边形的各条边的长度,要计算多边形的面积。,计算多边形面积,可将多边形分解成若干个三角形。计算三角形面积的公式如下:,5,Function,过程的定义,Public|Private|Static Function()As ,=,Exit Function,=,End Function,6,说明,Public,:,可选项,缺省值。使用,Public,时表示所有模块的所有其他过程都可以调用该,Function,过程。,Private,:,可选项。使用,Private,时表示只有本模块中的其他过程才可以调用该,Function,过程。,Static,:,可选项。如果使用该选项,
4、则,VB,只给过程中的所有局部变量分配一次存储空间,即在应用程序执行期间,每次调用该,Function,过程时将保留该过程中的局部变量值。若没有使用该选项,则每次调用该,Function,过程时,其中的局部变量都要被重新初始化。,:,Function,过程的名称,遵循变量的命名规则。,7,Function,过程的定义,Public|Private|Static Function()As ,=,Exit Function,=,End Function,8,说明,函数名命名规则与变量名规则相同。但不能与系统的内部函数或其它通用子过程同名,也不能与已定义的全局变量和本模块中模块级变量同名。,在函数体
5、内,函数名可以当变量使用,函数的返回值就是通过对函数名的赋值语句来实现的,在函数过程中至少要对函数名赋值一次。,9,Function,过程的定义,Public|Private|Static Function()As ,=,Exit Function,=,End Function,10,说明,As,:,可选项。,Function,过程的返回值的数据类型,可以是,Byte,、,Boolean,、,Integer,、,Long,、,Currency,、,Single,、,Double,、,Date,、,String(,固定长度除外,),、,Object,、,Variant,或用户自定义类型。,。,E
6、xit Function,:,表示退出函数过程,常常是与选择结构(,If,或,Select Case,语句)联用,即当满足一定条件时,退出函数过程。,11,Function,过程的定义,Public|Private|Static Function()As ,=,Exit Function,=,End Function,12,说明,:,可选项。语句组中可以有一条或多条,Exit Function,语句。,:可选项。,Function,过程通过赋值语句,“,=,”,将函数的返回值赋给,。如果省略该语句,则数值函数过程返回,0,,字符串函数过程返回空串。,13,Function,过程的定义,Publ
7、ic|Private|Static Function()As ,=,Exit Function,=,End Function,14,说明,:,可选项。表示在调用时要传递给,Function,过程的参数变量列表。多个变量之间用逗号隔开。,的格式为:,ByVal,|,ByRef,()As,其中:,ByVal,为可选项,表示该参数按值传递,;,ByRef,为可选项,缺省值,表示该参数按地址传递。,遵循变量命名规则的任何变量名或数组名。,(),当参数为数组时使用。,As,为可选项,用于声明参数的数据类型。,15,已知多边形的各条边的长度,要计算多边形的面积。,计算多边形面积,可将多边形分解成若干个三角
8、形。计算三角形面积的公式如下:,16,Function,过程的调用,定义函数过程的目的是为了在其他过程中调用,通过调用将一些参数值传递给函数过程,在函数过程中利用参数值计算并返回函数值。,Function,过程的调用与内部函数的调用类似,即可以直接在表达式中调用。,格式,:,(),其中,,为要调用的,Function,过程的名称;,为要传送给,Function,过程的常量、变量或表达式,各参数之间用逗号分隔,如果是数组,在数组名之后必须跟一对空括号。,它必须与形参个数相同,位置与类型一一对应。,17,最大公约数,Function gcd(ByVal m%,ByVal n%)As Integer
9、If m n Then t=m:m=n:n=t,r=m Mod n,Do While(r 0),m=n:n=r:r=m Mod n,Loop,gcd=n,End Function,18,调用过程,调用,Sprg1,调用,Sprg1,调用,Sprg2,子过程:,Sprg1,子过程:,Sprg2,过程调用,19,第六章 过程,6.1,函数过程的定义与调用,6.2,子过程的定义与调用,6.3,参数传递,6.4,变量、过程的作用域,6.5,递归,6.6,常用算法(三,),6.7,重点和难点,20,Sub,过程,当需要定义的过程返回一个值时,使用前面介绍的,Function,过程很容易实现,但在实际应
10、用中,可能希望过程不需要返回值,例如,使用过程打印一个图形,或需要返回多个值;,如,利用过程对一批数据进行排序,或者要进行较复杂的操作,等等。在这些情况下就要利用,Sub,过程来实现。,21,Sub过程的定义,Sub,过程的格式,Private|PublicStatic Sub (),Exit Sub,End Sub,22,说明,格式中各项含义同,Function,过程。,Exit Sub,用于退出,Sub,过程。,Sub,过程的,与,Function,过程的,的含义与作用不同,,只在调用,Sub,过程时使用,不具有值的意义,在,Sub,过程中不能给,赋值,也不能给,定义类型。,过程可以返回,
11、0,到多个值,且由,中的参数返回这些值。因此,使用函数过程可以实现的功能,也可以用,Sub,过程实现。,Sub,过程的建立方法与,Function,过程的建立方法相同,可以在代码窗口中直接输入,也可通过执行,“,工具,”,菜单中的,“,添加过程,”,命令生成过程模板。,23,Sub过程的调用,定义一个,Sub,过程之后,必须使用,Call,语句调用该过程。,调用格式一:,Call (),调用格式二:,:要调用的,Sub,过程名。,:要传送给,Sub,过程的常量、变量或表达式,各参数之间用逗号分隔。如果是数组参数,则要在数组名之后跟一对空括号。,用,Call,语句调用一个,Sub,过程时,如果过
12、程本身没有参数,则省略,和括号。,格式二省略了,Call,关键字,同时,两边也不能带括号。,24,Sub过程的调用,25,子过程与函数过程区别,(1),函数过程名有值,有类型,在函数体内至少赋值一次;,子过程名无值,无类型,在子过程体内不能对子过程名赋值;,(2),调用时,子过程调用是一句独立的语句。,函数过程不能作为单独的语句加以调用,必须参与表达式运算。,(3),一般当过程有一个函数值,使用函数过程较直观;,反之若过程无返回值,或有多个返回值,使用子过程较直观。,26,分别编一计算某级数部分和的子过程和函数过程,并调用,27,第六章 过程,6.1,函数过程的定义与调用,6.2,子过程的定义
13、与调用,6.3,参数传递,6.4,变量、过程的作用域,6.5,递归,6.6,常用算法(三,),6.7,重点和难点,28,参数的传递,Visual Basic,中不同模块(过程)之间数据的传递有两种方式:,通过过程调用实参与形参的结合实现;,使用全局变量来实现各过程中共享数据。,29,形式参数与实际参数,1,、形式参数,是指在定义通用过程时,出现在,Sub,或,Function,语句中的变量名后面括号内的数,是用来接收传送给子过程的数据,形参表中的各个变量之间用逗号分隔,。,30,Sub过程的调用,31,已知多边形的各条边的长度,要计算多边形的面积。,计算多边形面积,可将多边形分解成若干个三角形
14、计算三角形面积的公式如下:,32,形式参数与实际参数,2,、实际参数,实际参数是指在调用,Sub,或,Function,过程时,写入子过程名或函数名后括号内的参数,其作用是将它们的数据(数值或地址)传送给,Sub,或,Function,过程与其对应的形参变量。,实参可由常量、表达式、有效的变量名、数组名(后加左、右括号,如,A(),)组成,实参表中各参数用逗号分隔。,在调用一个过程时,必须把实参传送给过程,完成形参与实参的结合,然后用实参执行调用的过程。这种参数的传递也称为参数的结合,。,33,参数的传递,例如,定义如下一个过程:,Sub,SubTest(n,As Integer,Sum A
15、s Single),End Sub,如果有以下调用语句:,Call,SubTest(a,s),则其形参与实参的结合关系如下:,过程调用,:,Call,SubTest(a,s),过程定义,:,Sub,SubTest(n,As Integer,Sum As Single),在传递参数时,形参表与实参表中对应参数的名字不必相同,但要求形参表,与实参表中参数的个数、类型、位置顺序必须一一对应。,形参表中的参数可以是:除固定长度字符串之外的合法变量名,后面带一对,圆括号的数组名。,实参表中参数可以是:常量、变量、表达式、后面带一对圆括号的数组名。,VB,中,形参与实参的结合有两种方式:,按值传递和按地址
16、传递。,34,参数的传递(虚实结合),参数传递指主调过程的实参(调用时已有确定值和内存地址的参数)传递给被调过程的形参,参数的传递有两种方式:,按值传递、按地址传递。,形参前加,“,ByVal,”,关键字的是按值传递,缺省或加,“,ByRef,”,关键字的为按地址传递。,35,按值传递和按地址传递,1,按值传递,按值传递是指实参把其值传递给形参而不传递实参的地址。在这种情况下,系统把需要传递的参数复制到一个临时存储单元中,然后把临时存储单元与形参结合,在子程序执行过程中,形参值的改变不会影响主程序中实参的值,因此,数据的传递是单向的。,36,按值传递和按地址传递,2,按地址传递,按地址传递即指
17、将实参的地址传给形参,使形参和实参具有相同的地址,即形参与实参共享同一存储单元。当实参为变量或数组时,形参使用关键字,ByRef,定义,(,或省略,),,表示要按地址传递,。,当参数是数组时,数组名之后必须使用一对空的圆括号,。,按地址传递可以实现调用过程与子过程之间数据的双向传递,。,37,按值传递和按地址传递,Sub Swap2(x%,y%),Dim Temp%,Temp=x:x=y:y=Temp End Sub,Sub Swap1(ByVal x%,ByVal,y%),Dim Temp%,Temp=x:x=y:y=Temp,End Sub,Private Sub,CmdOK_Click,
18、),a%=10:b%=20:Swap1 a,b ,传 值,Print A1=;a,B1=;b,a=10:b=20:Swap2 a,b ,传地址,Print A2=;a,B2=;b,End Sub,38,按值传递和按地址传递,Sub Swap2(x%,y%),Dim Temp%,Temp=x:x=y:y=Temp End Sub,Sub Swap1(ByVal x%,ByVal,y%),Dim Temp%,Temp=x:x=y:y=Temp,End Sub,Private Sub,CmdOK_Click,(),a%=10:b%=20:Swap1 a,b,传值,Print A1=;a,B1=;b
19、a=10:b=20:Swap2 a,b,传地址,Print A2=;a,B2=;b,End Sub,39,按值传递和按地址传递,Sub Swap1(ByVal x%,ByVal,y%),Dim Temp%,Temp=x:x=y:y=Temp,End Sub,Private Sub,CmdOK_Click,(),a%=10:b%=20:Swap1 a,b,传值,Print A1=;a,B1=;b,a=10:b=20:Swap2 a,b,传地址,Print A2=;a,B2=;b,End Sub,40,按值传递和按地址传递,1,按值传递,按值传递是指实参把其值传递给形参而不传递实参的地址。在这种
20、情况下,系统把需要传递的参数复制到一个临时存储单元中,然后把临时存储单元与形参结合,在子程序执行过程中,形参值的改变不会影响主程序中实参的值,因此,数据的传递是单向的。,41,按值传递和按地址传递,Private Sub,CmdOK_Click,(),a%=10:b%=20:Swap1 a,b,传值,Print A1=;a,B1=;b,a=10:b=20:Swap2 a,b,传地址,Print A2=;a,B2=;b,End Sub,Sub Swap2(x%,y%),Dim Temp%,Temp=x:x=y:y=Temp End Sub,42,按值传递和按地址传递,2,按地址传递,按地址传递即
21、指将实参的地址传给形参,使形参和实参具有相同的地址,即形参与实参共享同一存储单元。当实参为变量或数组时,形参使用关键字,ByRef,定义,(,或省略,),,表示要按地址传递,。,当参数是数组时,数组名之后必须使用一对空的圆括号,。,按地址传递可以实现调用过程与子过程之间数据的双向传递,。,43,数据传递的几点说明,1.,参数的数据类型,2.,按值传递参数,形参是实参的一个副本,3.,按地址传递参数,形参实参公用内存单元,4.,子过程执行一系列操作,函数过程返回一个值,注意:如果实参是常量(系统常量、符号常量)或者表达式,则无论定义时使用值传递还是地址传递,都是按值传递将常量或者表达式的计算值传
22、递给形参。,44,数组做为参数,Visual Basic,允许把数组作为实参传送到过程中。数组作参数是通过传地址方式传送。在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点,:,1,把一个数组的全部元素传送给一个过程,应将数组名分别写入形参列表中,并略去数组的上下界,但括号不能省略。,Private Sub Sort(a()As single),End Sub,其中形参“,a()”,即为数组,。,45,数组做为参数,2,被调过程可通过,Lbound,和,Ubound,函数确定实参数组的上、下界。,3,当用数组作形参时,对应的实参必须也是数组,且类型一致。,4,实参和形参结合是按地址传递
23、即形参数组和实参数组共用一段内存单元。,例如:定义了实参数组,b(1 to 8),,给它们赋了值,调用,Sort(),函数过程的形式如下:,Sort b(),或,Call,Sort(b,(),实参数组后面的括号可以省略,但为便于阅读,建议一般不要省略为好。,46,数组做为参数,调用时形参数组,a,和实参数组,b,虚实结合,共用一段内存单元,如下所示。因此在,Sort(),过程中改变数组,a,的各元素值,也就相当于改变了实参数组,b,中对应的元素的值,当调用结束时,形参数组,a,成为无定义。,b(1)b(2)b(3)b(4)b(5)b(6)b(7)b(8),a(1)a(2)a(3)a(4)a(
24、5)a(6)a(7)a(8),参数为数组时虚实结合示意图,47,编一函数,tim,,求任意一维数组中各元素之积。,Function,tim(a,()As Integer),Dim,t#,i,%,t=1,For i=,Lbound(a,)To,Ubound(a,):t=t*,a(i,),Next i,tim,=t,End Function,调用:,Sub Command1_Click(),Dim a%(1 To 5),,,b%(3 To 8),t1#=,tim(a,(),t2#=,tim(b,(),Print t1,,,t2,End Sub,48,在,一个过程执行期间又调用另一个过程,称为过程的
25、嵌套,.,调用,S1,调用,S2,S2,过程的嵌套,49,Fac(n,)=n!,N!=n(n-1)!,50,使用过程注意事项,1.,确定自定义的过程是子过程还是函数过程,函数过程名有值,子过程名无值。,2,过程中形参的个数和传递方式的确定,过程中参数的作用是实现过程与调用者的数据通信。,(1),从主调程序获得初值,值传递。,(2),将结果返回给主调程序,地址传递。,3.,实参与形参结合时对应问题,个数、类型、位置、次序一一对应。,形参是值传递,对应实参可以是表达式、常量、数组元素。,形参是地址传递,对应实参只能是简单变量。,数组、记录类型、对象只能是地址传递。,51,过程的作用域,Public
26、Private,Sub,子过程名,(,形式参数列表,),.,End Sub,通用子过程和函数过程既可写在,窗体模块中,也可写在,标准模块中,,在定义时可选用关键字,Private,(,局部),和,Public,(,全局),,来决定它们能被调用的范围。,52,过程的作用域,1,、,窗体,/,模块级过程:,加,Private,关键字的过程,只能被定义的窗体或模 块中的过程调用。,2,、,全局级过程:,加,Public,关键字,(或缺省),的过程,可供该应用程序的所有窗体和所有标准模块中的过程调用。,按过程的作用范围来划分,过程可分为:,模块级过程,全局级过程,53,过程的作用域,作用域,模块
27、级,全局级,窗体模块,标准模块,窗体模块,标准模块,定义方式,过程名前加,Private,,,例如:,Private Sub,Subl,(),过程名前加,Public,,,例如:,Public Sub Sub2(,形参表,),能否被本模块中其他过程调用,能,能,能,能,能否被本应用程序中其他模块调用,否,否,能,但必须在过程名前加窗体名,,例如:,Call Forml.Sub2(),能,但过程名必须唯一,否则必须在过程名前加标准模块名,例如:,Call Modulel.Sub2(),过程的作用域及过程定义、调用规则,54,变量的作用域与生存期,VB,的程序模块由一些过程组成,在过程中会使用到变
28、量,包括在形参表中出现的变量以及不在形参数表中出现的变量。本节要讨论的是不在形参表中出现的变量。,变量的定义位置不同,定义方式不同,允许被访问的范围和作用时间也不,相同。,变量,的,作用域,即指变量的有效,范围。,变量,的,生存期,即指变量的作用时间,。,55,变量的作用域,变量的作用域决定了应用程序中哪些过程可以访问该变量。按变量的作用域不同,可以将变量分为:,局部变量、窗体,/,模块级变量和全局变量。,56,局部变量,局部变量指在过程内用,Dim,语句声明的变量、未声明而直接使用的变量、用Static声明的变量。,这种变量只能在本过程中使用,不能被其他过程访问。在其他过程中如果有同名的变量
29、也与本过程的变量无关,即不同的过程中可以使用同名的变量。除了用Static声明的变量外,局部变量在其所在的过程每次运行时都被初始化。,57,模块级变量,模块级变量指在窗体模块或标准模块的通用声明段中用,Dim,语句或,Private,语句声明的变量。模块级变量的作用范围为其定义位置所在的模块,可以被本模块中的所有过程访问。模块级变量在其所在的模块运行时被初始化。,58,全局变量,全局变量指在模块的通用声明段中用,Public,语句声明的变量,其作用范围为应用程序的所有过程。全局变量在应用程序运行时被初始化。,59,变量的作用域及声明、使用规则,作用域,局部变量,模块级变量,全局变量,窗体模块
30、标准模块,声明方式,Dim、Static,Dim、Private,Public,声明位置,在,过程中,窗体模块、标准模块的通用声明段,窗体模块、标准模块的通用声明段,能否被本模块中其他过程调用,否,能,能,能否被本应用程序中其他模块调用,否,否,能,但要在变量名前加窗体名,能,60,一个标准模块文件中不同级的变量声明,Public Pa As integer,Private Mb As string*10,Sub F1(),Dim,Fa,As integer,End Sub,Sub F2(),Dim,Fb,As Single,End Sub,61,一个标准模块文件中不同级的变量声明,Publ
31、ic Pa As integer,全局变量,Private Mb As string*10,窗体,/,模块级变量,Sub F1(),Dim,Fa,As integer,局部变量,End Sub,Sub F2(),Dim,Fb,As Single,局部变量,End Sub,62,若在不同级声明相同的变量名,系统按局部、窗体,/,模块、全局次序访问如,Public Temp As integer,全局变量,Sub,Form_Load,(),Dim Temp As Integer,局部变量,Temp=10,访问局部变量,Form1.Temp=20,访问全局变量必须加窗体名,Print Form1.T
32、emp,Temp,显示,20 10,End Sub,63,变量的生存期,当一个过程被调用时,系统将给该过程中的变量分配存储单元,当该过程执行结束时,是释放还是保留变量的存储单元,这就是变量的生存期问题。,根据变量的生存期,可以将变量分为动态变量和静态变量。,64,动态变量,在应用程序中的变量如果不使用,Static,语句进行声,明,则属于,动态变量,。,对于过程级的动态变量,在程序运行到变量所在的过程时,系,统为变量分配存储空间,并进行变量的初始化工作;当该过程,结束时,释放变量所占用的存储空间,其值不再存在。,模块级动态变量在运行模块时被初始化,在退出模块时释放,其所占用的存储空间。,全局级
33、动态变量在应用程序执行时分配存储空间,,在退出应用程序时释放存储空间。,65,静态变量,如果一个变量用,Static,语句声明,则该变量只被初始化一次,在应用程序运行期间保留其值,即在每次调用该变量所在的过程时,该变量不会被重新初始化,而在退出变量所在的过程时,不释放该变量所占的存储空间。,66,静态变量,声明静态变量:,Static As,Static Function()As,Static Sub ,在,Function,过程、,Sub,过程的定义语句中使用,Static,修饰词,表明该过程内所有的局部变量均为静态变量。,67,静态变量,Private Function,sum(n,%),
34、Dim j As Integer,j=j+n,sum=j,End Function,Private Sub,Form_Click,(),Dim i%,,,isum,%,For i=1 To 5,isum,=,sum(i,),Print,isum,Next i,End Sub,取消,Static,1,2,3,4,5,68,静态变量,Private Function,sum(n,%),static j As Integer,j=j+n,sum=j,End Function,Private Sub,Form_Click,(),Dim i%,,,isum,%,For i=1 To 5,isum,=,s
35、um(i,),Print,isum,Next i,End Sub,1,2,3,4,5,Static,69,静态变量,例,Static,Sub SS1(),For I=1 To 10,S=S+I,Next I,Print S,End Sub,Private Sub ommand1_Click(),Call SS1,End Sub,取消,Static,70,静态变量,例,Static,Sub SS1(),For I=1 To 10,S=S+I,Next I,Print S,End Sub,Private Sub ommand1_Click(),Call SS1,End Sub,55,110,165
36、取消,Static,71,重点和难点,1,确定自定义的过程是子过程还是函数过程,函数过程名有值,子过程名无值。,过程有一个返回值,则使用函数过程;,若返回多个值或无返回值,一般使用子过程。,72,重点和难点,2,过程中形参的个数和传递方式的确定,过程中参数的作用是实现过程与调用者的数据通信,。,(1),从主调程序获得初值,值传递。,(2),将结果返回给主调程序,地址传递。,73,重点和难点,3.,实参与形参结合时对应问题,个数、类型、位置、次序一一对应。,形参是值传递,对应实参可以是表达式、常量、数组元素。,形参是地址传递,对应实参只能是简单变量。数组、记录类型、对象只能是地址传递。,74,重点和难点,4.,变量的作用域问题,局部变量、静态变量、全局变量特点、作用,75,要求,1,掌握函数过程的定义和调用,2,掌握子过程的定义与调用,3,理解和掌握参数传递,4,理解变量、过程的作用域,5,掌握递归的应用*,6,掌握常用算法*,76,第六章 过程,本次课已学习,第六章 过程,下次课学习,请同学们预习,第七章 常用控件,77,






