第八章 VB自定义函数与子过程

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中,过程执行结束后不需要返回值,用函数过程实现就会非常 困难,而应该使用子过程的形式。 例8.3 试编写一个将两个数进行交换的过程供其它过程多次 调用。
分析:先编写一个具有将两个数进行交换的子过程,需要进
行两数交换时,调用该子过程,同时将待交换的两个数传送到 该子过程中,在子过程实现两数交换。子过程执行结束后,将 被交换后的两个数返回到主调过程中。
注意:调用函数后,函数过程名将有一个返回值,函数是
一个特殊的表达式。因此,函数不能作为单独的一条语句,而 必须要以给变量赋值或与命令一起使用的形式。 例如: If prime(K) And prime(N - K) Then
8.2 函数过程的定义和调用
2.函数过程调用的执行流程 在事件过程调用一个函数过程时,程序在执行这两个过 程时的流程如下图所示。 Function Hypotenuse( x%,y%) Hypotenuse = Sqr (x ^ 2 + y ^ 2) ① ② End Function ③ Private Sub Command1_Click() …… ⑤ ④ s = Hypotenuse(a,b) …… End Sub 函数过程调用的执行流程图
例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) '逐个地取出字符 '字符ASCII码大于 If Asc(C) > 0 Then K = K + 1
„主调程序Cp子过程
Private Sub Command1_Click() Dim Str1$, Va%, Vb%
Str1$ = "输入对话框"
Va = InputBox("Va=", Str1$) Vb = InputBox("Vb=", Str1$) Print "在主调过程中调用子过程前的值" Print "Va="; Va, "Vb="; Vb Call Cp(Va, Vb) Print "在主调过程中调用子过程后的值" 过程处理过后的返回值 '输出经子 '输出原始值
8.2 自定义函数过程
Private Function prime(ByVal x As Integer) As
Boolean
Dim I% prime = True For I = 2 To Sqr(x) If x Mod I = 0 Then '判断x是否可被i整除 '函数赋初值True
prime = False
子过程的定义格式: [Private|Public][Static] Sub <过程名>[(<参数列表>)] [<语句块1>] [Exit Sub] [<语句块2>] End Sub ——————————— 说明: [Public]|[Private]与[Static]:它们的含义和作用与函数过程中 相应的这些关键词相同。 [(<参数列表>)]:该项中参数的形式和调用方法也与函数过程 相同。 [Exit Sub]:退出过程,该项一般嵌套在if结构中使用,在满 足if条件时退出该过程。
过程调用时执行顺序如下:
1)事件过程Command1_Click()在执行到函数过程调 用语句“s = Hypotenuse(a,b)”时,程序执行控制权 转移到Hypotenuse()函数过程中; 2)执行控制权转移时,实参a和b的值将分别传递 给Hypotenuse()函数中的形参x和y;

② ③
8.2 自定义函数过程
8.2.2 函数过程的定义
函数过程在被调用前,一定要先定义,函数定义的方式一般 有两种: 1.利用“添加过程”对话框定义 打开窗体或模块的代码窗口,单击“工具”菜单,选择 “添加过程”命令,即可打开“添加过程”对话框。
8.2 自定义函数过程
在“添加过程”对话框中输入并选择相应的内容和项目 即可。在“名称”文本框内输入待定义函数过程的名称,在 “类型”选项组中选择“函数”单选按钮。 单击确定按钮,则可建立一个函数过程的框架 。
Print "Va="; Va, "Vb="; Vb
End Sub
运行结果:
程序运行后,单击窗体以触发Form_Click()事件过程,运 行结果如下图所示。 从程序中可以看到,Va和Vb的初值分别是45和23,而在 窗体中输出时Va和Vb的值分别是23和45,达到了两个数交换 的目的。
8.3 子过程的定义和调用
„ 调用CountXw函数
' 在Picture1中显示统计的结果
Picture1.Print "有"; C1; "个西文字符数"
8.2 自定义函数过程
8.2.3 函数过程的调用
1.函数调用的形式
其调用形式如下:
变量=函数过程名(实参列表)
其中,实参列表中的实参是传递给被调用过程的变量或表达式。
例题8.2中的C1 = CountXw(Text1.Text) 就是一次函数调用。
例如: Private Sub Command1_Click() a=”Visual Basic” b= “6.0” Call Link(a,b) End Sub 此时,将输入的值a和b作为实参调用Link子过程,通过调 用将两个实参传递给形参,然后在过程中计算。
1、过程可使程序划分成离散的逻辑单元,每个单元都比没有 使用过程的整个程序容易调试。 2、一个程序中的过程,往往不必修改或只需稍作改动,便可 以成为另一个程序的构件。 四、Visual Basic 的两类过程: 1、Sub 过程(子过程),不返回值或多个返回值。
2、Function 过程(函数过程),有一个返回值。
„Cp()子过程的定义 Private Sub Cp(A As Integer, B As Integer) '形参为 传址方式 If A = 0 Then Exit Sub End If A = A + B 'A和B的值交换,带回主调过程 B = A - B A = A - B Print "在子过程中交换后的值" Print "A="; A, "B="; B End Sub
8.3.1 子过程的定义
子过程以过程名来标识,被其它过程调用。子过程与事 件过程有一定区别,事件过程可以在该事件触发或调用时执 行,而用户自定义的子过程只有在被其它过程调用时才能执 行。 子过程的定义跟函数过程的定义相类似,在代码窗口中 输入Sub及子过程名即可,系统会自动加上End Sub与子过程 名后的一对括号(),然后即可在子过程的框架中输入程序 代码。


3)x和y获得初值后,即可执行函数过程中的程序
代码并给函数过程名赋值,该值即为整个函数过程 的返回值; 4)函数执行结束后,函数的返回值将赋给主调事 件过程的变量s; 5)变量s得到赋值后,接着执行调用函数过程后面 的剩余语句。

② ③


8.3 子过程的定义和调用
引例
调用函数后,将得到函数的返回值,但是,在有些问题的
第八章 自定义函数与子过程
几个概念
一、VB程序的基本构成是过程。 二、VB6.0中过程有两大类:内部过程和外部过程。 1、内部过程:系统提供的,不需要用户编写,如内部函数。
2、外部过程:用户根据需要定义的,供调用的程序段,外部
过程分为子过程、函数过程。
几个概念
三、在VB中使用过程编程有两个优点:
说明
1)[Public或Private]:表示函数是“公有的”或“私有的”。
Public表示该函数为公有过程,定义后整个程序范围内均可调用 该函数,但调用时必须加上该函数所在的窗体或标准模块作为 前辍,而Private表示私有子过程,用它定义的函数只能在本窗 体或模块中被调用。缺省默认是公有的。 2)[Static]:表示函数中的局部变量是静态变量,在函数被调用 后,其值仍然被保留;
说明
3)[(<形参列表>)]:该项中的参数为形式参数,又称哑元,
可以是变量名或数组名,当参数为数组名时,形参和实参在
参数声明时应省略其维数,但括号()丌能省略。当参数有多 项时,参数间要用逗号分隔开。使用格式为[ByVal|ByRef]<变 量名>[As<数据类型>] 4)ByVal:表示调用时参数为值传递方式,实参的值丌随形
Exit Function End If Next I End Function
'函数取值False,则x不是素数
'函数结束
8.2 自定义函数过程
„在事件过程中调用以上定义的函数,得到结果。 Private Sub Form_Click() Dim I%, N, K% I = 1 '计数 For N = 50 To 100 Step 2 '取偶数 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
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 End Sub
0,则个数累加1
Next I CountXw = K End Function '返回函数值
Байду номын сангаас
例8.2 设计一个程序统计字符串中西文字符个数。
Private Sub Command1_Click() Dim C1%
C1 = CountXw(Text1.Text)
Picture1.Print Text1 End Sub
1.使用Call语句调用
格式:Call 子过程名[(实参列表)] 说明: ① 实参的个数,数据类型都应与被调用过程的形参一一对应。 用Call语句调用时,若有实参,括号丌能省略,否 则,可以省略括号。 ② 若子过程要通过实参向主调过程中返回值,则实参只能是 简单变量、数组名或自定义类型变量。
8.3 子过程的定义和调用
6.2 子过程的定义和调用
在Sub 过程不Function 过程之间的区别:
1)子过程名无类型说明,在子过程中不能对子过程 名进行赋值。 2) 子过程的形式参数没有具体的值,只代表 参数的个数、位置、类型。 3)子过程的调用必须是一条独立的语句。
8.3 子过程的定义和调用
8.3.2 子过程的调用
参值的变化而变化;
说明
5)ByRef:参数默认选项,表示参数为地址传递方式,实参 的值随形参值的改变而改变,数组只能以传地址的方式引用;
6) As <类型>表示函数返回值的类型,默认为变体型。在
函数体内至少应对对函数名赋值一次。
7) [函数名=<表达式>],用于函数运行后返回一个值。如在 定义中未对函数名赋值,则将返回一个默认值。其中,数值 型为0,字符型为“”,变量型为Empty。 8) [Exit Function]用于退出函数过程,该项一般嵌套在if结 构中使用,在满足if条件时退出该函数过程。
8.2 自定义函数过程
例8.1 设计程序将[50,100]区间内的偶数拆成两个
素数之和
分析:可先将偶数拆分成两个数之和,在分别对这两个
数进行素数判定,若都是素数就输出。例如:可将50拆
分为:3+47、4+46、….. 47+3,然后对每种组合中的两个数 分别进行素数判断。
因此,可以定义一个专门用于素数判断的 函数过程。
8.2 自定义函数过程
2.直接在代码窗口定义
进入代码窗口后,在左侧显示对象名的下拉列表框中选
择“(通用)”,在右侧显示过程的下拉列表框中选择 “(声明)”,然后输入Function及函数名即可。
自定义函数过程的格式如下: [Public| Private][Static]Function<函数名>[(<形参列表>)][As<类型>] [<语句块1>] [函数名=<表达式>] [Exit Function] [<语句块2>] [函数名=<表达式>] End Function
相关文档
最新文档