第8章过程与函数2_第1页
第8章过程与函数2_第2页
第8章过程与函数2_第3页
第8章过程与函数2_第4页
第8章过程与函数2_第5页
已阅读5页,还剩37页未读, 继续免费阅读

下载本文档

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

文档简介

1、1第8章2 在设计一个规模较大、复杂程度较高的程序时,在设计一个规模较大、复杂程度较高的程序时,往往根据需要按功能往往根据需要按功能将程序分解成若干个相对独立将程序分解成若干个相对独立的部分的部分,然后对每个部分分别编写一段程序,这些,然后对每个部分分别编写一段程序,这些程序段称为程序段称为 3VB子程序分类图子程序分类图是对是对进行处理的程序段进行处理的程序段4是指是指以规定语法结构组织的以规定语法结构组织的、可以被重复调用的可以被重复调用的、具具有特定功能的有特定功能的、相对独立的相对独立的程序段。程序段。 不与任何特定的事件过程相关联,只能由别的过程调用不与任何特定的事件过程相关联,只能

2、由别的过程调用 声明声明 Sub 过程过程就是在就是在的代码窗口编写一个能的代码窗口编写一个能实现预期功能的语句块。实现预期功能的语句块。 () Exit Sub 过程体过程体 5每个通用过程都有一个每个通用过程都有一个同一模块中过程名不得重复。同一模块中过程名不得重复。过程前加上过程前加上Public关键字关键字或缺省,则该过程为或缺省,则该过程为,过程前加上过程前加上Private关键字关键字,则该过程为,则该过程为,只有在声明,只有在声明它的模块中才可以调用此过程。它的模块中才可以调用此过程。在过程名前加上在过程名前加上Static关键字关键字,表明该过程的变量都是静态变量。,表明该过程

3、的变量都是静态变量。形参列表形参列表是传递到过程中的变量名是传递到过程中的变量名(多个时用多个时用“,”分隔分隔),它指明了调它指明了调用时传递给过程的参数的类型和个数用时传递给过程的参数的类型和个数. 过程可以有参数,也可以不带任何参数。根据需要而定过程可以有参数,也可以不带任何参数。根据需要而定 格式为:格式为:ByVal|ByRef变量名变量名( ) AS 数据类型数据类型, ByVal 表示按值传递;表示按值传递;ByRef 表示按地址传递表示按地址传递6、过程内不能再定义过程,过程定义也不能写在事件过程内、过程内不能再定义过程,过程定义也不能写在事件过程内6Sub Tryout( x

4、 as integer , y as integer) x=x+100 y=y*6 Print x,y End Sub 建立通用过程可以使用以下两种方法:建立通用过程可以使用以下两种方法:7要执行一个过程,必须调用该过程要执行一个过程,必须调用该过程。调用的方法为:。调用的方法为: Call 过程名过程名(实参列表实参列表) 过程名过程名 Sub 过程的调用过程的调用例:要调用前面的例:要调用前面的Tryout过程,可以使用下面两种方式:过程,可以使用下面两种方式:Tryout(a , b) 或或 Tryout a , b主过程主过程Call 过程过程1End Sub过程过程1Call 过程过

5、程2End Sub过程过程2End Sub调用的本质:转入被调用过程去执行调用的本质:转入被调用过程去执行,完成后返回完成后返回8可以直接调用本模块中声明的过程或可以直接调用本模块中声明的过程或当定义的过程重名时,调用过程时,过程名前应加模块名修当定义的过程重名时,调用过程时,过程名前应加模块名修饰;饰;如果要调用如果要调用中声明的中声明的调用时过程名前调用时过程名前9Public Sub fact(ByVal n As Integer, sum As Long) Dim i As Integer sum = 1 For i = 1 To n sum = sum * i Next iEnd S

6、ubPrivate Sub Command1_Click() Dim a, b, c As Integer Dim x As Long a = 5: b = 7: c = 8 Call fact(a, x) s = x Call fact(b, x) s = s + x Call fact(c, x) s = s + x Text1.Text = sEnd Sub10Public Sub a1(n As Integer, s As Integer) s = 0 For j = 1 To n s = s + j Next jEnd SubPrivate Sub Command1_Click()

7、Dim k As Integer Dim s1 As Integer, i As Integer k = Val(Text1.Text) For i = 1 To k Call a1(i, s1) Sum = Sum + s1 Next i Text2.Text = SumEnd Sub11将将求三角形的面积求三角形的面积的代码存放在的代码存放在过程过程triarea(a,b,c)中,边长中,边长从三个文本框中输入,如果符合构成三角形的条件,则调用该从三个文本框中输入,如果符合构成三角形的条件,则调用该过程,否则调用过程,否则调用suberr过程。过程。 程序如下:程序如下:Private S

8、ub (area As Double, x As Double, y As Double, z As Double) Dim s As Double s = (x +y + z) / 2 area = Sqr(s - x) * (s - y) * (s - z) * s)End SubPrivate Sub suberr(intyrn As Integer) intyrn = MsgBox(请检查您的数据请检查您的数据)End Sub12Private Sub Command1_Click() Dim a#, b#, c#, s# Dim intYesorNo As Integer a = V

9、al(Text1.Text) b = Val(Text2.Text) c = Val(Text3.Text) If a + b c And b + c a And c + a b Then Call triarea(s, a, b, c) 使用使用Call关键字,实际参数用括号括起来关键字,实际参数用括号括起来 Print 面积面积 =; s Else suberr intYesorNo 不使用不使用Call关键字,实际参数不用括号关键字,实际参数不用括号 End IfEnd Sub 13与与Sub 过程过程 的主要区别是:的主要区别是: Public|Private Static Funct

10、ion 函数过程名函数过程名 () As End Function在函数体内,函数名可以当变量名使用,函数的返回值就是通过对函数名在函数体内,函数名可以当变量名使用,函数的返回值就是通过对函数名的赋值语句来实现的。即函数值通过函数名返回。的赋值语句来实现的。即函数值通过函数名返回。函数体中的函数体中的Exit Function语句的功能是强制退出函数并返回语句的功能是强制退出函数并返回函数过程需要返回的值的类型由函数过程需要返回的值的类型由 As 设置。设置。14 函数名函数名()不能独立成为语句,必须参加表达式的运算。不能独立成为语句,必须参加表达式的运算。下面是已知直角三角形两直角边的值,

11、计算斜边的函数。下面是已知直角三角形两直角边的值,计算斜边的函数。 function myfun(A as integer,B as integer) as string myfun=sqr(A*A+B*B) End function 15将前面的两个将前面的两个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

12、 FunctionPrivate Sub Command1_Click() 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 Sub168.3 过程中参数的传送过程中参数的传送通过全局变量实现各过程

13、中共享数据通过全局变量实现各过程中共享数据(即在即在“通用通用”部份部份定义的变量,由该模块所有过程定义的变量,由该模块所有过程共共享享)通过过程调用实参与形参的结合实现通过过程调用实参与形参的结合实现17Sub过程和过程和Function函数过程中的函数过程中的中的参中的参数称为数称为,在程序中调用,在程序中调用Sub过程过程和和Function函数过程时函数过程时中称为实际参数中称为实际参数 。 在调用过程时,在调用过程时,就是就是把把“实参实参”依次依次按位置按位置传递给传递给被调用过程的被调用过程的“形参形参” ,然后执行被调用过程中的,然后执行被调用过程中的语句。语句。 Print

14、greatcd(x, y) Public Function greatcd(m As Integer, n As Integer)与与 18 按值传递按值传递就是将就是将传送给被调用过程中的传送给被调用过程中的。即:即:系统把实参复制一份传送给形参。系统把实参复制一份传送给形参。这样,这样,被调用的过程如果被调用的过程如果改变了形参的值,也不会改变实参的值。改变了形参的值,也不会改变实参的值。 在在VB中,传值方式的标志为:中,传值方式的标志为:。 这种传递方式这种传递方式,19写出下列程序的运行结果写出下列程序的运行结果Sub tryout(ByVal x as integer, ByVal

15、 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=10 b=2020 传址方式是将实参在内存的地址传递给形参,也就是实参、传址方式是将实参在内存的地址传递给形参,也就是实参、形参公用内存的形参公用内存的“地址地址”。 在在VB中,按址传递数据是在形参前加上中,按址传递数据是在形参前加上ByRef(默认方式)。(默认方式)。 这种传递方式这种传递方式,即

16、调用时实参将值传,即调用时实参将值传递给形参;调用结束由形参将操作结果返回给实参。当用传递给形参;调用结束由形参将操作结果返回给实参。当用传址方式时,址方式时, ByVal ByRef 21Sub 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=120223、 数组作过程的参

17、数数组作过程的参数 Visual Basic允许把数组作为实参传送到过程中。数组作允许把数组作为实参传送到过程中。数组作参数是通过传地址方式传送。在传送数组时,除遵守参数传参数是通过传地址方式传送。在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点:送的一般规则外,还应注意以下几点: 1为了把一个数组的全部元素传送给一个过程,应将数为了把一个数组的全部元素传送给一个过程,应将数组名分别写入形参表中,并略去数组的上下界,但括号不能组名分别写入形参表中,并略去数组的上下界,但括号不能省略。省略。Private Sub Sort(a() As single) End Sub其中形参其中形参“

18、a( )”即为数组。即为数组。23 2被调过程可通过被调过程可通过Lbound和和Ubound函数确定实参数组函数确定实参数组的上、下界。的上、下界。 3当用数组作形参时,对应的实参必须也是数组,且类当用数组作形参时,对应的实参必须也是数组,且类型一致。型一致。 4实参和形参结合是按地址传递,即形参数组和实参数实参和形参结合是按地址传递,即形参数组和实参数组共用一段内存单元。组共用一段内存单元。 例如:定义了实参数组例如:定义了实参数组b(1 to 8),给它们赋了值,调用,给它们赋了值,调用Sort()函数过程的形式如下:函数过程的形式如下: Sort b( ) 或或 Call Sort(

19、b() ) 实参数组后面的括号可以省略,但为便于阅读,建议一实参数组后面的括号可以省略,但为便于阅读,建议一般不要省略为好。般不要省略为好。 3、 数组作过程的参数数组作过程的参数24 调用时形参数组调用时形参数组a和实参数组和实参数组b虚实结合,共用一段内存单虚实结合,共用一段内存单元,如图元,如图6-7所示。因此在所示。因此在Sort()过程中改变数组过程中改变数组a的各元素值,的各元素值,也就相当于改变了实参数组也就相当于改变了实参数组b中对应的元素的值,当调用结束中对应的元素的值,当调用结束时,形参数组时,形参数组a成为无定义。成为无定义。 b(1) b(2) b(3) b(4) b(

20、5) b(6) b(7) b(8) a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8)参数为数组时虚实结合示意图参数为数组时虚实结合示意图 3、 数组作过程的参数数组作过程的参数25程序分析举例Private Sub sub1 (x As Integer, y As Integer) Dim t As Integer x=x+y : y=x-y : x=x-yEnd SubPrivate Sub Form_Click() Dim a As Integer , b As Integer a = 15 : b = 25 Call sub1 (b, a) Print a

21、; b sub1 a , b Print a ; bEnd Sub26程序分析举例Private Sub sub1(ByVal a As Integer , b As Integer) a = a + b : b = a + bEnd SubPrivate Sub form_click() Dim x As Integer , y As Integer x = 10 : y = 20 Call sub1(x, y) Print x; yEnd Sub27程序设计举例 写一个子程序 , 把一人十进制数转换成二进制数 , 并验证其正确性。1、确定使用过程或函数来实现:根据子程序的被调用方式来确定:

22、如果被、确定使用过程或函数来实现:根据子程序的被调用方式来确定:如果被调用时当成表达式来使用,必须使用函数来实现,否则用过程实现;也可调用时当成表达式来使用,必须使用函数来实现,否则用过程实现;也可根据子程序在被调用时是否需要通过函数名返回一个值来确定,如需要,根据子程序在被调用时是否需要通过函数名返回一个值来确定,如需要,则必须使用函数来实现,否则则必须使用函数来实现,否则用过程实现。用过程实现。2、确定子程序名称和框架、确定子程序名称和框架3、确定参数形式:包括参数个数、类型、作用、确定参数形式:包括参数个数、类型、作用方法:依据子程序功能进行确定,即判断该子程序功能的数据需求和需方法:依

23、据子程序功能进行确定,即判断该子程序功能的数据需求和需要输出哪些数据要输出哪些数据4、设计子程序主体、设计子程序主体28Sub ShiToEr(shi As String, er As String) x = Val(shi) s = While x 0 m = x Mod 2 x = Int(x / 2) s = s & m Wend er = StrReverse(s)End SubPrivate Sub Command1_Click() Dim er As String Call ShiToEr(Text1.Text , er) Text2.Text = erEnd Sub1、用

24、过程实现、用过程实现29Function ShiToEr(shi As String) x = Val(shi) s = While x 0 m = x Mod 2 x = Int(x / 2) s = s & m Wend ShiToEr = StrReverse(s)End FunctionPrivate Sub Command1_Click() Dim er As String Text2.Text = ShiToEr(Text1.Text)End Sub2、用函数实现、用函数实现30 在过程的形参列表中加入在过程的形参列表中加入Optional关键字关键字,就可以,就可以指定过

25、程的参数为可选的。如果指定了可选参数,则指定过程的参数为可选的。如果指定了可选参数,则参参数表中此参数后面的其它参数也必是可选的数表中此参数后面的其它参数也必是可选的,并且要用,并且要用Optional关键字来声明。关键字来声明。 求两个数的和的函数过程。求两个数的和的函数过程。 函数过程:函数过程:Public Function mysum (first As Integer, second As Long, Optional third ) mysum = first + second If Not IsMissing(third) Then mysum = mysum + thirdEn

26、d Function31事件过程:事件过程: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 Sub IsMissing( )32 一般说来,过程调用中的参数个数应等于过程说明一般说来,过程调用中的参数个数应等于过程说明的参数个数。的参数个数。在传递参数时

27、,在传递参数时,如果要求参数的数目可以如果要求参数的数目可以变化变化,则在函数过程或,则在函数过程或Sub过程的过程的ParamArray关键字关键字(不能与(不能与ByVal ByDef连用)连用)指明。指明。 格式如下:格式如下:Sub 过程名过程名( 其他参数其他参数, ParamArray ( ) ) 33Private 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

28、) ) a = 1000: 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 Sub348.5对象参数 窗体参数 形参定义格式: 形参名 As form 调用时实参: 必须为某个窗体名称 控件参数: 形参定义格式: 形参名

29、As Control 调用时实参: 可为任意一个控件对象358.6 过程的嵌套和递归过程的嵌套和递归1、 过程的嵌套过程的嵌套 在程序中调用一子过程,而在子过程中又调用另外的子过在程序中调用一子过程,而在子过程中又调用另外的子过程,这种程序结构称为程,这种程序结构称为过程的嵌套。过程的嵌套。过程的嵌套调用执行过过程的嵌套调用执行过程如程如下图:下图:362、 过程的递归调用过程的递归调用 用自身的结构来描述自身,称递归。例如,对阶乘的定义:用自身的结构来描述自身,称递归。例如,对阶乘的定义:)!2() 1()!1()!1(!nnnnnn Visual Basic允许在一个允许在一个Sub子过程

30、和子过程和Function过程的定过程的定义内部调用自己,即递归义内部调用自己,即递归Sub子过程和递归子过程和递归Function函数。函数。 直接调用自己称为直接递归调用直接调用自己称为直接递归调用 间接调用自己称为间接递归调用间接调用自己称为间接递归调用6.6 过程的嵌套和递归调用过程的嵌套和递归调用37Private Function fac(n As Integer) As Integer If n = 1 Then fac = 1 Else fac = n * fac(n - 1) End IfEnd FunctionPrivate Sub Form_Click() Print “fac(

温馨提示

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

评论

0/150

提交评论