《第5章 过程(精品).ppt》由会员分享,可在线阅读,更多相关《第5章 过程(精品).ppt(64页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 如同常量的定义一样,有时不仅仅是几个数字反复如同常量的定义一样,有时不仅仅是几个数字反复出现在程序中,而且是很多段代码在做几乎同样的事,出现在程序中,而且是很多段代码在做几乎同样的事,如果有一些通用的代码可供调用的话,那么程序就会简如果有一些通用的代码可供调用的话,那么程序就会简练得多,而且更为清晰,这就是过程与函数。练得多,而且更为清晰,这就是过程与函数。VbVb中使用中使用的过程分为子程序过程、函数过程和属性过程。的过程分为子程序过程、函数过程和属性过程。5 5 5 5 过过过过 程程程程过程过程子程序过程(子程序过程(SUBSUB)函数过程(函数过程(FUNCTIONFUNCTION)
2、事件过程事件过程通用过程通用过程窗体过程窗体过程控件过程控件过程9.1 9.1 通用过程通用过程通用过程通用过程通用过程通用过程过程过程过程过程事件过程事件过程事件过程事件过程 (1 1)打开代码窗口(双击控件或窗体,单击查看)打开代码窗口(双击控件或窗体,单击查看代码)代码)选择对象和事件选择对象和事件输入代码输入代码保存保存 1、建立事件过程、建立事件过程加入对发生事件进行处理的代码的过程,称为事件过程。加入对发生事件进行处理的代码的过程,称为事件过程。加入对发生事件进行处理的代码的过程,称为事件过程。加入对发生事件进行处理的代码的过程,称为事件过程。事件过程事件过程事件过程事件过程 (2
3、 2)“工具工具”菜单菜单“添加过程添加过程”(如下图)(如下图)输入代码输入代码保存保存 (1)控件事件过程形式:)控件事件过程形式:事件过程事件过程事件过程事件过程Private Sub Private Sub 控件名控件名_ _事件名事件名 (argumentlistargumentlist)语句块语句块End SubEnd Sub说明:说明:(1 1)控控件件名名必必须须与与窗窗体体中中某某个个控控件件相相匹匹配配,否否则则为为通通用用过过程程且该过程也属于私有过程。且该过程也属于私有过程。(2 2)argumentlistargumentlist 指指的的是是参参数数列列表表,所所谓
4、谓参参数数,就就是是指指过过程程操操作作所所需需的的指指导导条条件件。有有无无参参数数由由事事件件本本身身决决定定,用用户户不不可可以以自行添加。自行添加。2 2 2 2、定义事件过程、定义事件过程、定义事件过程、定义事件过程Private Sub Private Sub FormForm_ _事件名事件名 (argumentlistargumentlist)语句块语句块EndSub2)窗体事件过程形式:)窗体事件过程形式:事件过程事件过程事件过程事件过程说明:说明:(1 1)Private Private 表明该过程的使用范围是模块级的,在该窗体之表明该过程的使用范围是模块级的,在该窗体之外
5、是不可见的。外是不可见的。(2 2)不论定义的窗体名称为什么,均用)不论定义的窗体名称为什么,均用Form Form 或或MIDFORMMIDFORM(多文(多文档界面窗体)表示。档界面窗体)表示。(3 3)事件由事件由VBVB提供。注意部分事件的发生顺序:提供。注意部分事件的发生顺序:InitializeInitialize 、Load Load、ActivateActivate、GotFocusGotFocus事件的发生顺序是依次的。事件的发生顺序是依次的。事件过程事件过程事件过程事件过程Initialize:Initialize:初始化事件,是在窗体被加载(初始化事件,是在窗体被加载(L
6、oadLoad)之前,)之前,窗体被配置的时候触发。窗体被配置的时候触发。Load Load:加载事件,:加载事件,VBVB把窗体从磁盘或从磁盘的缓冲区读把窗体从磁盘或从磁盘的缓冲区读入内存时发生。入内存时发生。ActivateActivate:激活事件,是在窗体已经被装入内存,变成被:激活事件,是在窗体已经被装入内存,变成被激活的窗体时触发。激活的窗体时触发。GotFocusGotFocus:获得焦点事件,在窗体成为当前焦点时触发。:获得焦点事件,在窗体成为当前焦点时触发。例题例题例题例题 事件过程事件过程事件过程事件过程演示源程序 引例引例1 1:编程时经常要用到两个数的交换,可以将其编:
7、编程时经常要用到两个数的交换,可以将其编写成过程。写成过程。将多次被重复使用的程序段设计成一个具有一定功能的将多次被重复使用的程序段设计成一个具有一定功能的独立程序段,即为通用过程。独立程序段,即为通用过程。5.1.15.1.1通用过程通用过程通用过程通用过程通用过程通用过程通用过程通用过程代码如下:代码如下:Public Sub Public Sub swap(xswap(x,y),y)Dim t As Integer Dim t As Integer t=x t=x x=y x=y y=t y=tEndSub 通用过程通用过程通用过程通用过程1 1、建立、建立SUBSUB过程过程 在窗体模
8、块:在窗体模块:(1 1)打开代码编辑器窗口)打开代码编辑器窗口选择工具菜单选择工具菜单选择添加过程选择添加过程(2 2)在代码编辑器窗口中选择)在代码编辑器窗口中选择“通用通用声明声明”在标准模块:在标准模块:(1 1)打开)打开“工程工程”菜单中菜单中“添加模块添加模块”选择选择“新建新建”打开模块代码窗口打开模块代码窗口选择工具菜单选择工具菜单选择添加过程选择添加过程(2 2)打开)打开“工程工程”菜单中菜单中“添加模块添加模块”选择选择“新建新建”打开模块代码窗口打开模块代码窗口输入过程名回车输入过程名回车形式如下:形式如下:Private/Private/PublicStaticPu
9、blicStatic Sub Sub 过程名过程名 (参数列表参数列表)局部变量和常量声明局部变量和常量声明 语句块语句块 Exit SubExit Sub 语句块语句块 End SubEnd Sub2.2.2.2.通用过程的定义通用过程的定义通用过程的定义通用过程的定义:通用过程通用过程通用过程通用过程Public Sub swap(x,y)Dim t As Integer t=x:x=y:y=tEnd Sub例例通用过程通用过程通用过程通用过程说明:说明:(1 1)Private/PublicPrivate/Public可缺省,若缺则系统默认为可缺省,若缺则系统默认为PublicPubli
10、c。StaticStatic如果不省则指定过程中的局部变量为如果不省则指定过程中的局部变量为“静态静态”变量。变量。(2 2)过程名命名规则和变量名相同,且不能重名。)过程名命名规则和变量名相同,且不能重名。(3 3)参数列表中的参数是形式参数,可以是变量名或数组名)参数列表中的参数是形式参数,可以是变量名或数组名(此时要加(),参数可以省略,但是外层()不可省,若有(此时要加(),参数可以省略,但是外层()不可省,若有多个参数,则用逗号分开。多个参数,则用逗号分开。(4)形参变量的类型如果被说明为)形参变量的类型如果被说明为“String”,它只能是不定,它只能是不定长的。而在调用该过程时,
11、对应的实在参数可以是定长的字符串长的。而在调用该过程时,对应的实在参数可以是定长的字符串型变量或字符串型数组元素。如果形参是字符串数组,则没有此型变量或字符串型数组元素。如果形参是字符串数组,则没有此限制。限制。(5)过程体中)过程体中ExitSub可以有多个,执行到此语句,立即退出可以有多个,执行到此语句,立即退出该过程。该过程。Sub过程不可以嵌套。过程不可以嵌套。3.SUB过程调用过程调用通用过程通用过程通用过程通用过程格式格式1 1:CALL CALL 过程名过程名 (实参表)(实参表)格式格式2 2:过程名:过程名 实参实参1 1,实参实参2 2,说明:(说明:(1 1)过程名是被调
12、用过程的名字,当调用程序执)过程名是被调用过程的名字,当调用程序执行到此代码时,行到此代码时,VBVB将开始执行被调用过程。将开始执行被调用过程。(2 2)实实参参是是传传送送给给被被调调用用过过程程的的变变量量、常常数数或或表表达达式式。实实参参的的个个数数和和类类型型、顺顺序序应应与与被被调调过过程程的的形形参参相相匹匹配配,且且每每个个参参数数之之间间应应用用逗逗号号分分隔隔。对对于于格格式式1 1,若若被被调调过过程程无无参参数数,则则(实实参参表表)可可以以省省略略。而而格格式式2 2,不不论是否有参数,实参列表均不需要加括号。论是否有参数,实参列表均不需要加括号。例例1:调用两数交
13、换过程:调用两数交换过程 通用过程通用过程通用过程通用过程Private Sub Private Sub swap(xswap(x,y),y)Dim t As Integer Dim t As Integer t=x:x=y:y=t t=x:x=y:y=tEnd SubEnd SubPrivate Sub Command1_Click()Private Sub Command1_Click()Dim a As Integer,b As Integer Dim a As Integer,b As Integer a=Val(Text1.Text)a=Val(Text1.Text)b=Val(Te
14、xt2.Text)b=Val(Text2.Text)swap a,b swap a,b 或或 call swap(call swap(a,ba,b)Text1.Text=a Text1.Text=a Text2.Text=b Text2.Text=bEnd SubEnd Sub例例2:将以前学过的冒泡排序改写成过程调用的形式:将以前学过的冒泡排序改写成过程调用的形式通用过程通用过程通用过程通用过程 Private Sub Private Sub bubble_sort(sortbubble_sort(sort()As Integer)()As Integer)Dim i As Integer,
15、j As Integer Dim i As Integer,j As Integer,Temp As IntegerTemp As Integer For i=1 To For i=1 To UBound(sortUBound(sort)-1)-1 For j=1 To For j=1 To UBound(sortUBound(sort)-i)-i If If sort(jsort(j)sort(jsort(j+1)Then+1)Then Temp=Temp=sort(jsort(j)sort(jsort(j)=)=sort(jsort(j+1)+1)sort(jsort(j+1)=Temp+
16、1)=Temp End If End If Next j Next j Next i Next i End Sub End Sub 通用过程通用过程通用过程通用过程 Option ExplicitOption Explicit :Option Base 1 Option Base 1 Private Sub Command1_Click()Private Sub Command1_Click()Dim number(10)As Integer,i As Integer Dim number(10)As Integer,i As Integer Randomize Randomize For i
17、=1 To 10 For i=1 To 10 number(inumber(i)=Int(100-1)*)=Int(100-1)*RndRnd)+1)+1 Text1=Text1=Text1Text1&number(inumber(i)&)&“”Next i Next i Call Call bubble_sort(numberbubble_sort(number)For i=1 To 10 For i=1 To 10 Text2=Text2=Text2Text2&number(inumber(i)&)&“”Next i Next i End Sub End Sub5.1.2FUNCTION5
18、.1.2FUNCTION函数函数FUNCTIONFUNCTION函数的建立与定义函数的建立与定义函数的建立与定义函数的建立与定义FUNCTIONFUNCTION函数的调用函数的调用函数的调用函数的调用调用其它模块中的过程调用其它模块中的过程调用其它模块中的过程调用其它模块中的过程常量常量常量常量1.FUNCTION1.FUNCTION1.FUNCTION1.FUNCTION函数的建立函数的建立函数的建立函数的建立FunctionFunction函数的建立与函数的建立与SUBSUB类似。类似。2.FUNCTION2.FUNCTION2.FUNCTION2.FUNCTION函数的定义函数的定义函数
19、的定义函数的定义Private/Private/PublicStaticPublicStatic Function Function 函数名函数名 (参数列表参数列表)as as 数据类型数据类型 局部变量和常量声明局部变量和常量声明 语句块语句块 函数名函数名=表达式表达式 Exit Function Exit Function 语句块语句块 函数名函数名=表达式表达式 End End FunctionFunction FUNCTION FUNCTION FUNCTION FUNCTION函数的建立与定义函数的建立与定义函数的建立与定义函数的建立与定义 FUNCTION FUNCTION F
20、UNCTION FUNCTION函数的建立与定义函数的建立与定义函数的建立与定义函数的建立与定义说明:说明:Function函数和Sub过程的区别:两者的主要区别是有无返回值。SUB过程没有返回值,而Function函数有返回值。注意事项:函数中“函数名=表达式”语句功能是给函数名赋值,通常情况下在函数体内至少要对函数名进行一次赋值,若缺省,则返回对应类型的缺省值。因为函数有返回值,所以过程名也有类型。“As 数据类型”指定函数类型,若缺省,默认为变体型。而SUB过程名没有值,因而也没有类型,且在子过程体内也不能对子过程名赋值。只要能定义成函数过程的就一定能定义成子过程,反之不一定。格式如下:
21、格式如下:格式格式1 1:函数名(:函数名(实参表实参表)格式格式2 2:CALL CALL 函数名(实参)函数名(实参)格式格式3 3:函数名:函数名 实参实参 FUNCTIONFUNCTIONFUNCTIONFUNCTION函数的调用函数的调用函数的调用函数的调用说明:通常用第一种比较多,用后两种方法调说明:通常用第一种比较多,用后两种方法调用函数时用函数时VBVB放弃函数的返回值。放弃函数的返回值。例题例题例题例题1 1、试将两数交换的、试将两数交换的SUBSUB过程改写成过程改写成FUNCTIONFUNCTION过程过程2 2、编写一段求三角形面积的函数,并多次调用。、编写一段求三角形
22、面积的函数,并多次调用。Public Function Public Function area(xarea(x,y,z)As Single,y,z)As Single Dim p As Single Dim p As Single p=1/2*(x+y+z)p=1/2*(x+y+z)area=area=Sqr(pSqr(p*(p-x)*(p-y)*(p-z)*(p-x)*(p-y)*(p-z)End Function End Function FUNCTION FUNCTION FUNCTION FUNCTION函数的调用函数的调用函数的调用函数的调用调用调用调用调用 Private Sub
23、 Command1_Click()Private Sub Command1_Click()Dim a As Single,b As Single,c As Single,d Dim a As Single,b As Single,c As Single,d As Single,e As Single,f As Single,s1 As As Single,e As Single,f As Single,s1 As Single,s2 As SingleSingle,s2 As Single a=a=InputBoxInputBox(输入输入a a:)b=b=InputBoxInputBox(输
24、入输入b b:)c=c=InputBoxInputBox(输入输入c c:)d=d=InputBoxInputBox(输入输入d d:)e=e=InputBoxInputBox(输入输入e e:)f=f=InputBoxInputBox(输入输入f f:)s1=s1=area(aarea(a,b,c):s2=,b,c):s2=area(darea(d,e,f),e,f)Text1.Text=Val(s1+s2)Text1.Text=Val(s1+s2)End Sub End Sub FUNCTION FUNCTION FUNCTION FUNCTION函数的调用函数的调用函数的调用函数的调用函
25、数调用函数调用试分别用试分别用Sub Sub 和和FunctionFunction编写求某级数部分和的过程,并调用之。编写求某级数部分和的过程,并调用之。Private Sub js2(s As Single,x As Integer)Private Sub js2(s As Single,x As Integer)Dim k As Integer,t As Double Dim k As Integer,t As Double t=1 t=1 Do Do k=k+1 k=k+1 t=t*k/(x+k)t=t*k/(x+k)s=s+t s=s+t Loop Until t=10(-6)Loop
26、 Until t=10(-6)End Sub End Sub FUNCTION FUNCTION FUNCTION FUNCTION函数的调用函数的调用函数的调用函数的调用SubSub过程:过程:求下列数列的和,规定计算到第求下列数列的和,规定计算到第求下列数列的和,规定计算到第求下列数列的和,规定计算到第k k k k项的值项的值项的值项的值10101010-6-6-6-6为止。为止。为止。为止。(输入(输入(输入(输入X=2X=2X=2X=2测试程序,正确结果为测试程序,正确结果为测试程序,正确结果为测试程序,正确结果为S=0.9985868S=0.9985868S=0.9985868S=
27、0.9985868)。)。)。)。k!k!k!k!S=S=S=S=-k=1 (x+1)(x+2)k=1 (x+1)(x+2)k=1 (x+1)(x+2)k=1 (x+1)(x+2)(x+kx+kx+kx+k)FunctionFunction函数:函数:Private Function js1(x As Integer)As SinglePrivate Function js1(x As Integer)As Single Dim k As Integer,t As Double Dim k As Integer,t As Double t=1 t=1 Do Do k=k+1 k=k+1 t=t
28、*k/(x+k)t=t*k/(x+k)js1=js1=js1js1+t+t Loop Until t=10(-6)Loop Until t 0 Do While n 0 fact=fact=factfact*n*n n=n n=n 1 1 Loop Loop End Function End Function 按地址传递按地址传递按地址传递按地址传递例例1 1:求:求1 1!+2+2!+3+3!+4+4!+5+5!的和。!的和。Private Sub Private Sub Form_ClickForm_Click()()Dim sum As Integer,i As Integer Dim
29、sum As Integer,i As Integer For i=5 To 1 Step For i=5 To 1 Step 1 1 sum=sum=sumsum+fact(8)+fact(8)Next I Next I Print sum=;sum Print sum=;sum End Sub End Sub 按地址传递按地址传递按地址传递按地址传递例例2 2:四则运算:四则运算 Private Function Private Function add(aadd(a As Integer,b As Integer,As Integer,b As Integer,c As Integer)
30、c As Integer)a=a+10:b=b+10:c=c+10 a=a+10:b=b+10:c=c+10 add=a+b+c add=a+b+c End Function End Function Private Sub Private Sub Form_ClickForm_Click()()Dim v1 As Integer,v2 As Integer,v3 As Integer Dim v1 As Integer,v2 As Integer,v3 As Integer v1=2:v2=3:v3=4 v1=2:v2=3:v3=4 Print v1+v2+v3*add(v1,v2,v3)P
31、rint v1+v2+v3*add(v1,v2,v3)End Sub End Sub 按地址传递按地址传递按地址传递按地址传递例例3 3:阅读下面程序,窗体上第一行:阅读下面程序,窗体上第一行_,第二行是,第二行是_,_,第第三行是三行是_._.Private Sub Private Sub Form_ClickForm_Click()()Dim x As Integer,y As Integer,z As IntegerDim x As Integer,y As Integer,z As Integerx=1:y=2:z=3x=1:y=2:z=3Call Call change(xchang
32、e(x,x,z),x,z)Print x,y,zPrint x,y,zCall Call change(ychange(y,y,(z),y,(z)Print x,y,zPrint x,y,zEnd SubEnd SubPrivate Sub Private Sub change(xchange(x As Integer,y As Integer,_ As Integer,y As Integer,_ z As Integer)z As Integer)x=z+6 :y=z+3 :z=x+yx=z+6 :y=z+3 :z=x+yPrint x,y,zPrint x,y,zEnd SubEnd S
33、ub结果为:结果为:6612621215153061512 按地址传递按地址传递按地址传递按地址传递4 4、执行下面程序,单击按钮、执行下面程序,单击按钮Command1Command1,窗体上显示的结果中,窗体上显示的结果中I I的的值是值是_,J J的值是的值是_,K K的值是的值是_。Option ExplicitOption ExplicitPrivate Sub Command1_Click()Private Sub Command1_Click()Dim I As Integer,J As Integer Dim I As Integer,J As Integer Dim K As
34、 Integer Dim K As Integer I=1:J=2 I=1:J=2 K=FUN(I,FUN(I,J)+I+J K=FUN(I,FUN(I,J)+I+J Print I=;I;J=;J;K=;K Print I=;I;J=;J;K=;KEnd SubEnd SubPrivate Private Function Function FUN(A FUN(A As As Integer,Integer,ByValByVal B B As As Integer)Integer)As IntegerAs Integer A=A+B A=A+B :B=A+B B=A+B :FUN=A+BFU
35、N=A+BEnd FunctionEnd Function执行结果:执行结果:I=11J=2K=43数组可以作为形式参数。数组可以作为形式参数。格式为:格式为:形参数组名()形参数组名()ASAS类型类型。但形参数组只能是按地址传递的参数。对应但形参数组只能是按地址传递的参数。对应实参的类型,长度必须和形参一致,数组名在实实参的类型,长度必须和形参一致,数组名在实参中后面不加一对括号。在被调用的过程中不可参中后面不加一对括号。在被调用的过程中不可以用以用DIMDIM对形参进行声明,但是动态数组时,可以对形参进行声明,但是动态数组时,可以用用REDIMREDIM来重新定义数组的维界与大小。来重新
36、定义数组的维界与大小。数组参数数组参数数组参数数组参数 数组参数数组参数数组参数数组参数例例4 4:求任一一维数组元素之和:求任一一维数组元素之和 Private Function Private Function tim(atim(a()As Integer)()As Integer)Dim t As Double,i As Integer Dim t As Double,i As Integer t=0 t=0 For i=For i=LBound(aLBound(a)To)To UBound(aUBound(a)t=t+t=t+a(ia(i)Next i Next i timtim=t=
37、t End Function End Function 数组参数数组参数数组参数数组参数例例4 4:求任一一维数组元素之和:求任一一维数组元素之和 Private Sub Private Sub Form_ClickForm_Click()()Dim a(1 To 5)As Integer,b(2 To 10)As Integer,Dim a(1 To 5)As Integer,b(2 To 10)As Integer,i As Integer,t1 As Integer,t2 As Long i As Integer,t1 As Integer,t2 As Long For i=1 To 5
38、 For i=1 To 5 a(ia(i)=i)=i Next i Next i For i=2 To 10 For i=2 To 10 b(ib(i)=i)=i Next i Next i t1=t1=tim(atim(a)t2=t2=tim(btim(b)Print t1=;t1,t2=;t2 Print t1=;t1,t2=;t2 End Sub End Sub 数组参数数组参数数组参数数组参数例例5 5:Private Sub Private Sub change(achange(a()As Integer)()As Integer)Dim i As Integer Dim i As
39、Integer ReDimReDim a(7)a(7)For i=1 To 7 For i=1 To 7 a(ia(i)=I)=I Next I Next I End Sub End Sub 数组参数数组参数数组参数数组参数例例5 5:Option ExplicitOption Explicit Option Base 1Option Base 1 Private Sub Private Sub Form_ClickForm_Click()()Dim Dim arrayaarraya()As Integer,i As Integer()As Integer,i As Integer ReDim
40、ReDim arraya(5)arraya(5)Print Print 调用前上界是调用前上界是:;:;UBound(arrayaUBound(arraya)Call Call change(arrayachange(arraya)Print Print 调用后上界是调用后上界是:;:;UBound(arrayaUBound(arraya)Print Print 数组各元素的值是数组各元素的值是:;:;For i=1 To For i=1 To UBound(arrayaUBound(arraya)Print Print arraya(iarraya(i););Next i Next i Pr
41、int Print End Sub End Sub对象参数对象参数窗体参数窗体参数窗体参数窗体参数参数参数参数参数控件参数控件参数控件参数控件参数 对象也可以作为参数传递,但也对象也可以作为参数传递,但也只能是按地址来传递。在形参中若是只能是按地址来传递。在形参中若是控件,则类型声明为控件,则类型声明为“CONTRALCONTRAL”,若是,若是窗体,则类型声明为窗体,则类型声明为“FORMFORM”。对象参数对象参数对象参数对象参数 对象参数对象参数对象参数对象参数例例6 6:Public Sub Public Sub cf(ByValcf(ByVal colorfrmcolorfrm As
42、 Form)As Form)Dim i As Integer Dim i As Integer,gradcolorgradcolor As Long As Long colorfrm.ScaleModecolorfrm.ScaleMode=3=3:colorfrm.DrawStylecolorfrm.DrawStyle=6=6 colorfrm.DrawWidthcolorfrm.DrawWidth=2=2:colorfrm.AutoRedrawcolorfrm.AutoRedraw=True=True For i=1 To 64 For i=1 To 64 gradcolorgradcolo
43、r=RGB(0,0,255-(i*4-1)=RGB(0,0,255-(i*4-1)colorfrm.Linecolorfrm.Line (0,(0,colorfrm.ScaleHeightcolorfrm.ScaleHeight *(i(i-1)1)/64)-64)-(colorfrm.ScaleWidth,colorfrm.ScaleHeightcolorfrm.ScaleWidth,colorfrm.ScaleHeight*i/64),*i/64),gradcolorgradcolor,BF,BF Next i Next i colorfrm.Refreshcolorfrm.Refresh
44、 Form1.Hide Form1.Hide colorfrm.Showcolorfrm.ShowEnd SubEnd Sub5.3 .3 递归过程递归过程递归的概念 用自身的结构来描述自身称为“递归”即一个过程调用过程本身,在递归调用中,一个过程执行的某一步要用到它自身的上一步或上几步的结果。例如:最典型的例子是对阶乘运算可作如下定义:n!=n*(n-1)!(n-1)!=(n-1)*(n-2)!递归过程递归过程递归过程递归过程递归有两种递归有两种递归有两种递归有两种直接递归:自己调用自己直接递归:自己调用自己间接递归:间接递归:A A调用调用B B,B B调用调用A A递归过程中必须有递归结
45、束语句。递归过程中必须有递归结束语句。递归子过程和递归函数递归子过程和递归函数递归子过程和递归函数递归子过程和递归函数 VBVB允允许许一一个个子子过过程程或或函函数数在在自自身身定定义义的的内内部部调调用用自自己己,这这样样的的子子过过程程或或函函数数称称为为递递归归子子过过程程或或递递归归函函数数。许许多多问问题题中中具具有有递递归归的的特特性性,用用递递归归调调用用描描述述它它们们就就非非常方便。常方便。注注意意:递递归归过过程程必必须须有有一一个个结结束束递递归归的的终终止止条条件件,否否则则会无限制的执行下去。会无限制的执行下去。9.7 9.7 9.7 9.7 递归过程递归过程递归过
46、程递归过程例例7 7、求求fac(nfac(n)=n!)=n!的值的值 调调用用fac(4)=4*fac(3)fac(3)=3*fac(2)fac(2)=2*fac(1)fac(1)=1fac(2)=2*1fac(3)=3*2fac(4)=4*6返返回回 递归过程递归过程递归过程递归过程Public Function Public Function fac(nfac(n As Integer)As Integer As Integer)As Integer If n=1 Then If n=1 Then facfac=1=1 Else Else facfac=n*fac(n-1)=n*fac(
47、n-1)End If End IfEnd FunctionEnd FunctionPrivate Sub Command1_Click()Private Sub Command1_Click()Print Print“fac(4)=fac(4)=“;fac(4);fac(4)End SubEnd Sub 递归过程递归过程递归过程递归过程 1 1、求阶乘。、求阶乘。n!=n*(n-1)!n!=n*(n-1)!2 2、求求菲菲波波那那契契数数列列前前1010项项。F(1)=1F(1)=1,F(2)=1F(2)=1,后后面面各各项项满满 足:足:F(nF(n)=F(n-1)+F(n-2)=F(n-1
48、)+F(n-2)3 3、求两个数的最大公约数。求两个数的最大公约数。相关习题:相关习题:5.4 5.4 变量的作用域变量的作用域变量的作用域变量的作用域变量的作用域变量的作用域过程的作用域过程的作用域过程的作用域过程的作用域静态变量静态变量静态变量静态变量同名变量同名变量同名变量同名变量 5.4.1 5.4.1 5.4.1 5.4.1 变量的作用域变量的作用域变量的作用域变量的作用域应用程序(.vbp文件)类模块(.cls)文件一个或若干个窗体模块(*.frm)文件用户自定义子过程(Sub)用户自定义函数过程(Function)事件过程(Sub)用户自定义子过程(Sub)用户自定义函数过程(F
49、unction)一个或若干个标准模块(*.bas)文件全全局局级级模模块块级级过过程程级级 5.4.1 5.4.1 5.4.1 5.4.1 变量的作用域变量的作用域变量的作用域变量的作用域1.1.1.1.局部变量局部变量局部变量局部变量 作用域为定义的过程内。指在过程内用作用域为定义的过程内。指在过程内用DimDim语句语句声明的变量(或不加声明直接使用的变量),只能在声明的变量(或不加声明直接使用的变量),只能在本过程中使用,别的过程不可访问。局部变量随过程本过程中使用,别的过程不可访问。局部变量随过程的调用而分配存储单元,并进行变量的初始化,一旦的调用而分配存储单元,并进行变量的初始化,一
50、旦该过程体结束,变量的内容自动消失,占用的存储单该过程体结束,变量的内容自动消失,占用的存储单元释放。不同的过程中可有相同名称的变量,彼此互元释放。不同的过程中可有相同名称的变量,彼此互不相干。使用局部变量有利于程序的调试不相干。使用局部变量有利于程序的调试 5.4.1 5.4.1 5.4.1 5.4.1 变量的作用域变量的作用域变量的作用域变量的作用域2.2.2.2.窗体窗体窗体窗体/模块级变量模块级变量模块级变量模块级变量 作用域为定义的窗体作用域为定义的窗体/模块内。指在一个窗体模块内。指在一个窗体/模块的任何过程外,即在模块的任何过程外,即在“通用声明通用声明”段中用段中用DimDim