您现在的位置:首页 >> 过程与函数 >> 内容

函数过程的定义和调用

时间:2009-6-19 9:10:41 点击:3828

将一个大的程序分割成较小的逻辑部件就可以简化程序设计任务,我们一般称这些部件为过程,它们可以变成增强和扩展Visual Basic的构件。

VB6.0中过程有两大类:内部过程和外部过程。内部过程是系统提供的,不需要用户编写,如内部函数系统提供的方法都属于内部过程。外部过程是用户根据需要定义的,供调用的程序段,外部过程分为子过程、函数过程和事件过程。过程可用于简化重复任务或共享任务,例如,简化频繁的计算、文本与控件的操作及数据库操作。在VB中使用过程编程有两个优点:

1.      过程可使程序划分成离散的逻辑单元,每个单元都比没有使用过程的整个程序容易调试。

2.      一个程序中的过程,往往不必修改或只需稍作改动,便可以成为另一个程序的构件。

Visual Basic 中使用下列几种过程:

1.      Sub 过程,不返回值或多个返回值。

2.      Function 过程,有一个返回值。

 函数过程的定义和调用

Visual Basic 6.0提供了诸多内置的内部函数,如 SqrCosChr等等,这些功能强大而又使用简单的函数为我们编程中解决问题带来了很多的方便。此外,还可用 Function 语句编写用户自己的Function 过程。

一、引例

6.1  S=3! +4!+7!的值。

求阶乘的算法实际上是一个连乘的算法,这里要求的S的值是3个没有规律的数的阶乘之和。因此,可以定义一个专门用于求阶乘的函数过程,把它当成一个求阶乘工具,再根据需要反复多次调用它,以获得相应的阶乘值。

‘先定义一个求阶乘的过程,这里的x暂时没有值,只代表要求阶乘的一个未知数

Function Jc(x%) as integer

  Dim i as integer,t as integer

  For i=1 to x

    T=t*i

  Next i

Jc=t               ‘所求得的阶乘由Jc函数负责带回给主调程序

End function

‘在事件过程中输入要求阶乘的数,然后再调用以上定义的过程,得到该数的阶乘

Sum Form_Click()

Dim a as integer,b as integer,c as integer s as integer

a=input(“请输入a的值”)

b=input(“请输入b的值”)

c=input(“请输入c的值”)

s=jc(a)+jc(b)+jc(c)                       ‘三次调用Jc函数

Msgbox(S=)$s

End Sub

程序运行后,单击该窗体以触发窗体的Click事件,使得Form_Click()过程代码得以执行。执行后,依次输入a,b,c的值,即347,然后由Jc过程负责计算这三个数的阶乘之和,最后由主调过程Form_Click()输出所求得的阶乘和S

二、函数过程的定义

VB中,函数也属于过程,函数调用结束时,可以返回一个值给调用程序。函数过程在被调用前,一定要先定义,函数定义的方式一般有两种:

1.利用“添加过程”对话框定义

打开窗体或模块的代码窗口,单击“工具”菜单,选择“添加过程”命令,即可打开“添加过程”对话框,如图6-1所示,然后对话框的“类型”选项组中选择“函数”单选按钮即可。

6-1 添加过程

在“添加过程”对话框中输入并选择相应的内容和项目即可。在“名称”文本框内输入待定义函数过程的名称,在“类型”选项组中选择“函数”单选按钮。

若要定义一个标准模块级或窗体级的局部过程,则选择“范围”选项组中的“私有的”单选按钮,“公有的”表示该过程为公有过程,定义后整个程序范围内均可调用该过程。此外,可以根据使用变量的性质和需要选择“所有本地变量为静态变量”复选框。单击确定按钮,则可建立一个函数过程的框架,如图6-2所示。

6-2  函数过程框架

在该函数过程的框架中(上图光标处)可编写相应的函数过程代码。

2.直接在代码窗口定义

进入代码窗口后,在左侧显示对象名的下拉列表框中选择“(通用)”,在右侧显示过程的下拉列表框中选择“(声明)”,然后输入Function及函数名即可。

自定义函数过程的格式如下:

[Public| Private][Static]Function<函数名>[(<形参列表>)][As<类型>]

  [<语句块1>]

  [函数名=<表达式>]

  [Exit Function]

[<语句块2>]

[函数名=<表达式>]

End Function

其中:

1[PublicPrivate]:表示过程是“公有的”或“私有的”。Public表示该过程为公有过程,定义后整个程序范围内均可调用该过程,但调用时必须加上该子过程所在的窗体或标准模块作为前辍,而Private表示私有子过程,用它定义的子过程只能在本窗体或模块中被调用。关于PublicPrivate定义子过程后的具体调用规则见本章“6.4.1过程的作用域”。

2[Static]:表示过程中的局部变量是静态变量,在过程被调用后,其值仍然被保留;

3[(<形参列表>)]:该项中的参数为形式参数,使用格式为[ByVal|ByRef]<变量名>[As<数据类型>]

4ByVal:表示调用时参数为值传递方式,实参的值不随形参值的变化而变化;

5ByRef:参数默认选项,表示参数为地址传递方式,实参的值随形参值的改变而改变;

6)参数:可以是变量名或数组名,当参数为数组名时,形参和实参在参数声明时应省略其维数,但括号[ ]不能省略。当参数有多项时,参数间要用逗号分隔开。

[Exit Function]用于退出函数过程,该项一般嵌套在if结构中使用,在满足if条件时退出该函数过程。

7As <类型>表示函数返回值的类型,默认为变体型。

8[函数名=<表达式>],用于函数运行后返回一个值。如在定义中未对函数名赋值,则将返回一个默认值。其中,数值型为0,字符型为“”,变量型为Empty

6.2  已知直角三角形两直角边的边长,计算该三角形的斜边边长。

函数过程如下:

Function Hypotenuse (x As Integer, y As Integer)  As Integer

   Hypotenuse = Sqr (x ^ 2 + y ^ 2)

End Function

三、函数过程的调用

1.函数调用的形式

Visual Basic中,自定义Function函数过程的调用与系统提供的内部函数的调用方法相同。其调用形式如下:

函数过程名(实参列表)

其中,实参列表中的实参是传递给被调用过程的变量或表达式。

VB中,自定义的函数过程一般被另一个事件过程调用,如上例6.2求三角形的斜边边长,可以在Command1_Click()过程中通过文本框Text1Text2分别输入三角形的两条直角边的边长ab,然后再调用Hypotenuse()函数。

Private Sub Command1_Click()

Dim a as Interger, b as Integer, s As Integer

a= Val(Text1)

b=Val(Text2)

s = Hypotenuse(a,b)   ‘函数调用语句

Print s

End Sub

调用函数后,函数过程名将有一个返回值,函数是一个特殊的表达式。因此,函数不能作为单独的一条语句,而必须要以给变量赋值或与命令一起使用的形式。

2.函数过程调用的执行流程

在事件过程调用一个函数过程时,程序在执行这两个过程时的流程如图6-3所示。


6-3 过程调用的执行流程

过程调用时:

1)事件过程Command1_Click()在执行到函数过程调用语句“s = Hypotenuse(a,b)”时,程序执行控制权转移到Hypotenuse()函数过程中;

2)执行控制权转移时,实参ab的值将分别传递给Hypotenuse()函数中的形参xy

3xy获得初值后,即可执行函数过程中的程序代码并给函数过程名赋值,该值即为整个函数过程的返回值;

4)函数执行结束后,函数的返回值将赋给主调事件过程的变量s

5)变量s得到赋值后,接着执行调用函数过程后面的剩余语句。

6.3 任意输入两个数,求这两个数之和。

分析:解此题我们可以先定义一个求两个数之和的函数,然后在主过程中依次用InputBox()函数输入两个数值,再调用该求和的函数。

‘主过程代码

Private Sub Command1_Click()

Dim x(1 To 2) As String

  For i=1 To 2

    x(i)=InputBox(Enter a Value,Input Box)

  Next i

  s=add(x(1),x(2))

  Print s=;s

End Sub

‘自定义求和函数

Function add(a As Single, b As Single)           

   add=a+b

End Sub

此时,由函数名add将值返回给该过程并赋给s

作者:Admin  
  • 上一篇:没有了
  • 下一篇:子过程的定义和调用
  • 本类推荐
    • 没有
    本类固顶
    • 没有
  • VB程序设计学习网站(赣南师范学院) © 2008 版权所有 All Rights Reserved.
  • 地址:江西省赣州市经济技术开发区 赣南师范学院数学与计算机科学学院 邮政编码:341000
    Email:ZQ188@163.com 技术支持QQ:87319633 移ICP备10086号
  • GnsySjxy! V2.4