77范文网 - 专业文章范例文档资料分享平台

第06章 模块化程序设计

来源:网络收集 时间:2019-04-21 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

第6章 模块化程序设计

本章内容提示:VB应用程序是由一系列过程组成的,前面各章所涉及的例题和习题,除了定义一些公共的常量、变量或数组以外,编写的代码都写在事件过程中。而实际应用中,往往要根据问题的复杂程度,按照结构化程序设计的思想,将应用程序按功能划分为若干个模块,每个模块还可以继续细分为子模块,每个子模块完成具体的任务,模块和子模块均是可被重复调用的程序段,由编写人员按照一定的格式建立,称为用户自定义过程(本书简称过程)。VB中的过程分为Function过程和Sub过程。

教学基本要求:了解应用程序设计中引入过程的目的和意义;掌握过程定义、调用方法以及过程调用过程中参数传递的形式和特点;掌握变量、过程作用域及其对程序运行结果的影响;了解过程的递归调用;培养学生模块化程序设计思想。

6.1 模块化程序设计思想概述

所谓模块化设计,是指在程序设计中将一个复杂的算法系统分解成若干相对独立、功能单一的模块,并利用这些模块积木式地组合成所需的全部程序。采用模块化思想设计的程序系统具有以下三个特点:第一,由于模块间是相互独立的,所以每个模块可以独立地被理解、编写、测试、排错和修改,这就使得程序容易设计,也容易理解和阅读;第二,模块的独立性也能有效地防止错误在模块之间扩散蔓延,因而有助于提高软件的可靠性;第三,模块化由于能够分割功能而接口可以简化,因此,可由许多人分工合作开发复杂大型软件,有助于软件开发工程的组织管理。

VB中将上述具有独立功能的模块称为过程,其分为两类:Sub过程和Function过程。下面将分别进行讨论。

6.2 Sub过程

VB中有两类Sub过程:一类是事件过程,每一个事件过程都对应一个Sub过程。事件过程由VB系统定义,用户仅编写实现具体功能的代码,当该事件发生后,系统自动调用事件过程,而相应的过程代码被执行。前几章编写的代码基本上都是写在某个事件过程中。另一类就是本节要学习的内容,该类过程由用户定义,实现具体功能的代码也由用户编写,可供事件过程或其他过程调用。

6.2.1 Sub过程的定义

Sub过程的建立有两种方法,第一种方法是通过菜单建立,第二种方法是在代码窗口下直接建立。这里介绍后一种方法。

在窗体的通用声明段或标准模块的代码窗口中,直接输入Sub过程,格式如下: [Static] [Private|Public] Sub 过程名([参数列表])

语句组 End Sub 其中:

(1) 过程名 为过程的标识符,其命名规则与变量相同。

(2) ([参数列表]) 表示执行Sub过程所需要的参数。该类参数本身没有值,只代表参数的个数、位置和类型,只有在被调用时才有确定的值,因此也称为形式参数(简称形参)。

-139-

对形参的具体要求是:形参只能为变量(除定长字符型变量外)和数组,不得为常数或表达式;形参可以有多个,参数之间用逗号隔开。

在过程定义时,当省略[参数列表]时,该类过程称为无参过程,但过程名后的圆括号不得省略。

(3) [Private|Public] 用于说明过程的作用域,[Static]用于确定过程变量为静态变量,将在本章第4节中详细介绍。

(4) 语句组 又称为过程体,用来实现过程功能的代码。 如果过程体中含有Exit Sub 语句,表示强行退出过程。

6.2.2 Sub过程的调用

Sub过程调用有两种格式:

第1种格式:Call 过程名 [(参数列表)] 第2种格式:过程名 参数列表 其中:

(1) 参数列表 代表要传送给Sub过程的实际值,称为实际参数(简称实参),可以为常量、变量、数组元素、数组名或表达式等形式。与形参类似,参数之间用逗号分隔。

(2) 在调用Sub过程时,实参和形参按它们的位置建立一一对应关系,实参的值或地址传给对应位置上的形参后,执行过程体,当遇到End Sub或Exit Sub语句时,结束Sub过程,并返回主程序(调用过程语句所在的程序称为主程序)。 例6-1 求组合数Cn?mn!的值,设m=6,n=10。

m!(n?m)! 分析:本题需要计算不同数的阶乘3次,可以编写一个Sub过程,求任意整型数x的阶乘,以供主程序中多次调用。定义过程时需要设置2个形参,一个用于传入x值,另一个用于存放计算结果。程序代码如下:

Sub fact(x As Integer, f As Double) Dim i As Integer

f = 1 'B For i = 1 To x f = f * i Next i

End Sub 'C Private Sub Command1_Click()

Dim m As Integer, n As Integer, s As Double, y As Double n = 10: Call fact(n, y) 'A s = y 'D m = 6: Call fact(m, y) 'E s = s / y 'F Call fact(n - m, y) 'G s = s / y 'H Print \End Sub

为了便于描述程序的运行过程,程序中注释字符用于标记程序执行的位置。 程序执行过程描述如下:

(1)当单击窗体上命令按钮(Command1),程序运行Command1_Click事件,声明变

-140-

量后,变量获得初值为0。

(2)程序运行到A处,调用fact过程,通过参数传递将实参n、y的地址传给过程形参x、f,使得n与x、y与f分别共用同一存储区域,在过程中对形参x、f的操作也就是对实参n、y的操作。

(3)程序运行到B处,f获得值为1,开始进行阶乘运算。

(4)程序运行到C处,f中保存的就是n(本次n=10)的阶乘值,返回主程序D处。 (5)程序运行到D处,此时的y就是10!,转存到变量s中。

(6)程序运行到E处,再次调用fact过程,将实参m、y的地址传给过程形参x、f(注意,这时m的值为6,f的值仍为10!)。

(7)程序再次运行到B处,f原来的值被1取代,开始进行6的阶乘运算。 (8)程序运行到F处,将6!计算到变量s中。

(9)程序运行到G处,第三次调用fact过程,计算(10-6)!。 (10)程序运行到H处,将4!计算到变量s中,最后输出结果。

通过上例,初步了解了Sub过程的定义、调用方法、程序执行流程,到底过程调用时实参与形参之间的数据传递是如何完成的,学习了下节就一目了然了。

6.2.3 过程调用中的参数传递

形参与实参之间的数据传递作用可以简单理解为:为过程传递运算对象和将过程执行结果返回给主程序的“桥梁”。在过程被调用之前,所有形参只是起到标识运算对象“模板”的作用,当程序流程转去执行过程时,实参按一定方式将数据传给形参后过程体被执行,过程的运算结果还可通过形参将数据传给实参返回到主程序。过程调用中参数传递有两种方式:传值和传地址,默认为传地址。 1.传地址方式

传地址是VB默认的参数传递方式。在这种方式下,实参传给形参的是存储地址,使得形参与实参共用同一存储单元,因此,在过程中对形参的任何操作实质都是对相应实参的操作。

在程序设计中,利用传地址方式可以获得过程处理的结果。要实现传地址方式可在过程定义时对形参作标识或在过程调用时对实参作限制,具体办法是:

(1) 在过程定义时,形参前加ByRef显式说明(省略也可以); (2) 在过程调用时,与形参对应位置的实参必须是相同类型的变量或数组名,实参为常数或表达式是无法实现地址传递的。参数传递时,当实参为变量时,把实参的地址传递给形参,使实参与形参共享同一存储单元段;当实参为数组时,把实参数组的存储地址传递给形参数组,使实参数组与形参数组共享同一存储区域。

注意:编写过程定义时,形参中数组名只须带括号,不指定元素个数;调用过程时,实参数组名既无括号,也不能指定元素个数。

对于例6-1而言,过程的两个参数x和f均为地址传递。

例6-2 一个数组有10个整数元素,将第一个元素与最后一个元素对调,第二个与倒数第二个对调……,输出对调前后数组各元素的值。

根据题意可知,需要两次输出数组各元素的值,可以定义一个过程供主程序中调用,其作用为输出任意一个一维整型数组。过程定义和过程调用实现方法如下: 新建一个工程,在窗体的通用声明段中,定义过程parray:

Option Base 1

Sub parray(a() As Integer) Dim p

-141-

For each p in a Print p; Next p Print End Sub

在窗体上添加一个命令按钮,Command1的单击事件下调用上述过程,代码如下: Private Sub Command1_Click()

Dim x(1 To 10) As Integer, i%, t% For i = 1 To 10

x(i) = Int(Rnd * 100) Next i

Print \交换前各元素值:\

Call parray(x) '调用过程,将数组x作为参数传给形参,输出数组 For i = 1 To 5

t = x(i): x(i) = x(10 - i + 1): x(10 - i + 1) = t Next i

Print \交换后各元素值:\

Call parray(x) '再次调用过程,将数组x作为参数传给形参,输出数组 End Sub

运行程序后,单击Command1,Command1_Click()事件过程代码被执行,首先定义数组并为数组元素赋值后,执行调用过程语句Call parray(x),第1次调用parray过程,输出交换前数组各元素的值;程序流程返回到Command1_Click()中Call parray(x)的后续语句FOR语句,执行循环,完成数组元素的交换后,执行Next i的后续语句Call parray(x),第2次调用parray过程,输出交换后数组各元素的值;程序流程返回到Command1_Click()中Call parray(x)的后续语句End Sub。

需要说明的是:过程parray中的形参数组a是任何一个一维、整型数组的“模板”,本身没有实际值。Command1_Click()中定义的数组x是具有10个元素的一维整型数组;它为主程序并使用Call parray(x)调用Sub过程;调用时将x数组的存储地址传给形参数组a,过程中对形参数组a进行输出,实际上就是对实参数组x输出。

例6-3 编写求两个整数的最大公约数过程,在主程序中调用该过程求两个数的最大公约数,并根据最大公约数求最小公倍数。

分析:要求两个整数的最大公约数,需要在过程定义中设置2个形参用于接收这两个整数,再设置1个参数用于存放过程中得到的最大公约数。代码如下:

Sub gys(m As Integer, n As Integer, t As Integer) Dim r As Integer Do

r = m Mod n

If r = 0 Then Exit Do m = n n = r Loop t = n End Sub

在Command1_Click单击调用gys,代码如下:

-142-

Private Sub Command1_Click()

Dim a As Integer, b As Integer, x As Integer, y As Integer a = 16: b = 12

Call gys(a, b, x) y = a * b / x

Print \最大公约数为:\ Print \最小公倍数为:\End Sub

运行结果“最大公约数为:4”,“最小公倍数为:12”。 这个结果显然不对,为什么呢?下面进行分析:

在本例中,过程gys定义时形参个数为3个,其中前2个形参用于接受运算对象,第3个形参用于返回运算结果,所有的形参前均省略了关键字ByRef;过程调用时实参为变量,因此在过程调用时,参数传递方式为传地址方式,过程中对形参m、n和t的处理,实际上就是对实参a、b和x的处理。过程中m、n的值发生了变化,就造成了调用过程前a和b的值与调用过程后a和b的值是不相同的。根据最大公约数和调用过程结束后的a、b值,计算得到的最小公倍数是错误的。

如何使形参改变了的值不会影响对应位置的实参呢?VB提供了另一种传递参数的方式——传值方式。 2.传值方式

当以传值方式调用一个过程时,实参将其值复制给形参后,就失去与形参的“联系”,此时形参拥有独立的存储单元,过程执行中如果形参的值发生变化,对应位置的实参值不会受任何影响。当过程调用结束时,形参所占用的存储单元也同时被释放。

实现传值方式也可体现在过程调用和过程声明中。

(1)在过程调用时,如果实参为常量、表达式或为带括号的变量,参数传递是按传值方式进行的。

在例6-3中,如果将调用过程语句改为Call gys((a), (b),x),就可以得到正确的结果。这是因为在过程调用时,实参a、b与形参m、n之间的传递方式是传值,只有实参x与形参t传递方式是传地址。过程gys中,对a和b的改变不会影响对应位置的实参a、b,而只有对t的改变会传递给对应位置的实参x。

(2)定义过程时,如果形参前加ByVal关键字。调用过程时,不管实参以何种形式,参数传递均采用传值方式。

在例6-3中,只要将过程定义的第一行改为:

Sub gys(ByVal m As Integer, ByVal n As Integer, t As Integer)

调用该过程时,无论实参是何种形式,形参m和n接受的是实参的值,过程调用时参数传递方式为传值方式,过程中m和n值的改变都不会影响相应位置的实参。

例6-4 分别用传地址方式和传值方式编写交换两个整数的过程并调用。

Sub swap1(ByVal x As Integer, ByVal y As Integer) Dim t As Integer t = x: x = y: y = t End Sub

Sub swap2(x As Integer, y As Integer) Dim t As Integer t = x: x = y: y = t End Sub

-143-

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第06章 模块化程序设计在线全文阅读。

第06章 模块化程序设计.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/607688.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: