VB自定义函数与子过程
8.2 自定义函数过程
8.2.2 函数过程的定义
函数过程在被调用前,一定要先定义,函数定义的方式一般 有两种: 1.利用“添加过程”对话框定义
打开窗体或模块的代码窗口,单击“工具”菜单,选 择“添加过程”命令,即可打开“添加过程”对话框。
8.2 自定义函数过程
在“添加过程”对话框中输入并选择相应的内容和 项目即可。在“名称”文本框内输入待定义函数过程的名称, 在“类型”选项组中选择“函数”单选按钮。
Print "Va="; Va, "Vb="; Vb
'输出原始值
Call Cp(Va, Vb)
Print "在主调过程中调用子过程后的值"
'输出经子
过程处理过后的返回值
Print "Va="; Va, "Vb="; Vb
End Sub
运行结果:
程序运行后,单击窗体以触发Form_Click()事件过 程,运行结果如下图所示。
For K = 3 To N / 2
'第一个数的取值区间折半
If prime(K) And prime(N - K) Then ‘二次调用结果都是
素数输出
Print I; ":"; N; "="; K; "+"; N - K
Exit For
'退出k循环
End If
Next K
I=I+1
Next N
End Sub
⑤④
3)x和y获得初值后,即可执行函数过程中的程序 ①
代码并给函数过程名赋值,该值即为整个函数过程
②
的返回值;
③
4)函数执行结束后,函数的返回值将赋给主调事 件过程的变量s;
⑤④
5)变量s得到赋值后,接着执行调用函数过程后面
的剩余语句。
8.3 子过程的定义和调用
引例 调用函数后,将得到函数的返回值,但是,在有些问
例8.2 设计一个程序统计字符串中西文字符个数。
算法:汉字的Asc()函数的返回值小于0;西文字符的Asc()函数
的返回值大于0。
Function CountXw%(ByVal S$)
Dim I%, T%, K%, C$
For I = 1 To Len(S)
C = Mid(S, I, 1)
'逐个地取出字符
说明
3)[(<形参列表>)]:该项中的参数为形式参数,又称哑元, 可以是变量名或数组名,当参数为数组名时,形参和实参在 参数声明时应省略其维数,但括号()不能省略。当参数有多 项时,参数间要用逗号分隔开。使用格式为[ByVal|ByRef]< 变量名>[As<数据类型>] 4)ByVal:表示调用时参数为值传递方式,实参的值不随形 参值的变化而变化;
第八章 自定义函数与子过程
几个概念
一、VB程序的基本构成是过程。 二、VB6.0中过程有两大类:内部过程和外部过程。 1、内部过程:系统提供的,不需要用户编写,如内部函数。 2、外部过程:用户根据需要定义的,供调用的程序段,外部 过程分为子过程、函数过程。
几个概念
三、在VB中使用过程编程有两个优点: 1、过程可使程序划分成离散的逻辑单元,每个单元都比没有 使用过程的整个程序容易调试。 2、一个程序中的过程,往往不必修改或只需稍作改动,便可 以成为另一个程序的构件。 四、Visual Basic 的两类过程: 1、Sub 过程(子过程),不返回值或多个返回值。 2、Function 过程(函数过程),有一个返回值。
例如: Private Sub Command1_Click()
a=”Visual Basic” b= “6.0” Call Link(a,b) End Sub
此时,将输入的值a和b作为实参调用Link子过程, 通过调用将两个实参传递给形参,然后在过程中计算。
6.2 子过程的定义和调用
例:分别计算两个数的和与差,而当两个数的值均 为0时则不进行任何计算。
Sub Operation(x As Integer , y As Integer) Dim t1 as Integer, t2 as Integer If x =0 and y=0 Then Exit Sub End If t1=x+y t2=x-y Print “t1=”;t1; “t2=”;t2
‘ 调用CountXw函数
Picture1.Print Text1 ' 在Picture1中显示统计的结果
Picture1.Print "有"; C1; "个西文字符数"
End Sub
8.2 自定义函数过程
8.2.3 函数过程的调用
1.函数调用的形式 其调用形式如下:
变量=函数过程名(实参列表)
其中,实参列表中的实参是传递给被调用过程的变量或表达式。 例题8.2中的C1 = CountXw(Text1.Text) 就是一次函数调用。
从程序中可以看到,Va和Vb的初值分别是45和23, 而在窗体中输出时Va和Vb的值分别是23和45,达到了两个数 交换的目的。
8.3 子过程的定义和调用
8.3.1 子过程的定义
子过程以过程名来标识,被其它过程调用。子过程与 事件过程有一定区别,事件过程可以在该事件触发或调用时 执行,而用户自定义的子过程只有在被其它过程调用时才能 执行。
[<语句块1>] [函数名=<表达式>] [Exit Function] [<语句块2>] [函数名=<表达式>] End Function
说明
1)[Public或Private]:表示函数是“公有的”或“私有的”。 Public表示该函数为公有过程,定义后整个程序范围内均可调 用该函数,但调用时必须加上该函数所在的窗体或标准模块作 为前辍,而Private表示私有子过程,用它定义的函数只能在本 窗体或模块中被调用。缺省默认是公有的。 2)[Static]:表示函数中的局部变量是静态变量,在函数被调 用后,其值仍然被保留;
题的中,过程执行结束后不需要返回值,用函数过程实现就会 非常困难,而应该使用子过程的形式。
例8.3 试编写一个将两个数进行交换的过程供其它过 程多次调用。
分析:先编写一个具有将两个数进行交换的子过程,需 要进行两数交换时,调用该子过程,同时将待交换的两个数传 送到该子过程中,在子过程实现两数交换。子过程执行结束后, 将被交换后的两个数返回到主调过程中。
If Asc(C) > 0 Then K = K + 1 '字符ASCII码大于
0,则个数累加1
Next I
CountXw = K '返回函数值
End Function
例8.2 设计一个程序统计字符串中西文字符个数。
Private Sub Command1_Click()
Dim C1%
C1 = CountXw(Text1.Text)
'函数取值False,则x不是素数
Exit Function
'函数结束
End If
Next I
End Function
8.2 自定义函数过程
‘在事件过程中调用以上定义的函数,得到结果。
Private Sub Form_Click()
Dim I%, N, K%
I=1
'计数
For N = 50 To 100 Step 2 '取偶数
个过程时的流程如下图所示。
Function Hypotenuse( x%,y%)
Hypotenuse = Sqr (x ^ 2 + y ^ 2) ①
②
End Function
Private Sub Command1_Click()
③
…… s = Hypotenuse(a,b)
⑤④
……
End Sub
函数过程调用的执行流程图
子过程的定义跟函数过程的定义相类似,在代码窗口 中输入Sub及子过程名即可,系统会自动加上End Sub与子过 程名后的一对括号(),然后即可在子过程的框架中输入程 序代码。
子过程的定义格式: [Private|Public][Static] Sub <过程名>[(<参数列表>)]
[<语句块1>] [Exit Sub] [<语句块2>] End Sub ——————————— 说明: [Public]|[Private]与[Static]:它们的含义和作用与函数 过程中相应的这些关键词相同。 [(<参数列表>)]:该项中参数的形式和调用方法也与函数过 程相同。 [Exit Sub]:退出过程,该项一般嵌套在if结构中使用,在 满足if条件时退出该过程。
说明
5)ByRef:参数默认选项,表示参数为地址传递方式,实参 的值随形参值的改变而改变,数组只能以传地址的方式引用;
6) As <类型>表示函数返回值的类型,默认为变体型。在 函数体内至少应对对函数名赋值一次。
7) [函数名=<表达式>],用于函数运行后返回一个值。如 在定义中未对函数名赋值,则将返回一个默认值。其中,数 值型为0,字符型为“”,变量型为Empty。 8) [Exit Function]用于退出函数过程,该项一般嵌套在 if结构中使用,在满足if条件时退出该函数过程。
End Subຫໍສະໝຸດ 6.2 子过程的定义和调用
在Sub 过程与Function 过程之间的区别:
1)子过程名无类型说明,在子过程中不能对子过程
名进行赋值。
2) 子过程的形式参数没有具体的值,只代表