1、第9章第1页,共33页。在设计一个规模较大、复杂程度较高的程序时,往往根据需要按功能在设计一个规模较大、复杂程度较高的程序时,往往根据需要按功能将程序将程序分解成若干个相对独立的部分分解成若干个相对独立的部分,然后对每个部分分别编写一段程序,这些程序段称为,然后对每个部分分别编写一段程序,这些程序段称为 第2页,共33页。VB子程序分类图子程序分类图是对是对进行处理的程序段进行处理的程序段第3页,共33页。是指是指以规定语法结构组织的以规定语法结构组织的、可以被重复调用的可以被重复调用的、具有特定功能的具有特定功能的、相对独相对独立的立的程序段。程序段。不与任何特定的事件过程相关联,只能由别的
2、过程调用不与任何特定的事件过程相关联,只能由别的过程调用 声明声明 Sub 过程过程就是在就是在的代码窗口编写一个能实现预期功能的语句的代码窗口编写一个能实现预期功能的语句块。块。()Exit Sub 过程体过程体 第4页,共33页。每个通用过程都有一个每个通用过程都有一个同一模块中过程名不得重复。同一模块中过程名不得重复。过程前加上过程前加上Public关键字关键字或缺省,则该过程为或缺省,则该过程为,过程前加上过程前加上Private关键字关键字,则该过程为,则该过程为,只有在声明它的模块中才可以调用此过程。,只有在声明它的模块中才可以调用此过程。在过程名前加上在过程名前加上Static关
3、键字关键字,表明该过程的变量都是静态变量。,表明该过程的变量都是静态变量。形参列表形参列表是传递到过程中的变量名是传递到过程中的变量名(多个时用多个时用“,”分隔分隔),它指明了调用时传递给过程的参数的类型和个数它指明了调用时传递给过程的参数的类型和个数.过程可以有参数,也可以不带任何参数。根据需要而定过程可以有参数,也可以不带任何参数。根据需要而定 格式为:格式为:ByVal|ByRef变量名变量名()AS 数据类型数据类型,ByVal 表示按值传递;表示按值传递;ByRef 表示按地址传递表示按地址传递6、过程内不能再定义过程,过程定义也不能写在事件过程内、过程内不能再定义过程,过程定义也
4、不能写在事件过程内第5页,共33页。Sub Tryout(x as integer,y as integer)x=x+100 y=y*6 Print x,y End Sub 建立通用过程可以使用以下两种方法:建立通用过程可以使用以下两种方法:第6页,共33页。要执行一个过程,必须调用该过程要执行一个过程,必须调用该过程。调用的方法为:。调用的方法为:Call 过程名过程名(实参列表实参列表)过程名过程名 Sub 过程的调用过程的调用例:要调用前面的例:要调用前面的Tryout过程,可以使用下面两种方式:过程,可以使用下面两种方式:Tryout(a,b)或或 Tryout a ,b主过程主过程C
5、all 过程过程1End Sub过程过程1Call 过程过程2End Sub过程过程2End Sub调用的本质:转入被调用过程去执行调用的本质:转入被调用过程去执行,完成后返回完成后返回第7页,共33页。可以直接调用本模块中声明的过程或可以直接调用本模块中声明的过程或当定义的过程重名时,调用过程时,过程名前应加模块名修饰;当定义的过程重名时,调用过程时,过程名前应加模块名修饰;如果要调用如果要调用中声明的中声明的调用时过程名前调用时过程名前第8页,共33页。与与Sub 过程过程 的主要区别是:的主要区别是:Public|Private Static Function 函数过程名函数过程名()A
6、s End Function在函数体内,函数名可以当变量名使用,函数的返回值就是通过对函数名的赋值语句来实现的。即函数值通过函数名在函数体内,函数名可以当变量名使用,函数的返回值就是通过对函数名的赋值语句来实现的。即函数值通过函数名返回。返回。函数体中的函数体中的Exit Function语句的功能是强制退出函数并返回语句的功能是强制退出函数并返回函数过程需要返回的值的类型由函数过程需要返回的值的类型由 As 设置。设置。第9页,共33页。函数名函数名()不能独立成为语句,必须参加表达式的运算。不能独立成为语句,必须参加表达式的运算。下面是已知直角三角形两直角边的值,计算斜边的函数。下面是已知
7、直角三角形两直角边的值,计算斜边的函数。function myfun(A as integer,B as integer)as string myfun=sqr(A*A+B*B)End function 第10页,共33页。将前面的两个将前面的两个Sub过程改为过程改为Function过程。过程。Private Function triarea(As Double,As Double,As Double)Dim s As Double s=(x+y+z)/2 triarea=Sqr(s-x)*(s-y)*(s-z)*s)End FunctionPrivate Sub Command1_Clic
8、k()Dim a#,b#,c#,s#,intYesorNo%a=Val(Text1.Text):b=Val(Text2.Text)c=Val(Text3.Text)If a+b c And b+c a And c+a b Then Print 面积面积=;triarea(a,b,c)Else intYesorNo=suberr()无参数时,括号不能省略无参数时,括号不能省略 End IfEnd Sub第11页,共33页。通过全局变量实现各过程中共享数据通过全局变量实现各过程中共享数据(即在即在“通用通用”部份部份定义的变量,由该模块所有过程定义的变量,由该模块所有过程共享共享)通过过程调用实参
9、与形参的结合实现通过过程调用实参与形参的结合实现第12页,共33页。Sub过程和过程和Function函数过程中的函数过程中的中的参数称为中的参数称为,在程序中,在程序中调用调用Sub过程和过程和Function函数过程时函数过程时中称为实际参数中称为实际参数。在调用过程时,在调用过程时,就是就是把把“实参实参”依次依次按位置按位置传递给被调用过程的传递给被调用过程的“形参形参”,然后执,然后执行被调用过程中的语句。行被调用过程中的语句。Print greatcd(x,y)Public Function greatcd(m As Integer,n As Integer)与与 第13页,共33
10、页。按值传递按值传递就是将就是将传送给被调用过程中的传送给被调用过程中的。即:系统把实参复制一份传即:系统把实参复制一份传送给形参。送给形参。这样,这样,被调用的过程如果改变了形参的值,也不会改变实参的值。被调用的过程如果改变了形参的值,也不会改变实参的值。在在VB中,传值方式的标志为:中,传值方式的标志为:。这种传递方式这种传递方式,第14页,共33页。写出下列程序的运行结果写出下列程序的运行结果Sub tryout(ByVal x as integer,ByVal y as integer)x=x+100 y=y*6 print “x=“;x.”y=“;yEnd SubSub Form_c
11、lick()Dim a%,b%a=10:b=20 tryout a,b Print “a=“;a,”b=“;bEnd Sub传值:传值:X=110 y=120a=10 b=20第15页,共33页。传址方式是将实参在内存的地址传递给形参,也就是实参、形传址方式是将实参在内存的地址传递给形参,也就是实参、形参公用内存的参公用内存的“地址地址”。在在VB中,按址传递数据是在形参前加上中,按址传递数据是在形参前加上ByRef(默认方式)。(默认方式)。这种传递方式这种传递方式,即调用时实参将值传递给,即调用时实参将值传递给形参;调用结束由形参将操作结果返回给实参。当用传址方式时,形参;调用结束由形参将
12、操作结果返回给实参。当用传址方式时,ByVal ByRef 第16页,共33页。Sub tryout(ByRef x as integer,ByRef y as integer)x=x+100 y=y*6 print “x=“;x.”y=“;yEnd SubSub Form_click()Dim a%,b%a=10:b=20 tryout a,b Print “a=“;a,”b=“;bEnd Sub传址:传址:X=110 y=120a=110 b=120第17页,共33页。Visual Basic允许把数组作为实参传送到过程中。数组作参数是通过传地址方式传允许把数组作为实参传送到过程中。数组作
13、参数是通过传地址方式传送。在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点:送。在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点:1为了把一个数组的全部元素传送给一个过程,应将数组名分别写入形参表为了把一个数组的全部元素传送给一个过程,应将数组名分别写入形参表中,并略去数组的上下界,但括号不能省略。中,并略去数组的上下界,但括号不能省略。Private Sub Sort(a()As single)End Sub其中形参其中形参“a()”即为数组。即为数组。第18页,共33页。2被调过程可通过被调过程可通过Lbound和和Ubound函数确定实参数组的上、下界。函数确定实参数
14、组的上、下界。3当用数组作形参时,对应的实参必须也是数组,且类型一致。当用数组作形参时,对应的实参必须也是数组,且类型一致。4实参和形参结合是按地址传递,即形参数组和实参数组共用一段内存单元。实参和形参结合是按地址传递,即形参数组和实参数组共用一段内存单元。例如:定义了实参数组例如:定义了实参数组b(1 to 8),给它们赋了值,调用,给它们赋了值,调用Sort()函数过程的形式如下:函数过程的形式如下:Sort b()或或 Call Sort(b()实参数组后面的括号可以省略,但为便于阅读,建议一般不要省略为好。实参数组后面的括号可以省略,但为便于阅读,建议一般不要省略为好。第19页,共33
15、页。调用时形参数组调用时形参数组a和实参数组和实参数组b虚实结合,共用一段内存单元,如图虚实结合,共用一段内存单元,如图6-7所示。因此在所示。因此在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(5)a(6)a(7)a(8)参数为数组时虚实结合示意图参数为数组时虚实结合示意图 第20页,共33页。在过程的形参列表中加入在过
16、程的形参列表中加入Optional关键字关键字,就可以指定过程的参数,就可以指定过程的参数为可选的。如果指定了可选参数,则为可选的。如果指定了可选参数,则参数表中此参数后面的其它参数也必是可参数表中此参数后面的其它参数也必是可选的选的,并且要用,并且要用Optional关键字来声明。关键字来声明。求两个数的和的函数过程。求两个数的和的函数过程。函数过程:函数过程:Public Function mysum(first As Integer,second As Long,Optional third)mysum=first+second If Not IsMissing(third)Then m
17、ysum=mysum+thirdEnd Function第21页,共33页。事件过程:事件过程:Private Sub Command1_Click()Dim a As Integer,b As Long,c As Double Dim sum As Integer a=10:b=20 Sum=mysum(a,b)Print sum=;Sum a=10:b=20:c=30 Sum=mysum(a,b,c)Print sum=;SumEnd SubIsMissing()第22页,共33页。一般说来,过程调用中的参数个数应等于过程说明的参数个数。一般说来,过程调用中的参数个数应等于过程说明的参数个
18、数。在传递参数时,在传递参数时,如果如果要求参数的数目可以变化要求参数的数目可以变化,则在函数过程或,则在函数过程或Sub过程的过程的ParamArray关键关键字字(不能与(不能与ByVal ByDef连用)连用)指明。指明。格式如下:格式如下:Sub 过程名过程名(其他参数其他参数,ParamArray ()第23页,共33页。Private Sub Command1_Click()Dim s(),a%,b As Long,c As Variant,d As Double s=Array(1,2,3,4,5)Print sum=;multisum(s(0),s(2),s(4)a=1000:
19、b=10000:c=100:d=10 Print sum=;multisum(a,b,c,d)End Sub Public Function multisum(ParamArray p()Dim int1%,sum as variant For int1=LBound(p)To UBound(p)sum=sum+p(int1)Next multisum=sum End Sub第24页,共33页。窗体参数 形参定义格式:形参名 As form 调用时实参:必须为某个窗体名称 控件参数:形参定义格式:形参名 As Control 调用时实参:可为任意一个控件对象第25页,共33页。变量的作用域根据
20、变量的作用域,变量分为()变量、变量和变量变量 在过程中用Dim/static语句定义,只存在于过程中 用Dim 定义的变量称为动态变量,生存期为过程的一次调用.用Static定义的变量称为静态变量,生存期为整个应用程序的执行期间(重点掌握,举例)变量 Dim语句或Private语句定义,模块中的所有过程都可使用变量 Public语句定义,可以在所有模块中使用第26页,共33页。Private Sub Form_Click()Dim acc As Integer,i As Integer acc=0 For i=1 To 3 acc=acc+funa(i)Next i Print accEnd
21、 SubPrivate Function funa(x As Integer)As Integer Static s As Integer s=s+x funa=sEnd Function运行时单击窗体运行时单击窗体,程序输出结果为程序输出结果为:第27页,共33页。能能变量名前加窗体名不能不能被其他模块存取能能不能被本模块的其他过程存取通用声明通用声明过程中声明位置PublicDimPrivateDimStatic声明方式标准模块窗体全局变量窗体/模块级变量局部变量作用范围不同作用范围的三种变量声明及使用规则第28页,共33页。不同作用范围的二种过程定义及调用规则能但过程名必须唯一,否则要加
22、标准模块名能但必须在过程名前加窗体名不能不能能否被本应用程序其他模块调用能能能能能否被本模块其他过程调用Public缺省Private定义方式 标准模块窗体标准模块窗体全局级模块级作用范围根据过程的作用域,过程分为级和级。第29页,共33页。1、过程的嵌套过程的嵌套 在程序中调用一子过程,而在子过程中又调用另外的子过程,这种程序结构称为在程序中调用一子过程,而在子过程中又调用另外的子过程,这种程序结构称为过程的嵌套。过程的嵌套。过程的嵌套调用执行过程如过程的嵌套调用执行过程如下图:下图:第30页,共33页。2、过程的递归调用过程的递归调用 用自身的结构来描述自身,称递归。例如,对阶乘的定义:用
23、自身的结构来描述自身,称递归。例如,对阶乘的定义:)!2()1()!1()!1(!nnnnnn Visual Basic允许在一个允许在一个Sub子过程和子过程和Function过程的定义内部调用自己,即过程的定义内部调用自己,即递归递归Sub子过程和递归子过程和递归Function函数。函数。直接调用自己称为直接递归调用直接调用自己称为直接递归调用 间接调用自己称为间接递归调用间接调用自己称为间接递归调用第31页,共33页。Private Function fac(n As Integer)As Integer If n=1 Then fac=1 Else fac=n*fac(n-1)End
24、 IfEnd FunctionPrivate Sub Form_Click()Print“fac(4)=”;fac(4)End Sub程序的递归过程:第32页,共33页。说明:说明:递归处理分递推和回归两个过程,如上图所示。递归处理分递推和回归两个过程,如上图所示。当一个大问题能够分解成同类型的小问题当一个大问题能够分解成同类型的小问题,且问题且问题 规模在逐渐减小规模在逐渐减小,才适合用递归解决才适合用递归解决.使用递归算法必须要满足以下的递归条件:使用递归算法必须要满足以下的递归条件:(1)存在递归结束条件及结束时的值;)存在递归结束条件及结束时的值;(2)能用递归形式表示,且递归向终止条件发展。)能用递归形式表示,且递归向终止条件发展。第33页,共33页。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。