第07章过程(10学时)b_第1页
第07章过程(10学时)b_第2页
第07章过程(10学时)b_第3页
第07章过程(10学时)b_第4页
第07章过程(10学时)b_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、VbVb中使用的过程分为中使用的过程分为子程序过程子程序过程、函数过程函数过程和和属性过程属性过程。过程过程子程序过程(子程序过程(SUBSUB) 函数过程(函数过程(FUNCTIONFUNCTION)属性过程(属性过程(PROPERTYPROPERTY)事件过程事件过程通用过程通用过程窗体过程窗体过程控件过程控件过程(1)控件事件过程形式:)控件事件过程形式: Private Sub Private Sub 控件名控件名_ _事件名事件名 (argument list)(argument list) 语句块语句块End SubEnd Sub说明:说明: (1 1)控件名必须与窗体中某个控件相

2、匹配,否则为通用过程。)控件名必须与窗体中某个控件相匹配,否则为通用过程。 (2 2)argument list argument list 指的是参数列表指的是参数列表, ,有无参数由事件本身决有无参数由事件本身决定,用户不可以自行添加。定,用户不可以自行添加。Private Sub command1_Click() endEnd SubPrivate Sub Private Sub FormForm_ _事件名事件名 (argument list)(argument list) 语句块语句块End Sub 2)窗体事件过程形式:)窗体事件过程形式:说明:说明:(1 1)Private Pr

3、ivate 表明该过程的使用范围是模块级的,在该窗体之表明该过程的使用范围是模块级的,在该窗体之外是不可见的。外是不可见的。(2 2)不论定义的窗体名称为什么,均用)不论定义的窗体名称为什么,均用FormForm 表示。表示。(3 3)事件由事件由VBVB提供。注意部分事件的发生顺序:提供。注意部分事件的发生顺序:InitializeInitialize、 LoadLoad、ActivateActivate、GotFocusGotFocus事件的发生顺序是依次的。事件的发生顺序是依次的。如有一窗体名为如有一窗体名为f1f1,则可以有如下代码:,则可以有如下代码:Private Sub Form

4、_Activate()Private Sub Form_Activate() L2.ForeColor = RGB(0, 255, 255) L2.ForeColor = RGB(0, 255, 255)End Sub 演示演示 引例引例1 1:编程时经常要用到两个数的交换,可以将其编:编程时经常要用到两个数的交换,可以将其编写成过程。写成过程。 将多次被重复使用的程序段设计成一个具有一定功能的将多次被重复使用的程序段设计成一个具有一定功能的独立程序段,即为通用过程。独立程序段,即为通用过程。1 1、建立通用过程、建立通用过程(1 1)打开代码编辑器窗口)打开代码编辑器窗口选择工具菜单选择工具

5、菜单选择添加过程选择添加过程(2 2)在代码编辑器窗口中选择)在代码编辑器窗口中选择“通用通用声明声明”形式如下:形式如下: Private | PublicStatic Private | PublicStatic SubSub 过程名过程名 ( 参数列表参数列表 ) 局部变量和常量声明局部变量和常量声明 语句块语句块 Exit SubExit Sub 语句块语句块 End SubEnd Sub 例例说明:说明: (1 1)Private|PublicPrivate|Public可缺省,若缺则系统默认为可缺省,若缺则系统默认为PublicPublic。StaticStatic如果不省则指定如

6、果不省则指定过程中的局部变量为过程中的局部变量为“静态静态”变量变量。 (2 2)过程名命名规则和变量名相同,且不能重名。)过程名命名规则和变量名相同,且不能重名。 (3 3)参数列表中的参数是形式参数,可为变量名或数组名)参数列表中的参数是形式参数,可为变量名或数组名() () ,可,可以没有参数,但是外层()不可省,若有多个参数,则用逗号分开。以没有参数,但是外层()不可省,若有多个参数,则用逗号分开。 (4)(4)形参格式形参格式:ByVal|ByRef:ByVal|ByRef变量名变量名()As ()As 数据类型数据类型 (5)过程体中)过程体中Exit Sub可以有多个,执行到此语

7、句,立即退出该过可以有多个,执行到此语句,立即退出该过程。程。Sub过程不可以嵌套。过程不可以嵌套。 3.SUB过程调用过程调用 格式格式1 1:CALL CALL 过程名过程名 (实参表)(实参表) 格式格式2 2:过程名:过程名 实参实参1 1, 实参实参2 2, 说明:说明:(1 1)过程名是被调用过程的名字,当调用程序执行到此)过程名是被调用过程的名字,当调用程序执行到此代码时,代码时,VBVB将开始执行被调用过程。将开始执行被调用过程。(2 2)实参可以是变量、常数或表达式。)实参可以是变量、常数或表达式。实参的个数和类实参的个数和类型、顺序应与被调过程的形参相匹配型、顺序应与被调过

8、程的形参相匹配,且多个参数之间,且多个参数之间应用逗号分隔。对于格式应用逗号分隔。对于格式1 1,若被调过程无参数,则(实,若被调过程无参数,则(实参表)可以省略。而格式参表)可以省略。而格式2 2,不论是否有参数,实参列表,不论是否有参数,实参列表均不需要加括号。均不需要加括号。例题例题若若在应用程序中用在应用程序中用“Private Sub Sub1(X As Integer, Y As Single)”定义了子程序定义了子程序Sub1,调用程序中的变量,调用程序中的变量I,J均为均为Integer型,则正确型,则正确调用子程序调用子程序Sub1的的Call语句是语句是_。 Call Su

9、b1(I,J) Call Sub1(3.1415,I) Call Sub1(3.14,234) Call Sub1(245,231.5)A. B. C. D. 无无例例1:调用两数交换过程:调用两数交换过程Public Sub swap(x%, y%)Public Sub swap(x%, 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

10、As Integer, b As Integer Dim a As Integer, b As Integer a = Val(Text1.Text): b = Val(Text2.Text) a = Val(Text1.Text): b = Val(Text2.Text) call swap (a+0,b+0) call swap (a+0,b+0) Text1.Text = Str(a) Text1.Text = Str(a):Text2.Text = Str(b)Text2.Text = Str(b)End SubEnd Sub或或 swap a, bswap a, b例例2:将以前学过

11、的冒泡排序改写成过程调用的形式:将以前学过的冒泡排序改写成过程调用的形式 Private Sub bubble_sort(sort() As Integer)Private Sub bubble_sort(sort() As Integer) Dim ub As Integer, Tem As Integer Dim ub As Integer, Tem As Integer, I As Integer, switch As BooleanI As Integer, switch As Boolean ub = UBound(sort) ub = UBound(sort) :switch =

12、Trueswitch = True Do While switch Do While switch switch = False switch = False :ub = ub - 1ub = ub - 1 For i = 1 To ub For i = 1 To ub If sort(i) sort(i + 1) Then If sort(i) sort(i + 1) Then switch = True switch = True :Tem = sort(i)Tem = sort(i) sort(i) = sort(i + 1) sort(i) = sort(i + 1) :sort(i

13、+ 1) = Temsort(i + 1) = Tem End If End If Next i Next i Loop Loop 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

14、For i = 1 To 10 For i = 1 To 10 number(i) = Int(100 - 1) number(i) = Int(100 - 1) * * Rnd) + 1 Rnd) + 1 Text1 = Text1 & Str(number(i) Text1 = Text1 & Str(number(i) Next i Next i Call bubble_sort(number)Call bubble_sort(number) For i = 1 To 10 For i = 1 To 10 Text2 = Text2 & Str(number(i)

15、 Text2 = Text2 & Str(number(i) Next i Next i End Sub End SubPrivate|PublicStatic Private|PublicStatic FunctionFunction 函数名(函数名( 参数列表参数列表 ) as as 数据类型数据类型 语句块语句块 函数名函数名= =表达式表达式 Exit Function Exit Function 语句块语句块 函数名函数名= =表达式表达式 End FunctionEnd Function Private Function f(x%, y%)as Integer f=x*x+

16、2*yEnd FunctionPublic Function Gcd(x%, y%)as Integer Dim r as Integer r=x mod y Do while r0 x=y:y=r:r=x mod y Loop Gcd=y End Function说明:说明: FunctionFunction函数和函数和SubSub过程的主要区别是过程的主要区别是有无返回有无返回值值。SUBSUB过程没有返回值,而过程没有返回值,而FunctionFunction函数有返回值。函数有返回值。“函数名函数名= =表达式表达式”语句功能是给函数名赋值,通常语句功能是给函数名赋值,通常在函数体内至

17、少要对函数名进行一次赋值,若缺省,在函数体内至少要对函数名进行一次赋值,若缺省,则返回对应类型的缺省值。因为函数有返回值,所以则返回对应类型的缺省值。因为函数有返回值,所以函数名函数名也有类型。也有类型。“as as 数据类型数据类型”指定函数类型,指定函数类型,若缺省,默认为变体型。而若缺省,默认为变体型。而SUBSUB过程名没有值,因而过程名没有值,因而也没有类型,且在子过程体内也不能对子过程名赋值。也没有类型,且在子过程体内也不能对子过程名赋值。格式如下:格式如下:格式格式1 1:函数函数名名( 实参表实参表 ) 出现在表达式中出现在表达式中格式格式2 2:CALL CALL 函数函数名

18、(实参)名(实参) 格式格式3 3:函数函数名名 实参实参 说明:通常用第一种比较多,用后两种方法调说明:通常用第一种比较多,用后两种方法调用函数时用函数时VBVB放弃函数的返回值。放弃函数的返回值。 例题例题 在应用程序中用在应用程序中用“Private Function Fun( X Private Function Fun( X As Integer,Y As Integer)”As Integer,Y As Integer)”定义了函数定义了函数Fun.Fun.调用调用函数函数FunFun的过程中的变量的过程中的变量I I定义为定义为IntegerInteger型,变量型,变量J J定

19、义为定义为STRINGSTRING型,能正确引用函数型,能正确引用函数FunFun的是的是_。 Fun(I,J)Fun(I,J) Call Fun(I,3.65)Call Fun(I,3.65) Fun(3.14,234)Fun(3.14,234) Fun(245,231.5)Fun(245,231.5)A. A. B. B. C. C. D. D. B 2 2、编写一段求三角形面积的函数,并多次调用。(设三角形、编写一段求三角形面积的函数,并多次调用。(设三角形三边长为三边长为x x,y y,z z,则面积为,则面积为c = 1 / 2 c = 1 / 2 * * (x + y + z) (

20、x + y + z);area = Sqr(c area = Sqr(c * * (c - x) (c - x) * * (c - y) (c - y) * * (c - z) (c - z)) Public Function area(xPublic Function area(x!, y, y!, z, z!) As Single) As Single Dim c As Single Dim c As Single c = 1 / 2 c = 1 / 2 * * (x + y + z) (x + y + z) areaarea = Sqr(c = Sqr(c * * (c - x) (c

21、- x) * * (c - y) (c - y) * * (c - z) (c - z) End Function End Function Private Sub Command1_Click()Private Sub Command1_Click() Dim a As Single, b As Single, c As Single Dim a As Single, b As Single, c As Single Dim d As Single, e As Single, f As Single Dim d As Single, e As Single, f As Single Dim

22、s1 As Single, s2 As Single Dim s1 As Single, s2 As Single a = InputBox( a = InputBox(输入输入a a:) b = InputBox( b = InputBox(输入输入b b:) c = InputBox( c = InputBox(输入输入c c:) d = InputBox( d = InputBox(输入输入d d:) e = InputBox( e = InputBox(输入输入e e:) f = InputBox( f = InputBox(输入输入f f:) s1 = area(a, b, c):

23、s2 = area(d, e, f) s1 = area(a, b, c): s2 = area(d, e, f) Text1.Text = Val(s1 + s2) Text1.Text = Val(s1 + s2) End Sub End Sub函数调用函数调用例例: 试分别用试分别用Sub Sub 和和FunctionFunction编写求某级数部分和的过编写求某级数部分和的过程,并调用之程,并调用之. .级数为 x2 xn 1 + x + + + + 2! n!精度为|xn | = eps) Do While (Abs(t) = eps) s = s + t s = s + t t =

24、 t t = t * * x / n x / n n = n + 1 n = n + 1 Loop LoopEnd SubEnd SubSubSub过程:过程:FunctionFunction函数:函数:P Private rivate F Functionunction js1(x As Single, eps As Double) js1(x As Single, eps As Double) As Double As Double Dim n As Integer, s As Double, t As DoubleDim n As Integer, s As Double, t As D

25、oublen = 1: s = 0: t = 1n = 1: s = 0: t = 1 Do While (Abs(t) = eps) Do While (Abs(t) = eps) s = s + t s = s + t t = t t = t * * x / n x / n n = n + 1 n = n + 1 Loop Loop js1 = sjs1 = sEnd FunctionEnd Function分别调用:分别调用: Private Sub Command1_Click()Private Sub Command1_Click() Dim f1 As Double, f2 As

26、Double Dim f1 As Double, f2 As Double Dim x As Single Dim x As Single x = Val(Text1.Text) x = Val(Text1.Text) f1 = js1(x, 0.0000001) f1 = js1(x, 0.0000001) Call js2(f2, x, 0.0000001) Call js2(f2, x, 0.0000001) Text2.Text = Str(f1) Text2.Text = Str(f1) Text3.Text = Str(f2) Text3.Text = Str(f2) End Su

27、b End Sub函数调用函数调用过程调用过程调用在程序中只能调用其他模块中的公有过程。在程序中只能调用其他模块中的公有过程。 1 1、窗体模块、窗体模块 格式:格式:CALL CALL 窗体名窗体名. .过程名(过程名( 实参表实参表 ) 2 2、标准模块、标准模块 (1 1)若调用自身模块中的过程,格式为:)若调用自身模块中的过程,格式为:CALL CALL 过程名(实参)过程名(实参) (2 2)若调用别的模块中的过程且有两个或以上的模块中含有同名)若调用别的模块中的过程且有两个或以上的模块中含有同名过程则格式为:过程则格式为:CALL CALL 模块名模块名. .过程名(实参)过程名(

28、实参) (3 3)如果标准模块中的过程名是唯一的,应用程序中不再有同名)如果标准模块中的过程名是唯一的,应用程序中不再有同名过程存在,则调用该过程是不用加模块名。过程存在,则调用该过程是不用加模块名。 3 3、类模块、类模块 例如窗体模块中有一过程为例如窗体模块中有一过程为ss,则可写成,则可写成Call Call Form1.Form1.ssss( ( 实参表实参表 ) ) 如果两模块如果两模块m1和和m2中都含有过程中都含有过程gc,则调,则调用用m1中的中的gc应写成应写成 Call m1 . gc1、在调用过程时,下述说明中正确的、在调用过程时,下述说明中正确的是是 。A 只能使用只能

29、使用CallCall语句调用语句调用SubSub过程过程B 调用调用SubSub过程时,实在参数必须用括号括过程时,实在参数必须用括号括起来起来C 在表达式中调用在表达式中调用FunctionFunction过程时,可以过程时,可以不用括号把实在参数括起来不用括号把实在参数括起来D FunctionD Function过程也可以使用过程也可以使用CallCall语句调用语句调用 DSubSub过程用过程用CallCall语句调用(无参数时括语句调用(无参数时括号可省略)或作为一个语句使用。当做语号可省略)或作为一个语句使用。当做语句使用时实参表不需要加括号;句使用时实参表不需要加括号;Func

30、tionFunction过程的调用和过程的调用和VBVB内部函数的方法一样,此内部函数的方法一样,此时有返回值,若像调用时有返回值,若像调用SubSub过程那样调用过程那样调用FunctionFunction过程,其返回值被放弃。过程,其返回值被放弃。 在调用有参过程时,先进行参数的在调用有参过程时,先进行参数的“形实结合形实结合” ” 过程,实现主调程序和过程,实现主调程序和过程之间的数据传递,在过程之间的数据传递,在结合时一定要结合时一定要按顺序进行并且类型要相同按顺序进行并且类型要相同,特别注意,特别注意不可以按名字进行结合。该传递分为传不可以按名字进行结合。该传递分为传值和传址(引用)

31、两种方式。值和传址(引用)两种方式。 按值传送时传送的是实参的值,仅将实参变按值传送时传送的是实参的值,仅将实参变量的值复制给形参,执行完调用语句后,调用程量的值复制给形参,执行完调用语句后,调用程序中的实参值不变。序中的实参值不变。 形式参数为形式参数为: : byval byval变量名变量名 ()()AS AS 类型类型,byvalbyval变量名变量名 ()()AS AS 类型类型 例:例: Private Sub Command1_Click()Private Sub Command1_Click() Dim m As Integer, n As Integer Dim m As I

32、nteger, n As Integer m = 15: n = 20 m = 15: n = 20 Call value(m, n) Call value(m, n) Print m=; m, n=; n Print m=; m, n=; n End Sub End Sub Private Sub value(ByVal x As Integer, ByVal y As Integer) Private Sub value(ByVal x As Integer, ByVal y As Integer) x = x + 20: y = y + x x = x + 20: y = y + x P

33、rint x=; x, y=; y Print x=; x, y=; y End Sub End Subm,n的值不变的值不变没有数值往回传递没有数值往回传递接收接收m的值的值接收接收n的值的值 按地址传送时传送的是实参的地址,在调用时,被调用过程按地址传送时传送的是实参的地址,在调用时,被调用过程直接将接受到的地址里的值进行修改,从而将原来的实参值覆盖直接将接受到的地址里的值进行修改,从而将原来的实参值覆盖掉,所以,执行完调用语句后,实参的值将会有所改变。掉,所以,执行完调用语句后,实参的值将会有所改变。 形式参数为形式参数为 byrefbyref变量名变量名 ()()AS AS 类型类型

34、,byrefbyref变量名变量名 ()()AS AS 类型类型 例:例: Private Sub Command2_Click()Private Sub Command2_Click() Dim m As Integer, n As Integer Dim m As Integer, n As Integer m = 15: n = 20 m = 15: n = 20 Call value1(m), n) Call value1(m), n) Print m=; m, n=; n Print m=; m, n=; n End Sub End Sub Private Sub value1(By

35、Ref Private Sub value1(ByRef x x As Integer, As Integer, y y As As Integer)Integer) x = x + 20: y = y + x x = x + 20: y = y + x Print x=; x, y=; y Print x=; x, y=; y End Sub End Sub 接收接收m的地址的地址接收接收n的地址的地址m,n的值即为的值即为x,y的值的值(数值往主调过程传递)(数值往主调过程传递)例题例题用语句用语句Private Sub Convert(Y As Integer) Private Sub

36、Convert(Y As Integer) 定义的定义的SubSub过程时,以下不是按值传递的语句是过程时,以下不是按值传递的语句是_2525_。A. Call Convert(X)A. Call Convert(X)B. Call Convert(XB. Call Convert(X* *1)1)C. Convert(X)C. Convert(X)D. Convert XD. Convert X 说明:说明:按地址传送的形参,若调用时与之结合的实参是常数按地址传送的形参,若调用时与之结合的实参是常数或表达式,则或表达式,则vb会将之变为会将之变为“按值传递按值传递”例例1 1:按地址传递按地

37、址传递求求1 1!+2+2!+3+3!+4+4!+5+5!的和。!的和。 Private Static Function fact( Private Static Function fact( n n As Integer) As As Integer) As IntegerIntegerfact = 1fact = 1Do While n 0Do While n 0fact = fact fact = fact * * n nn = n 1n = n 1LoopLoopEnd FunctionEnd Function Private Sub Form_Click()Private Sub F

38、orm_Click() Dim sum As Integer, i As Integer Dim sum As Integer, i As Integer For i = 5 To 1 Step 1 For i = 5 To 1 Step 1 sum = sum + sum = sum + fact(i)fact(i) Next I Next I Print sum=; sum Print sum=; sumEnd SubEnd Subsum = sum + sum = sum + factfact(( (i i) ))sum= 120 错误结果错误结果sum= 153形参的值改变后实参的跟形

39、参的值改变后实参的跟着变化,要防止产生错误着变化,要防止产生错误例例2 2:运行下列程序,单击窗体时后的输出结果:运行下列程序,单击窗体时后的输出结果 Private Function add(a As Integer, b As Integer, Private Function add(a As Integer, b As Integer, c As Integer) 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

40、+ cEnd FunctionEnd FunctionPrivate Sub Form_Click()Private Sub Form_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 Print v1 + v2 + v3 * * add(v1, v2, v3) add(v1, v2, v3)End SubEn

41、d Sub函数的优先级高函数的优先级高例例3 3:验证:验证9 9的倍数(如果一个数的各位数之和等于该数的两倍的的倍数(如果一个数的各位数之和等于该数的两倍的各位数之和,则该数为各位数之和,则该数为9 9的倍数。如:的倍数。如:9999的两倍是的两倍是198198,且,且9+9=1+9+89+9=1+9+8,则,则9999就是就是9 9的倍数。)的倍数。) P Privaterivate F Functionunction sm(_) As sm(_) As Integer Integer Dim sm1 As Integer Dim sm1 As Integer sm1 = 0 sm1 =

42、0 Do While n 0 Do While n 0 sm1 = sm1 + n Mod 10 sm1 = sm1 + n Mod 10 n = n 10 n = n 10 Loop Loop sm = sm1 sm = sm1 End Function End FunctionByVal n As Integersm(n)的功的功能能求求n的各位的各位数之和数之和例例3 3:验证:验证9 9的倍数的倍数 Private Sub Command1_Click() Private Sub Command1_Click() Dim n As Integer, s1 As Integer, s2

43、As IntegerDim n As Integer, s1 As Integer, s2 As Integer n = Val(Text1.Text) n = Val(Text1.Text) s1 = sm(n) s1 = sm(n) s2 = _ s2 = _ If s1 = s2 Then If s1 = s2 Then MsgBox MsgBox 该数是该数是9 9的倍数的倍数 Else Else MsgBox MsgBox 该数不是该数不是9 9的倍数的倍数 End If End If Text1.Text = Text1.Text = Text1.SetFocus Text1.Se

44、tFocus End Sub End Subsm(2 * n)演演 示示数组可以作为形式参数。数组可以作为形式参数。形参数组名()形参数组名()ASAS类型类型 。 但但形参数组只能是按地址传递的参数形参数组只能是按地址传递的参数。对应。对应实参的类型必须和形参一致,实参的类型必须和形参一致,数组名在实参中后数组名在实参中后面不加一对括号面不加一对括号。在被调用的过程中不可以用。在被调用的过程中不可以用DIMDIM对形参进行声明,但是动态数组时,可以用对形参进行声明,但是动态数组时,可以用REDIMREDIM来重新定义数组的维界与大小。来重新定义数组的维界与大小。 例例4 4:求任一一维数组元

45、素之和:求任一一维数组元素之和 Private Function tim(Private Function tim(a() As Integera() As Integer) ) Dim t As Double, i%Dim t As Double, i%t = 0t = 0For i = LBound(a) To UBound(a)For i = LBound(a) To UBound(a)t = t + a(i)t = t + a(i)Next iNext itim = ttim = tEnd FunctionEnd FunctionPrivate Sub Form_Click()Priv

46、ate Sub Form_Click()Dim a(1 To 5) As IntegerDim a(1 To 5) As IntegerDim b(2 To 10) As Integer Dim b(2 To 10) As Integer Dim i As IntegerDim i As IntegerDim t1 As IntegerDim t1 As IntegerDim t2 As LongDim t2 As LongFor i = 1 To 5For i = 1 To 5 a(i) = i a(i) = iNext iNext iFor i = 2 To 10For i = 2 To

47、10 b(i) = i b(i) = iNext iNext it1 = tim(t1 = tim(a a) )t2 = tim(t2 = tim(b b) )Print t1=; t1, t2=; t2Print t1=; t1, t2=; t2End SubEnd Sub实参数组后不实参数组后不加圆括号加圆括号例例5 5:数组参数传递(教材:数组参数传递(教材P P173173)Private Sub change(Private Sub change(a()a() As Integer) As Integer)Dim i%Dim i%ReDim a(7)ReDim a(7)For i =

48、 1 To 7For i = 1 To 7a(i) = Ia(i) = INext INext IEnd SubEnd Sub形参数组只能形参数组只能按地址传递按地址传递Option ExplicitOption ExplicitOption Base 1Option Base 1Private Sub Form_Click()Private Sub Form_Click()Dim Dim arraya()arraya() As Integer, i% As Integer, i%ReDim ReDim arraya(5)arraya(5)Print Print 调用前上界是调用前上界是:;

49、UBound(arraya):; UBound(arraya)Call change(Call change(arrayaarraya) )Print Print 调用后上界是调用后上界是:; UBound(arraya):; UBound(arraya)Print Print 数组各元素的值是数组各元素的值是:;:;For i = 1 To UBound(arraya)For i = 1 To UBound(arraya) Print arraya(i); Print arraya(i);Next iNext iPrintPrintEnd SubEnd Sub 对象也可以作为参数传递,但也对

50、象也可以作为参数传递,但也只能是按地址来传递。在形参中若是只能是按地址来传递。在形参中若是控件,则类型声明为控件,则类型声明为“CONTRAL”CONTRAL”,若是,若是窗体,则类型声明为窗体,则类型声明为“FORM”FORM”。 例例6 6:Private Sub Cmd1_Click()Call Objarg(lab1)End SubPrivate Sub Cmd2_Click() Call Frmarg(Frmsecond)End SubPrivate Sub Form_load() frmfirst.Left = 2000 frmfirst.Top = 1500 lab1.Capti

51、on = 学习使用学习使用VB6.0End SubPrivate Sub Objarg(Lad As Control) Lad.BackColor = &HFF0000 Lad.ForeColor = &HFFFF& Lad.Font = 14 Lad.FontItalic = True Lad.Caption = 对象参数的传递对象参数的传递End SubPrivate Sub Frmarg(F As Form) F.Left = (Screen.Width - F.Width) / 2 F.Top = (Screen.Height - F.Height) / 2 f

52、rmfirst.Hide F.ShowEnd SubPrivate Sub Cmd1_Click()Unload Mefrmfirst.ShowEnd SubFrmfirstFrmsecond 用自身的结构来描述自身称为“递归”即一个过程调用过程本身,在递归调用中,一个过程执行的某一步要用到它自身的上一步或上几步的结果。例如:最典型的例子是对阶乘运算可作如下定义: n!=n*(n-1)! (n-1)!=(n-1) *(n-2)! 直接递归:自己调用自己直接递归:自己调用自己 间接递归:间接递归:A A调用调用B B,B B调用调用A A递归过程中必须有递归结束语句。递归过程中必须有递归结束语句

53、。 VBVB允许一个子过程或函数在自身定义的内部调用自己,允许一个子过程或函数在自身定义的内部调用自己,这样的子过程或函数称为这样的子过程或函数称为递归子过程递归子过程或或递归函数递归函数。许多问。许多问题中具有递归的特性,用递归调用描述它们就非常方便。题中具有递归的特性,用递归调用描述它们就非常方便。注意:递归过程必须有一个结束递归的终止条件,否则会注意:递归过程必须有一个结束递归的终止条件,否则会无限制的执行下去。无限制的执行下去。例例7 7、 求求fac(n)=n! fac(n)=n! 的值的值 (n n已已4 4为例)为例)递推递推fac(4)=4*fac(3)fac(3)=3*fac

54、(2)fac(2)=2*fac(1)fac(1)=1fac(2)=2*1fac(3)=3*2fac(4)=4*6回归回归Public Function fac(n As Integer) As IntegerPublic Function fac(n As Integer) As Integer If n=1 Then If n=1 Then fac=1fac=1 Else Else fac=n fac=n* *fac(n-1)fac(n-1) End If End IfEnd FunctionEnd FunctionPrivate Sub Command1_Click()Private Su

55、b Command1_Click() Print “fac(4)=“; fac(4) Print “fac(4)=“; fac(4)End SubEnd Sub递归调用递归调用演示演示 1 1、求阶乘。、求阶乘。n!=nn!=n* *(n-1)!(n-1)! 2 2、求菲波那契数列前、求菲波那契数列前1010项。项。F(1)=1F(1)=1,F(2)=1F(2)=1,后面各项,后面各项满满 足:足:F(n)=F(n-1)+F(n-2)F(n)=F(n-1)+F(n-2) 3 3、 求两个数的最大公约数。求两个数的最大公约数。 4、逆转输出一个字符串。逆转输出一个字符串。 5 5、汉诺塔游戏。汉

56、诺塔游戏。 相关习题:相关习题:Private Sub Command1_Click() n = Text1 m = Text2 Text3 = gcd(n, m)End SubPrivate Function gcd(ByVal x, ByVal y) As Integer r = x Mod y If r = 0 Then gcd = y Else gcd = gcd(y, r) End IfEnd Function应用程序(.vbp文件)类模块(.cls)文件一个或若干个窗体模块(*.frm)文件用户自定义子过程(Sub)用户自定义函数过程(Function)事件过程(Sub)用户自定义

57、子过程(Sub)用户自定义函数过程(Function)一个或若干个标准模块(*.bas)文件全局级模块级过程级作用域为定义的过程内。指在过程内用作用域为定义的过程内。指在过程内用DimDim语句语句声明的变量(或不加声明直接使用的变量),声明的变量(或不加声明直接使用的变量),只能在本过程中使用,别的过程不可访问。局部变只能在本过程中使用,别的过程不可访问。局部变量随过程的调用而分配存储单元,并进行变量的初始量随过程的调用而分配存储单元,并进行变量的初始化,一旦该过程体结束,变量的内容自动消失,占用化,一旦该过程体结束,变量的内容自动消失,占用的存储单元释放。不同的过程中可有相同名称的变量,的

58、存储单元释放。不同的过程中可有相同名称的变量,彼此互不相干。使用局部变量有利于程序的调试彼此互不相干。使用局部变量有利于程序的调试如如 Dim b as stringDim b as string 作用域为定义的窗体作用域为定义的窗体/ /模块内。指在一个窗体模块内。指在一个窗体/ /模块的任何过程外,即在模块的任何过程外,即在“通用声明通用声明”段中用段中用DimDim语语句句或用或用PrivatePrivate语句声明的变量,可被本窗体语句声明的变量,可被本窗体/ /模块的模块的任何过程访问。任何过程访问。 如如 Dim c as stringDim c as string 作用域为整个应

59、用程序内。指在窗体或标准模块的作用域为整个应用程序内。指在窗体或标准模块的任何过程或函数外,即任何过程或函数外,即在在“通用声明通用声明”段中用段中用PublicPublic语语句声明的变量,可被应用程序的任何过程或函数访问句声明的变量,可被应用程序的任何过程或函数访问。全局变量的值在整个应用程序中始终不会消失和重新初全局变量的值在整个应用程序中始终不会消失和重新初始化,只有当整个应用程序结束时,才会消失。始化,只有当整个应用程序结束时,才会消失。 如如 Dim a as stringDim a as string 指在某个窗体或标准模块内定义的过程指在某个窗体或标准模块内定义的过程, ,定义子过程定义子过程或函数时前加或函数时前加 PrivatePrivate关键字关键字, ,过程只能被本窗体或本标过程只能被本窗体或本标准模块中的过程调用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论