第8章 子过程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第八章过程
本章关键词
1.模块化程序设计
2.Sub过程
3.Function过程
4.形式参数与实际参数
5.参数传递——传值调用、引用调用
6.变量的作用域
教学目标
1.了解模块化程序设计的概念,“自顶向下、逐步求精”的程序设计方法;
2.掌握Sub过程的定义和调用方法,会将某一功能用Sub过程来实现;
3.掌握Function过程的定义和调用方法,能正确区分Sub过程和Function过程之间
的区别,会将某一功能利用Function过程来实现;
4.掌握形参和实参的意义和作用,形参与一般变量的区别;
5.掌握形参与实参之间传值调用和传址调用的特点,在程序设计中能合理的使用形参
与实参之间的传值调用和传址调用,能正确理解数组参数在过程定义中的作用;
6.正确理解过程和变量的作用域;
7.会举一反三,正确的定义和调用Sub过程和Function过程。

重点及难点
重点
1.Sub过程和Function过程的定义格式和调用方法,区分这两种过程的异同点;
2.形参与实参的作用,传值调用和传址调用的特点及其区别,数组作为参数在过程定
义中的作用;
3.变量的作用域;
4.理解Sub过程和Function过程的执行流程;
5.在程序设计中,正确使用Sub过程和Function过程。

难点
1.模块划分的原则,将一个复杂的问题分解为多个程序模块来实现;
2.形参的作用,形参与实参之间的关系;
3.Sub过程与Function过程之间的异同;
4.传值调用和传址调用的特点,在过程设计中合理的选用形参与实参之间的传值调用
和引用调用;
5.静态变量的特点。

8.1模块化程序设计概述
在VB中,过程可分为事件过程和通用过程。

事件过程是当某个事件发生时,对该事件做出响应的程序段。

将这一段代码抽象出来,建立一个独立的、可供其它过程调用的过程,这样的过程称为通用过程。

通用过程主要包括Sub 过程和Function 过程两类,前者也被称作子过程,后者称作函数过程。

⎪⎪⎪⎩
⎪⎪⎪
⎨⎧⎩⎨
⎧过程过程通用过程事件过程过程Function Sub
8.1.1 程序的模块化
模块化程序设计是分而治之策略在程序设计中的应用。

模块化程序设计就是将一个大型程序划分为几个、几十个甚至上百个相对对立的程序模块,由主程序规定好各个模块应实现的目标及各个模块间的参数传递关系。

每个模块具有较高的独立性。

8.1.2 模块间的层次结构
在模块化的程序中,各个模块间应该: 1. 具有严密的正确的层次结构; 2. 具有合理的隶属关系;
3. 上层模块可以调用所有隶属于它的下层模块;
4. 下属模块只能通过唯一的出口返回到调用它的上层模块;
5. 整个程序按隶属关系分成若干层次,每一层次由若干个模块组成。

VB 程序设计时,将程序分隔成较小的、完成一定任务的、相对独立的程序段。

这些程序段称为过程。

设计一个过程涉及两个方面的内容:
1. 如何由顺序、选择和循环三种基本结构构造过程体以实现该过程的功能;
2. 主调程序与过程间如何传递数据。

8.1.3 “自顶向下、逐步求精”的程序设计方法
“what to do ”、“how to do ”
8.2 Sub 过程
8.2.1 Sub 过程的格式
Sub 过程的定义形式如下:
[Public|Private] [Static] Sub 过程名[(形式参数列表)]
<局部变量或常量定义>
<语句块>
[Exit Sub]
<语句块>
End Sub
说明
1.Sub过程以Sub开头,以End Sub结束,两者之间称为“过程体”;
2.过程名的命名规则与变量名相同;
3.Exit Sub的功能是退出Sub过程,其目的是用于提前结束本次过程调用;
4.Sub过程本身不返回值,而是通过形参与实参的传递得到结果,调用时可通过参数
返回多个值。

形式参数列表
[ByVal] 变量名[( )] [As 类型],…
1.形式参数列表仅表示形式参数的类型、个数和次序;
2.在过程定义时形式参数列表中的各个变量无具体值,也不分配存储空间;
3.只在过程被调用时,形式参数通过与实际参数结合获得具体的值;
4.ByVal表示当该过程被调用时,参数是按值传递的;
5.默认情况下,参数是按地址传递的;
6.形式参数为一般变量,也可以是数组。

例8.1
编写一个过程,实现两个浮点变量的值交换。

Private Sub Swap(a As Single, b As Single)
Dim t As Single
t = a : a = b : b = t
End Sub
或者
Private Sub Swap(a!, b!)
Dim t As Single
t = a : a = b : b = t
End Sub
8.2.2Sub过程的定义
1.使用“添加过程”对话框定义
调用时值传递
调用时地址传递
形参b
形参a 36.9 16.8
实参X 实参Y
2. 利用代码窗口直接定义
演示
8.2.3 Sub 过程的调用
调用Sub 过程即执行该过程的程序代码。

Sub 过程的调用格式如下: 过程名 [实际参数列表]
或者
Call 子过程名(实际参数列表) 说明
调用过程时:
1. 为形式参数分配临时的存储单元;
2. 将实际参数的值传递给形式参数;
3. 执行过程体中的语句;
4. 过程结束运行后释放临时单元,转去执行调用语句的下一条语句。

Sub 过程不返回
值,而是通过形参与实参的传递得到结果,调用时可通过参数返回多个值。

例8.2 比较如下程序:
Private Sub SwapRef(a!, b!)
Dim t As Single t = a : a = b : b = t
End Sub
Private Sub SwapVal(ByVal a!, ByVal b!)
Dim t As Single t = a : a = b : b = t
End Sub
Private Sub Form_Click()
Dim X As Single , Y As Single
X = Val(Text1.Text) Y = Val(Text2.Text) Call SwapRef(X, Y) Text3.Text = X Text4.Text = Y
X = Val(Text1.Text)
Y = Val(Text2.Text)
SwapVal X, Y
Text5.Text = X
Text6.Text = Y
End Sub
演示
8.3Function过程
VB中,除了系统提供的内部函数,用户可以方便地定义自己的Function过程。

Function 过程亦用来执行一个特定任务,是一段独立的程序代码,带返回值。

8.3.1Function过程的定义
Function过程的定义形式如下:
[Public|Private] [Static] Function函数名([形式参数列表]) [As 数据类型] <局部变量或常量定义>
<语句块>
[Exit Function]
<语句块>
函数名=表达式
End Function
说明
1.Function过程以Function开头,以End Function结束,两者之间称为“函数体”;
2.函数体中至少有一条赋值语句:
函数名=表达式
调用时,函数过程的返回值即该表达式的值;
3.Exit Function的功能是退出Function过程,其目的是用于提前结束本次过程调用;
4.As 类型指定Function过程返回值的数据类型。

例8.3
编写一个计算阶乘的Function过程。

Private Function Fact(ByVal n As Integer ) As Long
Dim i As Integer , result As Long
result = 1 For i = 1 To n
result = result * i Next i
Fact = result
End Function
8.3.2 Function 过程的定义与调用
Function 过程的定义同Sub 过程的定义类似。

Function 过程的调用同系统函数,通常将其作为表达式的一个运算分量来使用。

最简单的形式为赋值语句:
变量名=函数过程名([实际参数列表])
Dim x As Integer , Y As Long
x = Val(InputBox("请输入一个不大于10的自然数:"))
Y = Fact(x)
8.3.3 Sub 过程与Function 过程区别
1. 函数过程名有值,有类型,在函数体内至少赋值一次;
子过程名无值,无类型,在子过程体内不能对子过程名赋值; 2. 调用时,子过程调用是一句独立的语句;
函数过程不能作为单独的语句加调用,必须参与表达式运算。


Dim x As Integer , Y As Long
x = Val(InputBox("请输入一个不大于10的自然数:")) Y = Fact(x) …
主调过程
被调过程
Dim i As Integer
Dim result As Long
result = 1 For i = 1 To n
result = result * i
Next i Fact = result
调用
返回
3.一般当过程有一个函数值,使用函数过程较直观;
反之若过程无返回值,或有多个返回值,使用子过程较直观。

8.4参数传递
设计过程时要指定形式参数,包括形式参数的个数及其类型;
在调用过程时,必须提供实际参数,完成实际参数与形式参数的结合,称为参数传递;
VB中,参数传递分传值和传址两种方式。

8.4.1形参与实参
形式参数是指在定义通用过程时,出现在过程名后一对圆括号内的变量,简称形参。

形参用来接收过程调用时由外部提供的数据。

形参列表中的各个变量之间用逗号分隔。

实际参数是指在调用通用过程时,出现在过程名后一对圆括号内的变量、常量或表达式,简称实参。

实参的作用或者是将数据传递给对应的形参,或者用于接收执行过程后得到的结果。

实参可以是常量、变量、表达式或数组名等形式,无论是哪种形式,必须保证在发
生过程调用时,实参有确定的值;实参列表中的各个参数用逗号分隔;在过程调用时,实际参数应在个数、类型和次序上与形式参数保持一致。

建议:形式参数与实际参数采用不同的标识符。

参照PPT
8.4.2传值
ByVal关键字表明调用过程时对应的实参与形参之间按传值方式传递数据。

1.系统为形参分配临时存储单元,并将实参的值传送给形参;
2.在过程内部改变形参的值时,并不会影响到实参的值;
3.实参可以是常量、变量或表达式,而变量必须有确定的值。

例8.4
编写一个计算两个整数平方和的Function过程,并在一个事件过程代码中调用该Function过程。

Private Function fun1(ByVal x%, ByVal y%) As Integer
Dim sum As Integer
x = x * x
y = y * y
sum = x + y
fun1 = sum
End Function
Private Sub Command1_Click()
Dim A As Integer, B As Integer, C As Integer
A = 5
B = 8
C = fun1(A, B)
Text1.Text = "A=" & A & " B=" & B & " 计算结果=" & C
End Sub
演示
8.4.3传址
默认情况下,调用过程时对应的形参与实参之间按传址方式传递数据。

1.参数的传递是将实参的地址传递给形参,即形参与实参共享相同的存储单元。

2.当过程中对形参的值更改时,将更改相应实参的值。

3.实参可以是变量或数组,而不能是常量或表达式。

例8.5
Private Function fun2(x%, y%) As Integer
Dim sum As Integer
x = x * x
y = y * y
sum = x + y
fun2 = sum
End Function
Private Sub Command2_Click()
Dim A As Integer, B As Integer, C As Integer
A = 5
B = 8
C = fun2(A, B)
Text2.Text = "A=" & A & " B=" & B & " 计算结果=" & C
End Sub
演示
8.4.4数组参数
数组作为过程的参数,称为数组参数。

通用过程的定义时,如果使用数组参数,则
1.不需要指出数组的下标上界;
2.需要指明数组的维数;
3.数组名后的括号不能省略;
4.参数传递只能是传址方式。

Private Sub fun3(a() As Integer)
……
End Sub
主调过程中,要调用带有数组参数的过程,需要:
1.先定义数组;
2.将数组名作为实参调用相应的过程。

Dim arr(10) As Integer
fun3(arr)
上述调用过程时就将实参数组arr传递给形参数组a。

数组本身是地址类型的变量。

参数传递时只能是传址方式。

例8.6
编写一个Function过程,实现对一个Integer型的一维数组各元素的求和。

Private Function ArrSum(x() As Integer) As Integer
Dim sum As Integer
Dim i As Integer
sum = 0
For i = LBound(x) To UBound(x)
sum = sum + x(i)
Next i
ArrSum = sum
End Function
主调过程为:
Private Sub Command1_Click()
Dim a(1 To 12) As Integer
Dim i As Integer, b As Integer
For i = 1 To 12
a(i) = Val(InputBox("请输入" + Str(i) + "月份的收入:"))
Next i
b = ArrSum(a)
MsgBox "该职工的年收入为:" + Str(b)
End Sub
演示
8.5过程和变量的作用域
8.5.1代码模块的概念
8.5.1.1窗体模块
窗体模块是Visual Basic应用程序的基础,一个应用程序可以有多个窗体。

给应用程序添加窗体,可从“工程”菜单中执行“添加窗体”命令。

8.5.1.2标准模块
简单的应用程序可以只有一个窗体,应用程序的所有代码都驻留在窗体模块中。

而当应用程序较复杂时,就需另加窗体。

当在几个窗体中都有要执行的公共代码,则最好创建一个独立模块,以包含实现公共代码过程。

这个独立模块即为标准模块。

在工程中添加标准模块的步骤为:
1.从“工程”菜单中执行“模块”命令,打开“添加模块”对话框中的“新建”选项
卡;
2.双击“模块”图标或单击“打开”命令按钮,打开一个新建标准模块窗口;
3.新添加的第一个标准模块名称为“Module1”,可以通过属性窗口,给标准模块命
名。

8.5.1.3类模块
Visual Basic中类模块是面向对象编程的基础。

参照PPT
8.5.2过程的作用域
过程可被访问的范围称为过程的作用域。

通用子过程和函数过程既可写在窗体模块中,也可写在标准模块中。

随过程所定义的位置和语句的不同,过程的作用域也不同。

按过程的作用范围划分,过程可分为:
1.窗体/模块级过程
在窗体模块或标准模块中加Private关键字定义的过程,只能被定义的窗体模块或标准模块中的过程调用。

2.全局级过程
在窗体模块或标准模块中加Public关键字(或省略)定义的过程,可被应用程序的所有窗体模块和标准模块中的过程调用。

在调用过程时,应注意:
1.全局级过程若是在窗体模块中定义,其它模块的过程要调用,必须在该过程名前加
该过程所处的窗体名;
2.标准模块中定义的全局级过程,外部过程都可调用,但过程名必须唯一,否则调用
时必须加标准模块名;
3.包含多个窗体的应用程序,一般把子过程和函数过程放在标准模块中,并用Public
关键字定义。

参照PPT
8.5.3变量的作用域
根据变量在程序中的声明位置,每个变量均有一定的有效范围:变量在有效范围内可用,在有效范围之外变量不能被访问。

变量可以被访问的范围称为变量的作用域。

变量的作用域可分为局部级(过程级)、模块级和全局级。

8.5.3.1局部变量
局部变量也称过程级变量,是在过程内用Dim或Static关键字声明的变量,只能在本过程中使用。

各个过程中可以声明相同名字的局部变量而互不影响。

隐式声明的变量也为局部变量。

例8.7
同名局部变量
Private Sub S1()
Dim a As Integer, b As Integer
a = 11 :
b = 22
a = a + 1 :
b = b + 1
Text1.Text = "a = " + Str(a) + " b = " + Str(b)
End Sub
Private Sub S2()
Dim a As Integer, c As Integer
a = 33 : c = 44
a = a – 1 : c = c - 1
Text1.Text = "a = " + Str(a) + " c = " + Str(c)
End Sub
Private Sub Command1_Click()
Call S1()
MsgBox("按任意键继续!")
Call S2()
End Sub
演示
8.5.3.2模块级变量
在“通用声明”段中用Dim语句或用Private语句声明的变量称为模块级变量,模块级变量可被本窗体/模块的任何过程访问。

参照PPT
8.5.3.3全局变量
在“通用声明”段中用Public语句声明的变量,可被本应用程序的任何过程或函数访问。

在标准模块中声明的变量,在应用程序的任何一个过程中可以直接用该变量名来引
用它,而某个窗体模块中声明的全局变量,当其它窗体模块引用它时,必须用定义它的窗体模块名为前缀。

如果有更好的处理变量的方法,就不要声明全局变量。

变量同名
参照PPT
8.5.4静态变量
在过程结束时仍需要保留局部变量的值,要使用静态变量。

定义静态变量的格式为:Static 变量名 [As 类型]
Static Function 函数过程名([参数列表]) [As 类型]
Static Sub 子过程名[(参数列表)]
说明
1.在过程中定义的静态变量为局部变量,只能在该过程中使用;
2.静态变量的初始化只在第一次调用过程时进行初始化;
3.静态变量的值在过程结束时仍然保留。

4.过程名前加Static,表示该过程内的局部变量都是静态变量,无论它们采用的是
Static或Dim声明,包括事件过程和声明为Private的过程。

例8.8
记录并显示按钮的单击次数。

Private Sub Command1_Click()
Static count As Integer
count = count + 1
Text1.Text = "第" + Str(count) + "次单击!"
End Sub
演示
8.6鼠标事件
常用的鼠标事件有Click和DblClick。

另外,窗体和大多数控件也都能响应如下3个鼠标事件。

以窗体为例:
1.MouseDown:鼠标的任一键被按下时触发
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
2.MouseUp:鼠标的任一键被释放时触发
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
3.MouseMove:鼠标被移动时触发
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
说明
1.Button表示用户按下或释放鼠标的状态;
2.Shift表示事件发生时Shift、Ctrl和Alt键的状态;
3.X和Y表示鼠标所在的位置。

参照PPT
8.7键盘事件
在VB中,重要的键盘事件有下列三种:
1.KeyPress:用户按下并且释放一个会产生ASCII码的键时触发该事件。

Sub Object_KeyPress([Index As Integer,] KeyAscii As Integer)
2.KeyUp:用户按下键盘上任意一个键时被触发。

Sub Object_KeyDown([Index As Integer,] KeyCode As Integer, Shift As Integer)
3.KeyDown:用户释放键盘上任意一个键时被触发。

Sub Object_KeyUp([Index As Integer,] KeyCode As Integer, Shift As Integer)
在引发键盘事件的同时,用户所按的键盘码作为实参传递给相应的事件过程,供程序判断识别用户的操作。

说明
1.Object代表一个对象名称;
2.KeyAscii返回与按键相对应的ASCII码值;
3.KeyCode返回用户操作键的扫描代码,是用户所操作的物理键位。

也就是说,只要
是在同一个键上的字符,它们返回的KeyCode的值是相同的。

如对于字符“A”和
“a”,它们在KeyUp或KeyDown事件中的返回值都是相同的,而在KeyPress中的
返回值却是不一样的;
4.Shift与鼠标事件过程中的Shift含义相同;
5.Index是一个整数,用来惟一地标识一个在控件数组中的控件。

KeyPress事件只对会产生ACSII码的按键有反应,包括数字、大小写字母、标点、
ENTER、TAB、BACKSPACE等键。

如果按下不会产生ACSII码的按键,如按下如方向键,则KeyPress事件不会发生。

而KeyDown和KeyUP则提供了最低级的键盘响应。

8.8重点和难点
1.确定自定义的过程是子过程还是函数过程
函数过程名有值,子过程名无值。

过程有一个返回值,则使用函数过程;
若返回多个值或无返回值,一般使用子过程。

2.过程中形参的个数和传递方式的确定
过程中参数的作用是实现过程与调用者的数据通信。

若从主调程序获得初值,采用值传递;将结果返回给主调程序,采用地址传递。

3.实参与形参结合时对应问题
个数、类型、位置、次序一一对应。

形参是值传递,对应实参可以是表达式、常量、数组元素。

形参是地址传递,对应实参只能是简单变量。

数组、记录类型、对象只能是地址传递。

习题
实践
P198,第四题(4)、(5)。

补充:递归
如果一个过程直接或间接调用它自身,就称该过程是递归的。

如:
n! = 00)!
1(*1>=⎩⎨⎧-n n n n 以及 n x = 0
0*11>=⎩⎨⎧-n n x x n Function Power(ByVal x As Integer ) As Long
If x = 0 Then
Power = 1
Else
Power = x * Power(x - 1)
End If
End Function
计算1!+ 2!+ 3!+ … + 10!
Function Fac(ByVal x As Integer ) As Long
If x = 1 Then
Fac = 1
Else
Fac = x * Fac(x - 1)
End If
End Function
Private Sub Command1_Click()
Dim m As Integer
Dim n As Long
m = Val(Text1.Text)
n = Fac(m)
Text2.Text = Str(m) & "!=" & Str(n)
End Sub
演示
“递推”与“回推”
递归要素
1.递归公式:一个问题转化为一个新的问题,而这个新问题的求解方法与原问题的解
法相同,只是所处理的对象有所不同,但它们有规律地递增或递减。

2.递归出口:必须有一个结束递归的条件。

相关文档
最新文档