Visual Basic(第七章).doc_第1页
Visual Basic(第七章).doc_第2页
Visual Basic(第七章).doc_第3页
Visual Basic(第七章).doc_第4页
Visual Basic(第七章).doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中原工学院教案 Visual Basic语言 13第7章 过 程“过程”体现了“自顶向下、逐步细化”的结构化程序设计思想,是实现结构化程序设计思想的重要方法。使用过程编程的优点:(1)可以将一个大的程序分解为若干个模块,每个模块只完成一个功能,便于程序的调试。(2)便于多人协作共同开发一个程序(3)模块具有一定的通用性,可以当前程序或其他程序调用。在VB中具有两种类型的过程:Sub(子程序)过程和 Function(函数)过程。7.1 Sub过程Sub过程分为:事件过程和通用过程。7.1.1 事件过程与通用过程一、事件过程事件过程由VB自行声明,是附属于窗体和控件的。用户不能增加或删除事件过程。二、通用过程通用过程由用户建立,它不与任何特定的事件相联系,只能由别的过程来调用。通用过程存储在窗体的通用段或标准模块中。7.1.2 通用过程的创建建立通用过程有两种方法。一、在“代码”编辑窗口中输入1建立Sub过程在“代码”编辑窗口现有过程的外面,按如下格式输入: Private | Public Static Sub 过程名( 形参表 )系统将自动添加过程尾代码:End Sub2Sub过程的格式: Private | Public Static Sub 过程名( 形参表 ) 语句列 Exit Sub 语句列End Sub说明:(1)通用过程可放入标准模块和窗体模块中。缺省时所有模块中的子过程为Public。当选用Private参数时,只有该过程所在模块中的过程才能调用。(2)如果使用Static关键字,则该过程中所有局部变量的值在整个程序运行期间都存在。(后面介绍)在过程内部,Static类型的变量存在且可见;在过程外部,Static类型的变量存在但不可见。(3)过程名:与变量名的命名规则相同。(4)语句列:过程中的程序段。可以用一个或多个Exit Sub语句从过程中退出。(5)形参表:指明从调用过程传递给被调用过程的变量个数和类型(各变量名之间用逗号分隔)。 “形参表”中形参的语法为:(后面介绍)ByVal | ByRef 变量名( ) As 类型 其中:ByVal 表示该参数按值传递。ByRef 表示该参数按地址传递(缺省选项)。变量名 代表参数的变量名称或数组名称(后面加上一对小括号)。类型 传递给过程的变量或数组的数据类型。(6)“形参表”中出现的参数称为形式参数,简称为形参。调用过程时形式参数被实际参数(实参)代替。(7)在过程内部,不能再定义过程。(举例说明以上内容)二、使用“添加过程”对话框使用“添加过程”对话框建立过程的方法:(屏幕演示)(1)打开要添加过程的代码编辑窗口。(2)执行“工具”菜单中的“添加过程”7.1.3 通用过程的调用调用Sub过程有两种方法:= 使用Call语句:Call 过程名(实参表)。= 直接使用过程名:过程名 实参表。说明:(1)实参表:实际参数列表,参数之间用逗号分隔。实际参数可以是常量、变量、表达式等。(2)使用Call语句时,参数必须放在括号内。(3)不使用Call时,不能加括号,参数放在过程名之后。例如:Stars 40Call Stars(40)前面的作业6.3,可以改为:Dim a(1 To 5, 1 To 6) As IntegerPrivate Sub CerateA() a(1, 1) = 86: a(1, 2) = 87: a(1, 3) = 80: a(1, 4) = 96: a(1, 5) = 84 a(2, 1) = 63: a(2, 2) = 67: a(2, 3) = 76: a(2, 4) = 96: a(2, 5) = 65 a(3, 1) = 64: a(3, 2) = 77: a(3, 3) = 73: a(3, 4) = 56: a(3, 5) = 66 a(4, 1) = 65: a(4, 2) = 87: a(4, 3) = 72: a(4, 4) = 66: a(4, 5) = 67 a(5, 1) = 66: a(5, 2) = 97: a(5, 3) = 71: a(5, 4) = 86: a(5, 5) = 69End SubPrivate Sub Command1_Click() Call CerateA Max = 0: k = 0 For i = 1 To 5 For j = 1 To 5 a(i, 6) = a(i, 6) + a(i, j) If a(i, 6) Max Then Max = a(i, 6) k = i End If Next j Next i Print k, Max / 5End Sub【例7.1】建立一个计算阶乘的通用过程。设该过程的过程名为fact,代码如下:Sub fact(m As Integer, total As Long) Dim i As Integer total = 1 For i = 1 To m total = total * i Next iEnd Sub【例7.2】调用【例7.1】建立的通用过程,计算5! + 6! + 8!。代码:命令按钮组的Click事件代码为:Private Sub Command1_Click() Dim a As Integer, b As Integer, c As Integer Dim s As Long, tot As Long, p As String a = 5: b = 6: c = 8 Call fact(a, tot) s = tot Call fact(b, tot) s = s + tot Call fact(c, tot) s = s + tot p = a & ! + & b & ! + & c & ! = & s MsgBox p, vbOKOnly, 计算结果End Sub【例7.2】调用【例7.1】建立的通用过程,计算 代码如下:Private Sub Command1_Click() Dim m As Integer, n As Integer, t As Long m = Text1.Text n = Text2.Text Call fact(m, t): a = t Call fact(m - n, t): b = t Call fact(n, t): c = t s = a / (b * c) p = 从 & m & 个元素中取出 & n & 个的组合数= & s MsgBox p, 0, 计算结果End Sub7.2 Function过程当一个过程在执行后需要返回一个结果时,使用函数比较方便。除了系统内部函数,用户还可以编写和使用自己定义的Function函数。Function函数可以像系统的内部函数一样使用。7.2.1 Function过程的定义Function过程的语法是: Private | Public Static Function 函数名( 形参表 ) As 类型 语句列 函数名 = 表达式 Exit Function 语句列 函数名 = 表达式End Function说明:(1)函数名:Function过程的名字。(2)As类型:指定Function过程返回值的数据类型。没有As子句时,缺省类型为Variant。(3)表达式:其值是函数返回的结果。如果在Function过程中没有“函数名 = 表达式”,则该过程返回一个默认值(例如,数值函数返回0,字符串函数返回空字符串)。(4)语句列:程序段。(5)Exit Function语句:从函数中退出。【例7.3】计算任意整数阶乘的Function过程fact:Function fact(x As Integer) As Long Dim p As Long, i As Integer p = 1 For i = 1 To x p = p * I Next I fact = pEnd Function7.2.2 Function过程的调用可以像使用VB内部函数一样来调用Function过程。【例7.4】利用【例7.3】建立的函数计算5! + 6! + 8!。代码如下:Private Sub Command1_Click() Dim a As Integer, b As Integer, c As Integer Dim s As Long, p As String a = 5: b = 6: c = 8 s = fact(a) + fact(b) + fact(c) p = a & ! + & b & ! + & c & ! = & s MsgBox p, vbOKOnly, 计算结果End Sub【例7.5】利用【例7.3】建立的函数计算 代码如下:Private Sub Command1_Click() Dim a As Integer, b As Integer a = Text1.Text b = Text2.Text s = fact(a) / (fact(b) * fact(a - b) p = 从 & a & 个元素中取出 & b & 个的组合数= & s MsgBox p, 0, 计算结果End Sub【例7.5】编写一个计算素数的过程,利用此过程计算1001000之间的素数。代码如下:Private Function prime(x As Integer) As Boolean prime = True For i = 2 To x - 1 If x Mod i = 0 Then prime = False: Exit Function Next iEnd FunctionPrivate Sub Command1_Click() Dim i As Integer For i = 100 To 1000 If prime (i) Then List1.AddItem i Next iEnd Sub调用Function过程的补充说明:除了像使用函数那样调用Function过程,还可以像调用Sub过程那样调用Function过程,例如:MaximumCall Maximum (3, 6)Maximum 3, 6注意:用这种方法调用函数,VB将放弃返回值。作业:7.4,7.67.3 调用过程时的参数传递过程与调用程序之间的数据通讯方式:1通过非局部变量。2通过参数(本节涉及的内容)。调用过程时的数据传递可以使单向(按值传递)的,也可以使双向(按地址传递)的。7.3.1 形式参数与实际参数一、形式参数形式参数是指在定义通用过程时,出现在Sub或Function语句中的变量名或数组名。二、实际参数实际参数是指在调用Sub或Function过程时,传送给Sub或Function过程的常量、变量、表达式以及数组等。在调用一个过程时,先把实际参数传送给形式参数,然后按实际参数执行被调用的过程。“实参表”和“形参表”中对应的变量名不必相同,但是变量的个数必须相等,而且各实际参数的类型必须与相应形式参数的类型相符。例如:Private Sub star(x As Integer ) 改为 ByRef|ByVal x As Integer For i = 1 To x Print *; Next i PrintEnd SubPrivate Sub command1_click() For i = 1 To 8 Print Tab(21 - i); Call star(2 * i - 1) Next iEnd Sub7.3.2 按值传递与按地址传递一、按地址传递参数按地址传递参数时,形式参数与实际参数使用相同的内存地址单元,因此,实际参数必须是变量。按地址传递参数时,过程中对变量的改变将带回调用程序。定义过程时用ByRef关键字指出参数是按地址传递的。(确省设置)二、按值传递参数按值传递参数时,传递的是数据本身,即使子程序与主程序使用了的相同的变量名,在内存中占有不同的单元地址。按值传递时的实际参数可以时常量、变量、表达式等。按值传递参数时,过程中对变量的改变不会影响到调用程序。定义过程时用ByVal关键字指出参数是按值传递的。例如:Private Sub example1(ByRef x As Integer, ByVal y As Integer) x = x + 1 y = y + 1 Print By sub example1:, x; yEnd SubPrivate Sub command1_click() Dim a As Integer, b As Integer a = 10: b = 20 Print Before in main:, a; b Call example1(a, b) Print After in main:, a; bEnd Sub【例7.6】使用传值调用求最大公约数的函数Hcf,求两个正整数的最大公约数和最小公倍数。(以14和4为例)分析:(1)利用“辗转相除”编写一个求两数最大公约数的Function过程Hcf,然后在主程序中调用。(2)由数学知识可知: 。代码如下:Private Function Hcf(m As Long, n As Long) As Long Dim r As Long, c As Long If m n Then c = m: m = n: n = c End If r = m Mod n Do While r 0 m = n n = r r = m Mod n Loop Hcf = nEnd FunctionPrivate Sub Command1_Click() Dim m As Long, n As Long Dim p As String m = Text1.Text n = Text2.Text Print 2个数的最大公约数是: & Hcf(m, n) Print m, n Print 2个数的最小公倍数是: & m * n / Hcf(m, n)End Sub存在问题:最小公倍数计算错误!原因:第一次和第二次调用Hcf函数后m、n的数据都将改变。改正:将参数传递方式改为按值传递。方法一:将Function Hcf(m As Long, n As Long) As Long改为: Function Hcf(ByVal m As Long, ByVal n As Long) As Long方法二: 将代码中调用函数时的Hcf(m, n)改为Hcf(m), (n)7.3.3 传递数组可以将数组或数组元素作为过程的参数进行传递:(1)传递数组元素时,就像使用一个普通的变量。(2)传递整个数组时,实际参数与形式参数中都必须写上所要传递的数组的名称和一对圆括号。【例7.7】编写一个将一维数组按升序排列的通用过程(数据类型为单精型)。Private Sub SortAscendingArray(x() As Single) 不能设置为ByVal n = UBound(x) For i = 1 To n - 1 For j = i + 1 To n If x(i) x(j) Then t = x(i): x(i) = x(j): x(j) = t End If Next j Next iEnd Sub说明:(1)数组传递是“地址传递”,实际传递的是数组中第一个元素的地址。(2)UBound(x)函数返回数组x的下标上界,LBound(x)函数返回数组x的下标下界。(3)以下为测试程序Private Sub Command1_Click() Dim a() As Single n = InputBox(输入数组元素的个数, , 100) ReDim a(1 To n) For i = 1 To n a(i) = Rnd List1.AddItem a(i) Next i Print Call SortAscendingArray(a() For i = 1 To n List2.AddItem a(i) Next i PrintEnd Sub7.4 过程的嵌套与递归7.4.1 过程的嵌套过程的嵌套在一个过程中调用另一个过程。例如,有函数过程max2,其功能是返回两个数中的较大数:Private Function max2(a, b) As Single If a b Then max2 = a Else max2 = bEnd Function那么,可以利用嵌套编写函数max3,求3个数中的较大数:Private Function max3(a, b, c) As Single max3 = max2(max2(a, b), c)End Function还可以利用嵌套编写函数max4,求4个数中的较大数:Private Function max4(a, b, c, d) As Single max4 = max3(max2(a, b), c, d)End Function用以下代码进行测试:Private Sub Command1_Click() a = 1: b = 2: c = 3: d = 4 Print max4(a, b, c, d)End Sub7.4.2 过程的递归过程的递归一个过程直接或间接地调用自身。【例7.8】用递归的方法求自然数的阶乘。Private Function fact(ByVal x As Integer) As Long 试试ByRef If x = 1 Then fact = 1 Else fact = x * fact(x - 1) End IfEnd FunctionPrivate Sub Command1_Click() For i = 1 To 5 Print fact(i) Next iEnd Sub7.5 变量的作用范围变量的生存期根据变量在程序运行期间的生命周期,把变量分为静态变量(Static)和动态变量(Dynamic)。1. 动态变量程序运行进入变量所在的过程时,分配该变量的内存单元;退出该过程后,该变量占用的内存单元自动释放,其值消失。使用Dim关键字在过程中声明的局部变量属于动态变量。2. 静态变量程序退出变量所在的过程后,变量所占的内存单元没有释放。再次进入该过程时,原来变量的值可以继续使用。使用Static关键字在过程中声明的局部变量属于静态变量。如果在过程头的起始处加上Static关键字。例如:Static Function RunningTot

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论