Download - 第七章 过程

Transcript
Page 1: 第七章      过程

1

第七章 过程 第七章 过程 VBVB 应用程序是由模块组成的,模块由应用程序是由模块组成的,模块由过过

程程组成,使用过程是实现结构化程序设计思组成,使用过程是实现结构化程序设计思想的重要方法。想的重要方法。 几类常用的过程几类常用的过程 过程参数的传递和过程的嵌套。 过程参数的传递和过程的嵌套。 变量的作用域和生成期 变量的作用域和生成期

Page 2: 第七章      过程

2

7.1 7.1 过程的类型过程的类型 一、不返回值的过程一、不返回值的过程

事件过程(事件过程( EventEvent 过程)过程)子程序过程(子程序过程( SubSub 过程)过程)

二、返回值的过程二、返回值的过程函数过程(函数过程( FunctionFunction 过程) 过程) 属性过程(属性过程( PropertyProperty 过程)过程)

Page 3: 第七章      过程

3

7.2 Sub 7.2 Sub 过程 过程 子过程的定义子过程的定义 通用通用 SubSub 过程的结构与事件过程的结构类似。过程的结构与事件过程的结构类似。

其格式为:其格式为: [Static] [[Static] [PrivatePrivate] [Public] Sub<] [Public] Sub< 过程名过程名 > [(> [( 参数表参数表 )])] << 语句序列语句序列 >> [Exit Sub][Exit Sub] << 语句序列语句序列 >> End SubEnd Sub

Private sub sub1

print "******"

End sub

Page 4: 第七章      过程

4

7.2 Sub 7.2 Sub 过程 过程 创建过程的方法创建过程的方法

窗体模块【通用】中创建窗体模块【通用】中创建 标准模块标准模块 .BAS.BAS 文件中创建文件中创建

过程调用过程调用 CallCall 调用,必须加()调用,必须加() ,, 参数以逗号分隔参数以逗号分隔 不用不用 CallCall , 不能加(), 不能加() ,, 参数以逗号分 参数以逗号分

Page 5: 第七章      过程

5

7.2 Sub 7.2 Sub 过程 过程 【例】计算矩形面积(用子过程实现)【例】计算矩形面积(用子过程实现) Sub Sub jxArea(jlen, jwid)jxArea(jlen, jwid)

Dim AreaDim Area

Area = jlen * jwidArea = jlen * jwid

MsgBox "MsgBox " 矩形面积为矩形面积为 :" & Area:" & Area

End SubEnd Sub

Private Sub Form_Load()Private Sub Form_Load()

Dim jlen, jwidDim jlen, jwid

l = Val(InputBox("l = Val(InputBox(" 请输入矩形长请输入矩形长 :")):"))

d = Val(InputBox("d = Val(InputBox(" 请输入矩形宽请输入矩形宽 :")):"))

jxArea l, d jxArea l, d '-----Call jxArea(l, d ) '-----Call jxArea(l, d )

End SubEnd Sub

Page 6: 第七章      过程

6

StaticStatic :静态的过程,表示过程中的局部变量在整个:静态的过程,表示过程中的局部变量在整个程序中只分配一次空间;程序中只分配一次空间;没有没有 StaticStatic 的局部变量,每次调用过程,所有变量的局部变量,每次调用过程,所有变量重新分配空间重新分配空间 ,, 试比较----试比较----

Static Sub sub1() i = i + 1 Print iEnd SubPrivate Sub Form_click() sub1 sub1 sub1End Sub

Sub sub1() i = i + 1 Print iEnd SubPrivate Sub Form_click() sub1 sub1 sub1End Sub

Page 7: 第七章      过程

7

7.2 Sub 7.2 Sub 过程 过程 使用说明使用说明

SubSub 和和 End SubEnd Sub 必须配套必须配套 Exit SubExit Sub 中途退出过程中途退出过程 默认的过程是默认的过程是 PublicPublic ,在应用程序中随处可以调,在应用程序中随处可以调

用用 不能嵌套定义过程,但是可以嵌套调用不能嵌套定义过程,但是可以嵌套调用

Page 8: 第七章      过程

8

7.4 Function 7.4 Function 过程 过程 VBVB 允许用户按一定规则自行设计一个专允许用户按一定规则自行设计一个专

用的函数,这就是函数过程(用的函数,这就是函数过程( FunctionFunction 过程)。过程)。 FunctionFunction 过程与过程与 SubSub 过程过程主要区别仅在于主要区别仅在于 FF

unctionunction 过程必须返回一个值过程必须返回一个值 (通常出现在(通常出现在表达式中),而表达式中),而 SubSub 过程却无此限制。过程却无此限制。

Page 9: 第七章      过程

9

7.4 Function 7.4 Function 过程 过程 FUNCTIONFUNCTION 函数定义函数定义 [Static] [[Static] [PrivatePrivate] [Public] Function <] [Public] Function < 过程名过程名 > [(> [( 参数表参数表 )] [AS )] [AS 类型类型 ]] << 语句序列语句序列 >> [Exit Function][Exit Function] << 语句序列语句序列 >> [<[< 函数名函数名 >]=<>]=< 表达式表达式 >]>] End SubEnd Sub

注释:注释: [<[< 函数名函数名 >]=<>]=< 表达式表达式 >]>] ,表示函数返回的结果,表示函数返回的结果

Page 10: 第七章      过程

10

7.4 Function 7.4 Function 过程 过程 FUNCTIONFUNCTION 函数调用函数调用

直接调用直接调用 << 函数名函数名 > (> ( 实际参数表实际参数表 ))

用用 CallCall 调用调用 Call <Call < 函数名函数名 > (> ( 实际参数表实际参数表 ))

Page 11: 第七章      过程

11

Function prime(n As Integer)For i = 2 To n - 1 If n Mod i = 0 Then Exit FunctionNextIf i = n Then prime = 1 Else prime = 0

End Function

Private Sub Form_Click()Dim a As Integera = Val(InputBox("n=", "input"))b = prime(a)If b = 1 Then Print " 素数 " Else Print " 合数 "

End Sub

7.4 Function 7.4 Function 过程 过程

Page 12: 第七章      过程

12

7.4 Function 7.4 Function 过程 过程 【例】辗转相除求最大公约数【例】辗转相除求最大公约数 思想:求思想:求 XX 和和 YY 的最大公约数,用的最大公约数,用 XX 除以除以 Y,Y, 若余数为若余数为 00 ,,

则则 YY 是最大公约数,否则,除数作为被除数,余数作为除数,是最大公约数,否则,除数作为被除数,余数作为除数,直到余数为直到余数为 00 ,除数即是两数的最大公约数,除数即是两数的最大公约数

方法:方法:(1)(1) 以大数以大数 XX 作为被除数,小数作为被除数,小数 YY 作为除数,相除后的余数位作为除数,相除后的余数位 nunu

m;m;(2)(2) 如果如果 num<>0,num<>0, 则则 X=Y,Y=NUM,X=Y,Y=NUM, 继续相除得到余数继续相除得到余数 num.num. 如仍如仍

然有然有 num<>0,num<>0, 则重复此过程,直到则重复此过程,直到 num=0.num=0.(3)(3) 最后最后 numnum 就是最大公约数。就是最大公约数。

Page 13: 第七章      过程

13

7.4 Function 7.4 Function 过程 过程 【例】辗转相除求最大公约数【例】辗转相除求最大公约数Function zdgys(ByVal x As Integer, ByVal y As Integer) AFunction zdgys(ByVal x As Integer, ByVal y As Integer) A

s Integers Integer

Do While y <> 0Do While y <> 0

num = num = xx Mod Mod yy

x = yx = y

y = numy = num

LoopLoop

zdgys = xzdgys = x

End FunctionEnd Function

Private Sub Form_Click()Private Sub Form_Click()

Dim a As Integer, b As IntegerDim a As Integer, b As Integer

a = 156a = 156

b = 21b = 21

H = zdgys(a, b)H = zdgys(a, b)

PrintPrint

Print a & "Print a & " 和和 " & b & "" & b & " 的最大公约的最大公约数是数是 :" & H:" & H

End SubEnd Sub

Page 14: 第七章      过程

14

7.5 7.5 过程参数的传递 过程参数的传递

当变量传递到过程时,称变量为参数当变量传递到过程时,称变量为参数 形式参数和实际参数形式参数和实际参数

形式形式:定义过程的参数:定义过程的参数实际实际:调用过程的参数:调用过程的参数

传值方式和传地址方式传值方式和传地址方式传值:形式参数和实际参数是不同的内存空间传值:形式参数和实际参数是不同的内存空间传地址:形式参数和实际参数是相同的内存空间传地址:形式参数和实际参数是相同的内存空间默认:传地址默认:传地址

Sub Sub jxArea(jxArea(jlen, jwidjlen, jwid))

jxArea l, d

Page 15: 第七章      过程

15

Sub fRef(x As Integer, y As Integer) x = x + 2 y = y + 2 Print "x="; x, "y="; y End Sub

Private Sub Form_Click() Dim a As Integer, b As Integer a = 10 b = 12 fRef a, b Print "a="; a, "b="; bEnd Sub

Sub fVal(ByVal x As Integer, ByVal y As Integer) x = x + 2 y = y + 2 Print "x="; x, "y="; y End Sub

Private Sub Form_Click() Dim a As Integer, b As Integer a = 10 b = 12 fVal a, b Print "a="; a, "b="; bEnd Sub

试比较?试比较?

Page 16: 第七章      过程

16

7.77.7 过程嵌套调用 过程嵌套调用

过程调用另一个过程的现象过程调用另一个过程的现象【例】求组合数【例】求组合数

)!(!

!

mnm

ncmn

【思想】计算 是一个函数 COMB

计算 N! 是一个函数 FACT

函数 COMB 需要调用函数 FACT

mnc

Page 17: 第七章      过程

17

7.7 7.7 过程嵌套调用 过程嵌套调用 Public Function fact(x As Integer) As DoublePublic Function fact(x As Integer) As Double

Dim p As Double, i As IntegerDim p As Double, i As Integer

p = 1p = 1

For i = 1 To xFor i = 1 To x

p = p * ip = p * i

NextNext

fact = pfact = p

End FunctionEnd Function

Public Function comb(n As Integer, m As Integer) As LongPublic Function comb(n As Integer, m As Integer) As Long

comb = fact(n) / (fact(m) * fact(n - m))comb = fact(n) / (fact(m) * fact(n - m))

End FunctionEnd Function

Page 18: 第七章      过程

18

Private Sub Command1_Click()Private Sub Command1_Click()

Dim m As Integer, n As IntegerDim m As Integer, n As Integer

m = Val(Text1.Text)m = Val(Text1.Text)

n = Val(Text2.Text)n = Val(Text2.Text)

If m > n ThenIf m > n Then

MsgBox "MsgBox " 请保证参数的正确输入请保证参数的正确输入 !"!"

Exit SubExit Sub

End IfEnd If

Text3.Text = comb(n, m) Text3.Text = comb(n, m)

End SubEnd Sub

7.7 7.7 过程嵌套调用 过程嵌套调用

Page 19: 第七章      过程

19

7.6 7.6 变量与过程的作用域变量与过程的作用域 模块的划分模块的划分 VBVB 应用程序设计采用模块化的设计原则,应用程序设计采用模块化的设计原则,

通常由三类模块组成:通常由三类模块组成: 窗体模块窗体模块 ------.frm------.frm

标准模块标准模块 -----.bas-----.bas (“工程”-“添加模块”)(“工程”-“添加模块”) 类模块类模块 -----.cls -----.cls (“工程”-“添加类模块”)(“工程”-“添加类模块”)

Page 20: 第七章      过程

20

7.6 7.6 变量的作用域变量的作用域 变量的作用范围(作用域)指变量的有效范变量的作用范围(作用域)指变量的有效范

围。围。 根据声明变量的位置不同,可将变量分为根据声明变量的位置不同,可将变量分为::

11 、过程级变量(、过程级变量( Procedure levelProcedure level )) 22 、模块级变量(、模块级变量( Module levelModule level ) )

33 、全局变量、全局变量

Page 21: 第七章      过程

21

7.6 7.6 变量的作用域变量的作用域

过程级变量(用过程级变量(用 DIMDIM 或或 STATICSTATIC 定义或没有定定义或没有定义)义)

声明位置:声明位置:在过程内部声明在过程内部声明 属于局部变量;作用范围仅仅是本过程属于局部变量;作用范围仅仅是本过程 STATICSTATIC 变量变量的作用周期是整个程序的运行期间的作用周期是整个程序的运行期间 DIMDIM 定义定义的变量作用周期是整个过程的运行期间的变量作用周期是整个过程的运行期间

Page 22: 第七章      过程

22

7.6 7.6 变量的作用域变量的作用域

【 过 程级变 量举【 过 程级变 量举例】例】

Private Sub Form_Click()Private Sub Form_Click()

Dim i As IntegerDim i As Integer

For i = 1 To 5For i = 1 To 5

jbblsubjbblsub

Next iNext i

End SubEnd Sub

Public Sub jbblsub()Public Sub jbblsub()

Dim a1 As Integer, m1 As StringDim a1 As Integer, m1 As String

Static a2, m2Static a2, m2

a1 = a1 + ia1 = a1 + i

a2 = a2 + 1a2 = a2 + 1

m1 = m1 & "$"m1 = m1 & "$"

m2 = m2 & "$"m2 = m2 & "$"

Print "a1="; a1; "a2="; a2, "m1="; Print "a1="; a1; "a2="; a2, "m1=";

m1; " m2 ="; m2m1; " m2 ="; m2

End SubEnd Sub

i 是 Form_Click()Form_Click() 的局部变量的局部变量

i 是 jbblsub()jbblsub() 的局部变量的局部变量

A1A1 和和 m1m1 是是 jbblsub()jbblsub() 的局部变量的局部变量

A2A2 和和 m2m2jbblsub()jbblsub() 的静态局部变量的静态局部变量

Page 23: 第七章      过程

23

Private Sub Form_Click() Dim X As Integer, A As Integer Dim B As Integer, C As Integer X = 4:A = 4:B = 4:C = 4 Print X, A, B, C For K = 1 To 4 Call subpro(A, B) Print X, A, B, C Next KEnd SubSub subpro(A As Integer, B As Integer)X = X + AA = A + BB = B + AEnd Sub

【例】局部变量,参数传递

结果如何?

Page 24: 第七章      过程

24

模块级变量(窗体变量和标准模块变量)模块级变量(窗体变量和标准模块变量)

声明位置:在“通用”的“声明”过程中声明声明位置:在“通用”的“声明”过程中声明

声明方式:用声明方式:用 DIMDIM 和和 PrivatePrivate 定义定义

模块级变量:只能用于该模块的所有过程模块级变量:只能用于该模块的所有过程

7.67.6 变量的作用域变量的作用域

Page 25: 第七章      过程

25

全局变量变量全局变量变量

声明位置:在“通用”的“声明”过程中声明声明位置:在“通用”的“声明”过程中声明

声明方式:用声明方式:用 PublicPublic 定义定义

作用范围:能用于所有模块的所有过程作用范围:能用于所有模块的所有过程

7.67.6 变量的作用域变量的作用域

Page 26: 第七章      过程

26

Dim X As IntegerPrivate Sub Form_Click() dim A As Integer Dim B As Integer, C As Integer X = 4:A = 4:B = 4:C = 4 Print X, A, B, C For K = 1 To 4 Call subpro(A, B) Print X, A, B, C Next KEnd SubSub subpro(A As Integer, B As Integer)X = X + AA = A + BB = B + AEnd Sub

【例】模块级变量,参数传递

结果如何?

Page 27: 第七章      过程

27

7.6 7.6 过程的作用域 过程的作用域 11 ..模块级过程模块级过程 模块级过程是指在定义过程时,在模块级过程是指在定义过程时,在 SubSub 或或 FunctiFuncti

onon 前加关键字前加关键字 PrivatePrivate ,该过程只能被在本模块,该过程只能被在本模块中定义的过程调用。中定义的过程调用。

22 .全局级过程.全局级过程 全局级过程是在定义过程时,在全局级过程是在定义过程时,在 SubSub 或或 FunctioFunctio

nn 前加关键字前加关键字 Public(Public( 可以默认)。全局级过程可可以默认)。全局级过程可被整个应用程序所有模块中定义的过程调用。被整个应用程序所有模块中定义的过程调用。

Page 28: 第七章      过程

28

7.6 7.6 调用其他模块中的过程 调用其他模块中的过程 11 .调用窗体中的通用过程.调用窗体中的通用过程 所有所有窗体模块的外部调用必须指向包含此过程的窗窗体模块的外部调用必须指向包含此过程的窗

体模块体模块。如果在窗体模块。如果在窗体模块 FormlForml 中包含中包含 SomesubSomesub

过程,则可使用下面的语句调用过程,则可使用下面的语句调用 FormlForml 中的过程:中的过程:    Call Form1.SomesubCall Form1.Somesub (参数表)(参数表)22 .调用标准模块中的通用过程.调用标准模块中的通用过程 如果过程名是惟一的,则不必在调用时加模块名。如果过程名是惟一的,则不必在调用时加模块名。

无论是在模块内,还是在模块外调用,结果总会引无论是在模块内,还是在模块外调用,结果总会引用这个过程。如果有两个以上的模块都包含同名的用这个过程。如果有两个以上的模块都包含同名的通用过程,则有必要用模块名来限定。 通用过程,则有必要用模块名来限定。


Top Related