1、工程应用培训教材Visual Basic 6.0 程序员培训教程 第四节 函数与子程序应用背景函数和子程序是构成程序的一个模块,往往是完成一个相对独立的功能,这个模块定义一个入口数据接口,一个中间过程处理算法 逻辑,最后 给定计算得到的出口数据接口。因此模块的基本过程为:数据接口 +算法逻辑+数据接口。将一个程序分解为多个模块过程,可以使程序更清晰,更容易调试,且更容易多人合作开发项目,共同完成一个大项目。下图 4-1 描述了一个典型的程序构架,这里包括全局类 定义,全局变量,局部变量,全局函数,局部函数,程序模块,全局常数,数据文件等等。图 4-1 程序构架知识要点(1)函数的定义与调用一般
2、函数有返回值,故有返回 值类型定义,且返回 值保存在函数名 变量里。函数定义的基本方式如下:public|private|static function 过程名(参数列表) as 返回值类型end function子程序模块 1/局部变量子程序模块 2/局部变量子程序模块 3/局部变量子程序模块 n/局部变量全局变量全局常数程序入口 Sub Main()全局函数全局类定义工程应用培训教材Visual Basic 6.0 程序员培训教程 在函数的定义中,过程名就是函数名,他代表一个返回 值变 量,而参数列表是一组数,代表函数的入口数据,即函数过程中要处理的数据。 调用函数的最基本方式为:变量名=
3、过程名(传递参数列表)下面是一个给定三角形的三个边长,计算面积的函数定义 :Private Function triangle(ByVal a As Single, ByVal b As Single, ByVal c As Single) As SingleDim r As Singler = (a + b + c) / 2r = r * (r - a) * (r - b) * (r - c)If r s(j + 1) Then工程应用培训教材Visual Basic 6.0 程序员培训教程 tmp = s(j)s(j) = s(j + 1)s(j + 1) = tmpEnd IfNext
4、jNext iEnd Sub调用子过程如下:Const nn = 10Dim s(nn) As IntegerCall order(s, nn)该函数的传递参数有两个,一个是整数数 组,一个是整数。本例子就是采用默认的传递地址方式传递整数数组,在子 过程中排序后,将排序好的数组传递回来。因此,在调用排序函数的前打印数组与调用函数后打印数组是不一样的。(5)递归函数VB 允许子过程或函数内部调用自己, 这样的子过程或函数成 为递归函数。递归函数在程序的设计 中是一个技巧,有时候能够很巧妙的解决很多实际问题。下面是一个简单的 递归函数举例:Public Function tree(s As Lon
5、g) As LongIf s = 0 Thentree = 1Elsetree = (s + 1) / tree(s - 1)End IfEnd Function在设计递归函数必须具备递归条件,否 则程序陷入死循环 的逻辑错误之中。上面这个递归函数的终 止条件是 s=0。(6)变量的作用域在窗体和标准模块中定义的变量或过程,加 Private 作限制的,只能在当前模块中使用。在窗体中定义的过程,一般应该用 Private 加以限制,说明该过程或变量是窗体级变量,只能在窗体模 块中使用,在其他模块中是不可 见的。工程应用培训教材Visual Basic 6.0 程序员培训教程 在模块中定义的过程
6、,默认的为全局的,也可以加 Public 作 说明。局部变量为在子过程内使用或不加说明使用的变量,只能在过程中使用,离开过程该变量失效.窗体或模块级变量:在通用声名区域中声明的 变量,可以在窗体或模块代码中使用,private 或 Dim,成 为窗体级或模块级变量,离开窗体或者模 块级变量失效。全局变量:在模块级变量定义中,使用 Public 或者 Global,则该变量可以在整个程序范围内任意地方使用,当在程序运行过程中改 变一个全局变量的值,那么当程序再次使用 该变量时,就是已经改变的变 量值拉。在一个工程中,所有的窗体对象,连接对象, 类定义都是全局的,可以在程序的人一地方使用。应用举例
7、:例 1:编写一个计算三角形面积的函数, 计算边长为(6, 8,10)和(15,17,28)的三角形面积,并打印在窗体上。1建立一个标准 exe 的工程 1,在窗体上添加命令按钮 12在窗体代码的通用声明部分,写程序 Option Explicit 告诉 VB 下面的程序中的变量必须声明才可使用。并编写计算三角形面 积的函数如下:Option ExplicitPrivate Function triangle(ByVal a As Single, ByVal b As Single, ByVal c As Single) As SingleDim r As Singler = (a + b +
8、 c) / 2r = r * (r - a) * (r - b) * (r - c)If r s(j + 1) Thentmp = s(j)s(j) = s(j + 1)s(j + 1) = tmpEnd IfNext jNext iEnd Sub工程应用培训教材Visual Basic 6.0 程序员培训教程 3.在窗体 Form1 的代码最顶部的通用声明部分,写程序 Option Explicit 告诉 VB 下面的程序中的 变量必须声明才可使用。在窗体加载事件中,对全局数组进行初始化,代码如下:Dim i As IntegerRandomizeFor i = 0 To nns(i) =
9、Int(100 * Rnd) + 1Next i4. 编写命令按钮 Command2 的 Click 事件,程序如下:Private Sub Command2_Click()Dim i As IntegerFor i = 0 To nnPrint Tab(i * 4); s(i);Next iPrintCall order(s, nn)For i = 0 To nnPrint Tab(i * 4); s(i);Next iEnd Sub程序运行结果如下图 4-3图 4-3 程序运行结果例 3:编写一个判断整数是否为素数的函数, 输入一个整数,返回一个布尔型变量,为 true 时代表该整数为素数
10、, 为 false 时不是素数。请计算 1 到10000 之间的所有素数之和1.在已经建立的标准 exe 工程 1 中,在窗体 form1 添加命令按钮 32.在窗体代码的通用声明部分,写程序 Option Explicit 告诉 VB 下面的程序中的变量必须声明才可使用,并编写判断素数的函数如下:Public Function prime(ByVal m As Long) As BooleanDim i As Long工程应用培训教材Visual Basic 6.0 程序员培训教程 prime = TrueFor i = 2 To m - 1If (m Mod i) = 0 Thenprim
11、e = FalseExit ForEnd IfNext iEnd Function3编写 Command3 的 Click 事件,调用判断素数函数, 计算 1 到10000 的所有素数之和,代码 如下:Private Sub Command3_Click()Dim i As LongDim sumprime As Longsumprime = 0For i = 2 To 10000If prime(i) ThenPrint i;sumprime = sumprime + iEnd IfNext iPrintPrint sumprimeEnd Sub程序运行结果如下图 4-4图 4-4 程序运行
12、结果例 4:利用递归函数计算 n0 时的 f(n)=n*f(n-1),其中 n=1 时 f(1)=1。1.在已经建立的标准 exe 工程 1 中,在窗体 form1 添加命令按钮 4工程应用培训教材Visual Basic 6.0 程序员培训教程 2.在窗体代码的通用声明部分,写程序 Option Explicit 告诉 VB 下面的程序中的变量必须声明才可使用,并编写 f(n)=n*f(n-1)的 递归函数如下:Private Function funn(n As Integer) As LongIf n = 0 Thenfunn = 1Elsefunn = n * funn(n - 1)E
13、nd IfEnd Function3.编写 Command4 的 Click 程序,计算打印 f(10)的结果,代 码如下:Private Sub Command4_Click()Print funn(10)End Sub知识扩展:(1)内部函数 Shell内部函数 Shell (外部程序全路径,窗体状态常数) ,用于执行外部的程序,这给用户提供了很多方便之 处。例如:Shell “cmd“, vbNormalFocus表示执行启动命令 cmd,并获得焦点,即 Console 控制台。培训练习:(1)编写函数,用于计算一个数组的平均值, 该函数定义如下:Function avg( a as S
14、ingle,Byval n as Integer) as Single,并请验证函数。(2)编写一个子过程,用于 查找一个数组的最大值和最小值,该子过程如下定义:Private Sub seek( a as single,byval n as Integer,mina as Single,maxa as Single),并请验证子过程。(3)编写随机数产生程序, x 为在 0-99 之间的随机数,请编写命令按钮点击程序,不考虑纵向位置,在窗体上横向 x 的位置打印 A 字符,且当不断点击时产生的位置不一样。(4)计算 的值,当 x=97.2,108.6 时的值。e35.1)log(5)在自动化系统中经常使用十六进制数,请计算 100,800,654,8765,2,233 的十六进制和八进制的转换值,打印到窗体上。