第八章 子过程和函数过程

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Sort b() 或 Call Sort(b() ) 实参数组后面的括号可以省略,但为便于阅读,建议一般不要 省略为好。
课堂练习
课堂练习 Function FirProc(z As Integer,y As Integer,z As Integer) FirProc=2x+y+3z End Function Function SecProc(x As Integer,y As Integer,z As Integer) SecProc=FirProc(x,y,z)+x End Function Private Sub Command1_Click() Dim a As Integer,b As Integer,c As Integer a=2:b=3:c=4 Print SecProc(c,b,a) End Sub A) 21 B) 19 C) 17 D) 34
本章内容及要求
• • • • • 8.1 Sub过程的定义和调用 8.2 Function函数过程的定义和调用 8.3 参数传递 8.4 过程的嵌套和递归调用 8.5 变量及过程的作用域
8.1 Sub子过程的定义和调用
在VB中Sub子过程分为:事件过程和用户自定义过程
8.1.1 事件Sub过程 (1)窗体事件过程 Private Sub Form_事件名(参数列表) <语句组> End Sub
课堂练习 2009-03-29以下关于过程及过程参数的描述中,错误的是 A)过程的参数可以是控件名称 B)调用过程时使用的实参的个数应与过程形参的个数相同 C)只有函数过程能够将过程中处理的信息返回到调用程中 D)窗体可以作为过程的参数
2010-03-22下面是求最大公约数的函数的首部 Function gcd(ByVal x As Integer, ByVal y As Integer) As Integer 若要输出8、12、16这3个数的最大公约数,下面正确的语句是 A)Print gcd(8,12),gcd(12,16),gcd(16,8) B)Print gcd(8,12,16) C)Print gcd(8),gcd(12),gcd(16) D)Print gcd(8,gcd(12,16))
Dim temp As Integer Temp=X X=Y Y=Temp
End Sub
例2:编写求阶乘的子过程。 Private sub fact(n As Integer,f as Double) Dim i As Integer f=1 For i = 1 To n f=f*i Next End sub
参变量按值方式传递,可以把实参变量加上括号,
将其转换成表达式即可。
使用子过程还是使用函数过程?
解决一个问题既可以使用子过程,也可以使用函 数过程,是使用子过程还是使用函数过程呢?
如果是需要求得一个值,一般情况使用函数过程, 如不是为了求一个值,而是完成一些操作,或需要返 回多个值,则使用子过程比较方便。
说明: (1)子过程名:命名规则与变量名规则相同。子过程名不返回 值,而是通过形参与实参的传递得到结果,调用时可返回多个值 ( 2 )形式参数列表:形式参数通常简称“形参”,仅表示形参 的类型、个数、位置,定义时是无值的,只有在过程被调用时, 虚实参结合后才获得相应的值。 (3)过程可以无形式参数,但括号不能省。 (4)参数的定义形式: [ByVal|ByRef]变量名[( )][As 类型][,…]
传值 传值 传址
Sub Swap1(ByVal x%, ByVal y%) Dim Temp%
Temp = x: x = y: y = Temp
End Sub
Sub Swap2(x%, y%) Dim Temp% Temp = x: x = y: y = Temp End Sub
Sub Swap1(ByVal x%, ByVal y%)
参数的传递有两种方式:按值传递、按地址传递。
形参前加“ByVal”关键字的是按值传递,缺省或加“ByRef” 关键字则按地址传递。
什么是传址和传值呢?
传址: 形参得到的是实参的地址,当形参值的改变同时也改变 实参的值。因为它们共用一个地址。
传值: 形参只得到的是实参的值,形参值的改变不会影响实参
的值。因为形参并不知道实参的地址。
过程调用的执行过程:
Private Sub CmdOK_click() …… Call Swap(a,b) …… Swap a,b
Private Sub Swap(x%,y%) Dim temp% Temp=X X=Y
Y=Temp
End Sub
End Sub
8.2 Function函数过程的定义和调用
Dim Temp%
Temp = x: x = y: y = Temp End Sub
Sub Swap2(x%, y%) Dim Temp% Temp = x: x = y: y = Temp End Sub
Private Sub CmdOK_Click() Dim a%,b% 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
2、实际参数 实际参数是指在 调用 Sub 或 Function 时,出现在子过程名 或函数名后括号内的参数,其作用是将它们的数据(数值或地 址)传送给Sub或Function过程与其对应的形参变量。 实参可由常量、表达式、有效的变量名、数组名(如A( )) 组成,实参表中各参数用逗号分隔。 8.3.2 传地址与传值 参数传递指主调过程的实参(调用时已有确定值和内存地 址的参数)传递给被调过程的形参。
End Sub
其中形参“a( )”即为数组。
2.被调过程可通过Lbound和Ubound函数确定实参数组的上、 下界。
3 .当用数组作形参时,对应的实参必须也是数组,且类型一 致。 4 .实参和形参结合是按地址传递,即形参数组和实参数组共 用一段内存单元。
例如:定义了实参数组b(1 to 8),给它们赋了值,调用Sort()函 数过程的形式如下:
说明:
(1)函数名:命名规则与变量名规则相同。但不能与系统的 内部函数或其它通用子过程同名,也不能与已定义的全局变 量和本模块中模块级变量同名。 (2)在函数体内,函数名可以当变量使用,函数的返回值就 是通过对函数名的赋值语句来实现的,在函数过程中至少要 对函数名赋值一次。 ( 3) AS类型:是指函数返回值的类型,若省略,则函数返 回变体类型值(Variant)。 (4)Exit Function:表示退出函数过程,常常是与选择结构 (If或Select Case语句)联用,即当满足一定条件时,退出函 数过程。 (5)形参数列表:形参的定义与子过程完全相同。
方法二:直接在代码窗口中输入
[Public|Private][Static] Sub 子过程名([形参表])
<局部变量或常数定义> <语句组> [Exit Sub]
过程体
<语句组>
End Sub
例1: 编一个交换两个整型变量值的子过程。
Private Sub Swap( X As Integer, Y As Integer)
值传递的执行过程如下图:
通过地址传递数据的执行过程
8.3.3 有关过程之间数据传递的几点说明
在子过程和函数过程调用时,如果实参是常量
(包括系统常量、用Const自定义的符号常量)或表
达式,无论在定义时使用值传递还是地址传递,此
时都是按值传递方式将常量或表达式计算的值传递 给形参变量。
如果形参定义是按传地址方式,但调用时想使实
8.3 参数传递 Visual Basic中不同模块(过程)之间数据的传递有两种方式: 通过过程调用实参与形参的结合实现; 使用全局变量来实现各过程中共享数据。 8.3.1 形式参数与实际参数 1、形式参数 是指在定义子过程和函数时,出现在Sub过程名或 Function函数名后面括号内的变量,是用来接收传送给Sub过程 或Function的数据,形参表中的各个变量之间用逗号分隔。
ByVal 。 表示当该过程被调用时,参数是按值传递的; ByRef表示当该过程被调用时,参数是按地址传递的,缺省时传址。
8.1.3 子过程的调用
方法一: Call 子过程名(参数列表) 方法二:子过程名 [参数列表]
说明:
(1)参数列表称为实参或实元,它必须与形参保持个数相同, 位置与类型一一对应。 (2)调用时把实参值传递给对应的形参。 其中值传递(形参前有ByVal说明)时实参的值不随形参的值变
8.3.4 数组作为过程的参数
Visual Basic中数组作参数是通过传地址方式传送。在传 送数组时,除遵守参数传送的一般规则外,还应注意以下 几点: 1.为了把一个数组的全部元素传送给一个过程,应将
数组名写入形参表中,并略去数组的上下界,但括号
不能省略。 Private Sub Sort( a() As single) ……
8.2.2 函数过程的调用 调用形式如下:
函数名(实参列表)
说明:在调用时实参和形参的数据类型、顺序、个数必须匹配。 函数调用只能出现在表达式中,其功能是求得函数的返回值。 调用阶乘的过程: Private Sub Command1_Click() Dim S As Integer S=5 Print fact(S) End Sub
Visual Basic函数分为内部函数和外部(自定
义)函数,外部函数是用户根据需要用Function
关键字定义的函数过程,与子过程不同的是函数 名将返回一个值 。
8.2.1 Function函数过程的定义 Function函数过程过程的定义----两种方法 方法一: 通过 “工具”菜单中的“添加过程”命令,出现“添加
<局部变量或常数定义> <语句块> [函数名=返回值] [Exit Function] <语句块> [函数名=返回值]
End Function
函数体
把例2阶乘的sub 子过程改为Function函数过程
Function fact(n As Integer) As Double Dim i As Integer, f As Double f=1 For i = 1 To n f=f*i Next fact = f End Function
过程”对话框,选择过程类型(子过程、函数、属性、事件)及作 用范围(公有的Public、私有的Private),单击确定后得到一个函 数定义的结构框架(模板),如:
Public Function Sort( ) …… End Function
方法二:直接在代码窗口中输入
[Public|Private][Static] Function 函数名([<参数列表>])[As<类型>]
(2)控件事件过程 Private Sub 控件名_事件名(参数列表) <语句组> End Sub
8.1.2 用户自定义 Sub子过程定义
Sub子过程的定义----两种方法
方法一: 通过 “工具”菜单中的“添加过程”Байду номын сангаас令,出现 “添加过程”对话框,选择过程类型(子过程、函数、属性、 事件)及作用范围(公有的Public、私有的Private),单击确 定后得到一个过程定义的结构框架(模板),如: Public Sub Sort( ) …… End Sub
化而改变。而地址传递时实参的值随形参值的改变而改变。
(3)当参数是数组时,形参与实参在参数声明时应省略其
维数,但括号不能省。 (4)调用子过程的形式有两种,用Call关键字时,实参必须 加圆括号括起,反之则不用加圆括号括起。实参之间用“,” 分隔。 例:调用上面定义的Swap子过程的形式: 在某个事件过程中调用已定义 Swap a,b 的阶乘的过程fact: Call Swap(a,b) Private Sub Command1_Click() Dim n As Integer, m As Long n=5 Call fact(n, m) Print m End Sub
相关文档
最新文档