Presentation is loading. Please wait.

Presentation is loading. Please wait.

第8章 过程 郭清溥.

Similar presentations


Presentation on theme: "第8章 过程 郭清溥."— Presentation transcript:

1 第8章 过程 郭清溥

2 第8章 过程 【本章要点】 子过程的建立和使用 函数过程的建立和使用 过程中参数的传递 变量和过程的作用域 过程的递归和嵌套 【课时安排】
第8章 过程 【本章要点】 子过程的建立和使用 函数过程的建立和使用 过程中参数的传递 变量和过程的作用域 过程的递归和嵌套 【课时安排】 2学时(理论),2学时(上机)

3 第8章 过程 Visual Basic应用程序除了设计界面外,其他大部分工作就是编写过程。 过 程:能够完成一定功能的、 可供其它程序调用的
第8章 过程 Visual Basic应用程序除了设计界面外,其他大部分工作就是编写过程。 过 程:能够完成一定功能的、 可供其它程序调用的 独立的程序段。     在程序执行过程中, 主程序与子程序之间 有时会有数据的传递。

4 第8章 过程 用过程编写程序的好处是: 1、可以在整个程序中消除重复的程序行:只要定义了一个子程序,可以任意次调用;
第8章 过程 用过程编写程序的好处是: 1、可以在整个程序中消除重复的程序行:只要定义了一个子程序,可以任意次调用; 2、使程序的易读性增强:将完成某项任务的程序段独立出来,使程序更容易阅读和理解; 3、使程序开发过程简单:将一个大的问题分解为多个小的问题,单独解决,便于修改和维护; 4、可以在其它程序中重用:一个具有通用性的子程序可以用在其它程序设计中。

5 第8章 过程 前面我们主要介绍了事件过程,它是VB应用程序的主体。还有一类过程叫“通用”过程,它可以单独建立,供事件过程或其它过程调用。
第8章 过程 前面我们主要介绍了事件过程,它是VB应用程序的主体。还有一类过程叫“通用”过程,它可以单独建立,供事件过程或其它过程调用。 在Visual Basic中,根据过程是否有返回值,把通用过程分为两类,没有返回值的叫做子程序过程 (Sub过程);有返回值的叫做函数过程(Function过程)。

6 8.1 过程的定义与调用 8.1.1 事件过程和通用过程 事件过程
事件过程由VB自行声明,用户不能增加或删除。当用户对某个对象发出一个动作时,Windows会通知VB产生一个事件,VB会自动地调用与该事件相关的事件过程。

7 8.1 过程的定义与调用 8.1.1 事件过程和通用过程 事件过程 控件事件过程的一般格式为:
[Private| Public] Sub 控件名_事件名(参数表) <语句组> End Sub 窗体事件过程的一般格式为: [Private| Public] Sub Form_事件名(参数表) <语句组> End Sub

8 8.1 过程的定义与调用 8.1.1 事件过程和通用过程 通用过程
通用过程是独立于事件过程之外的,执行某一指定的任务。通用过程不与任何特定的事件相联系,可以被别的过程(事件过程或其它通用过程)或自己来调用,它可以存储在窗体模块或标准模块中。

9 8.1 过程的定义与调用 Sub过程必须以Sub开头 Sub过程必须以End Sub结束 8.1. 2 建立Sub过程 定义Sub过程
一般格式如下: [Static|Private|Public] Sub 过程名[(参数表列)] 语句块 [Exit Sub] [语句块] End Sub Sub过程必须以End Sub结束

10 8.1 过程的定义与调用 参数表列:含有在调用时传送给过程的简单变量名或数组名 8.1. 2 建立Sub过程
Static:指定过程中的局部变量在内存中的存储方式为静态 定义Sub过程 一般格式如下: [Static|Private|Public] Sub 过程名[(参数表列)] 语句块 [Exit Sub] [语句块] End Sub 过程名:是一个长度不超过40个字符的名称 Private:表示Sub过程是私有过程 Public:表示Sub过程是公有过程

11 8.1 过程的定义与调用 8.1. 2 建立Sub过程 (1)利用“工具”菜单中的“添加过程”命令: (2)直接在代码窗口定义
打开模块代码窗口,然后直接键入过程的名字即可。 例:键入 Private Sub Swap(X As Integer, Y As Integer) 按回车键后就会自动显示: End Sub

12 8.1 过程的定义与调用 8.1. 2 建立Sub过程 例:编一个交换两个整型变量值的子过程。
Private Sub Swap( X As Integer, Y As Integer) Dim Temp As Integer Temp=X : X=Y : Y=Temp End Sub

13 8.1 过程的定义与调用 参数不带括号! 8.1. 3 调用Sub过程 过程只有在调用时才被执行。 格式:
Call 过程名 [(实际参数)] 或 过程名 [实际参数] 用Call语句调用一个过程时,如果过程本身没有参数,则“实际参数”和括号可以省略;否则应给出相应的实际参数。“实际参数”是传送给Sub过程的变量或常数。 参数不带括号!

14 8.1 过程的定义与调用 8.1. 3 调用Sub过程 例 编写程序,将3个数据按升序排列。 分析: 我们用 子过程 处理两个数据的交换。
我们用 子过程 处理两个数据的交换。 子过程: Private Sub Swap( X As Integer, Y As Integer) Dim Temp As Integer Temp=X : X=Y : Y=Temp End Sub

15 8.1 过程的定义与调用 8.1. 3 调用Sub过程 Private Sub cmdOK_Click() 主程序:
Dim A%, B%, C% A = Val(InputBox("输入一个整数")) B = Val(InputBox("输入一个整数")) C = Val(InputBox("输入一个整数")) Print "排序前:"; A; B; C If A > B Then Call Swap(A, B) If A > C Then Swap A, C If B > C Then Call Swap(B, C) Print "排序后:"; A; B; C End Sub 主程序:

16 8.2 函数过程与参数传递 函数过程是 Fnuction 8.2.1 建立Function过程 一般格式如下:
[Static|Private|Public] Function 函数名[(参数表列)] [As 类型] 语句块 [Exit Function ] [语句块] 函数名=表达式 End Function 必须给函数赋值,否则,该函数就没有返回值

17 8.2 函数过程与参数传递 说明: (1) < 函数名>代表函数的值,所以它具有类型的属 性。
(2) <函数名>代表函数的值,调用函数后得到的函 数值通过函数名返回调用程序,因此,在函数 语句体中,<函数名>至少应被赋值一次。 (3)主程序在调用函数时,只需写出函数名和相应 的参数即可。

18 8.2 函数过程与参数传递 8.2.1 建立Function过程 利用“工具”菜单中的“添加过程”命令,然后选择对话框中的“函数”;
在代码窗口,直接按照格式要求书写函数过程。

19 8.2 函数过程与参数传递 8.2.2 调用Function过程
Function过程就是一个函数,因此我们可以像使用Visual Basic内部函数一样来调用Function过程。

20 8.2 函数过程与参数传递 例 编写一个求两个数最大公约数的函数过程。 我们采用辗转相除法求最大公约数。 分析 函数过程
Private Function Gcd(M As Integer, N As Integer) As Integer Dim R As Integer Do R = M Mod N If R = 0 Then Exit Do M = N N = R Loop Gcd = N End Function 函数过程

21 8.2 函数过程与参数传递 例 编写一个求两个数最大公约数的函数过程。 我们采用辗转相除法求最大公约数。 分析
Private Sub cmdOK_Click() Dim A%, B%, T$ A = Val(InputBox("输入一个数值")) B = Val(InputBox("输入一个数值")) MsgBox A & " 和 " & B & " 的最大公约数是:" & Gcd(A, B) End Sub

22 8.2 函数过程与参数传递 8.2.3 形式参数和实际参数 主调过程中的参数叫实际参数,被调过程中的参数叫形式参数。
主调过程的实际参数通过调用过程将其传递给被调过程的形式参数,完成形参与实参的结合,然后执行被调的过程。 出现在主程序中 Call MySub (实参表) …… Private Sub MySub (形参表) 出现在子程序中

23 8.2 函数过程与参数传递 8.2.3 形式参数和实际参数 说明:
1、<形参表>、<实参表>中对应的变量名不必相同,但变量个数必须相等,对应的变量类型必须相同。 2、<形参表>、<实参表>中的各个参数之间用逗号分隔; 3、<形参表>由变量组成,可以是任何类型的变量,但不能用定长字符串作为形式参数 4、<实参表>可以由常量、表达式、有效变量名、数组名(后跟左右括号)组成

24 8.2 函数过程与参数传递 8.2.4 传值调用与传址调用 传值调用:当主调程序中的实际参数是常量或表达式 时,就是传值调用。 特点:
传值调用是单向的,只能由实参传递到形参,不能 由形参传递到实参; 在过程中,无论形式参数如何改变,主程序中的实 际参数不会受到影响; 当要求变量按值传送时,要先把变量变成一个表达 式,如(A),或在过程中用ByVal定义形参变量。

25 8.2 函数过程与参数传递 说明: 先计算表达式的值,然后分别传递给形参A , B , C
…… CALL Cal(3+5,(X),Y) Private SUB Cal( A, B, ByVal C) 说明: 先计算表达式的值,然后分别传递给形参A , B , C 因为实参的值是固定的,形参值的改变并不影响实 参的值

26 8.2 函数过程与参数传递 8.2.4 传值调用与传址调用 传址调用:当CALL语句中的实际参数为变量 时就是传址调用
特点:· 形式参数与实际参数使用相同的内存地 址单元,当形式参数发生变化时,实际 参数也随着改变; · 传址调用会把过程的执行结果带回到调 用的程序。

27 8.2 函数过程与参数传递 m a n b 返回后主调程序中的结果: m n 返回时 调用时 …… m = 5 : n=8 6 5
CALL SM( m , n ) Print m,n Private SUB SM( a , b ) a=a+1:b=b+2 End Sub 6 5 m a 10 8 返回时 n b 调用时 返回后主调程序中的结果: m n

28 8.2 函数过程与参数传递 …… m = 5 : n=8 说明: 1. 调用子程序时,m和a共占一个内存单元,n和b共占一个内存单元;
CALL SM( m , n ) Print m,n Private SUB SM( a , b ) a=a+1:b=b+2 End Sub 说明: 1. 调用子程序时,m和a共占一个内存单元,n和b共占一个内存单元; 2. a 和 b 的值改变时,m 和 n 的值也随之改变。 即:如果实参是变量,则可以通过子程序相应变量的值的改变使实参的变量的值发生改变!

29 8.2 函数过程与参数传递 8.2.5 数组参数的传递 在使用通用过程时,可以将数组或数组元素作为参数进行传递。在传送数组时,除遵守参数传送的一般规则外,还应注意以下两点: 1.传递整个数组时,应将数组名分别放入实参表和形参表中,并略去数组的上下界,但括号不能省。 2.如果不需要把整个数组传送给过程,而是传递数组中的某一元素,则需要在数组名后面的括号中写上指定元素的下标。

30 8.2 函数过程与参数传递 8.2.5 数组参数的传递 在使用数组元素作为参数进行传递时,可能会使用到如下两个函数:
LBound(<数组名>,[<维数>]) : 取数组指定维数的下界值 UBound(<数组名>,[<维数>]) : 取数组指定维数的上界值

31 8.2 函数过程与参数传递 过程的作用域随所定义的位置和语句的不同而不同。按过程的作用范围来划分,过程可分为:
一个对象可被访问或识别的范围称为其作用域。 8.2.6 过程的作用域 过程的作用域随所定义的位置和语句的不同而不同。按过程的作用范围来划分,过程可分为: 模块级过程 全局级过程

32 8.2 函数过程与参数传递 8.2.6 过程的作用域 模块级:在窗体模块或标准模块中用Private关键字定义的过程,只能被定义的窗体模块或标准模块中的过程调用。 全局级:在窗体模块或标准模块中用Public关键字(或缺省)定义的过程,可被该应用程序的所有窗体模块和标准模块中的过程调用。

33 8.2 函数过程与参数传递 8.2.6 过程的作用域 注意: 1.其它模块调用在窗体模块中定义的全局级过程时,必须在该过程名前加上该过程所处的窗体名。 例如:在窗体Form1中调用窗体模块Form2中的名为Mysub的全局过程,使用如下形式: Call Form2.Mysub[(实参表)] Form2.Mysub[实参表]

34 8.2 函数过程与参数传递 8.2.6 过程的作用域 注意: 2.在标准模块中定义的全局级过程,外部过程均可调用,但过程名必须惟一。即在工程的多个标准模块中全局过程名不相同,否则调用时就必须要加上标准模块名。

35 8.2 函数过程与参数传递 8.2.6 过程的作用域 注意: 3.对于一个只包含一个窗体的简单应用程序,可直接在本窗体模块中用Private或Public定义过程。 4.若是包含多个窗体的应用程序,一般把子程序过程和函数过程放在标准模块中,并用Public关键字定义,这样定义的过程可被本应用程序的所有过程直接访问。

36 8.2 函数过程与参数传递 8.2.7 变量的作用域 变量的作用域是指变量被某一过程识别的范围。在VB中,可以在过程或模块中声明变量,根据变量定义的位置和定义语句的不同,Visual Basic中的变量可以分为: 局部变量 模块变量 全局变量

37 8.2 函数过程与参数传递 8.2.7 变量的作用域 局部变量 在一个过程内部使用Private或Dim关键字声明的变量(或过程中中未作说明而直接使用某个变量 )叫做局部变量。局部变量只在过程内部有效。

38 8.2 函数过程与参数传递 8.2.7 变量的作用域 模块级变量
在模块的“通用”中用Private或Dim关键字声明的变量属于模块变量。该变量在整个模块的所有过程中都能使用 。

39 8.2 函数过程与参数传递 8.2.7 变量的作用域 全局变量 在某个模块的“通用”中用Public关键字声明的变量属于全局变量。它的作用范围是整个应用程序 。 由于在任何过程中全局变量都有效(可以随意修改),因此为安全起见,应用程序中应尽量避免使用全局变量。

40 8.2 函数过程与参数传递 8.2.7 变量的作用域 在整个过程中允许变量重名,但局部变量的优先级最高,全局变量的优先级最低。

41 8.2 函数过程与参数传递 8.2.8 静态变量 变量只在其作用的范围中保持有效,而一旦变量脱离了它的作用域,变量所代表的值就将失去,它所占用的内存空间将被释放。 为了使局部变量在脱离其作用域以后仍然有效,我们可以将其定义成静态变量。 静态变量在过程结束后仍保留变量的值,其占用的内存单元未释放。在过程内部用Static关键字声明的变量叫做静态变量。

42 8.2 函数过程与参数传递 8.2.8 静态变量 用变量 n 记录单击窗体的次数。 Private Sub Form_Click()
Dim n As Integer n = n + 1 Print "已单击的次数:"; n & "次" End Sub 8.2.8 静态变量 用变量 n 记录单击窗体的次数。 Private Sub Form_Click() Static n As Integer n = n + 1 Print "已单击的次数:"; n & "次" End Sub

43 8.2 函数过程与参数传递 注意: 1.对与其他过程或模块无关的变量来讲,可在“过程内”用Dim关键字将其声明为局部变量。
2.当同一模块的不同过程间需要共享变量时,可用Private或Dim关键字在“通用”中将其声明为模块级变量。 3.当同一应用程序的不同模块间需要共享变量时,可用Public关键字在“通用”中将其声明为公有变量。

44 8.4 过程的嵌套和递归 8.4.1 过程的嵌套 概念:在程序的执行过程中一个过程调用了另外一个过程,这种结构称为嵌套。 Sub过程
过程的嵌套 概念:在程序的执行过程中一个过程调用了另外一个过程,这种结构称为嵌套。 Sub过程 Subp1子过程 Subp2子过程 调用Subp1 调用Subp2 结束 调用Subp2 返回 返回

45 8.4 过程的嵌套和递归 接或直接地调用 了自己,这种结构称 8.4.2 过程的递归 概念: 如果在程序的执行过 程中一个子过程间 为递归。
递归调用是无终止的自身调用,不符合结构化的程序的要求,在递归调用中可以用条件来控制递归是否继续进行。

46 8.4 过程的嵌套和递归 分析:用函数 TZ 表示每天的桃子数 TZ(1) = 2*(TZ(2)+1) 用递归法解猴子吃桃问题
关键问题:找出规律 TZ(n)=2*(TZ(n+1)+1) n=1,2,3,4 TZ(5)=1

47 8.4 过程的嵌套和递归 主程序 Label1.Caption = "猴子第一天共摘了" & TZ(1) & "个桃子" 递归 调用函数
Private Function TZ(N As Integer) If N = 5 Then TZ = 1 Else TZ = 2 * (TZ(N + 1) + 1) End If End Function 递归 调用函数 Form1_Load() TZ(1) N=1 TZ(2) N=2 TZ(3) N=3 TZ(4) N=4 TZ(5) N=5 TZ(N) TZ(N) TZ(N) TZ(N) TZ(N) 主程序 N=1 TZ(1)=46 N=2 TZ(2)=22 N=3 TZ(3)=10 N=4 TZ(4)=4 N=5 TZ(5)=1

48 强调:递归比递推的步骤要多一倍,因此,能用递推方法 解决的问题,尽量不要用递归来解决。
8.4 过程的嵌套和递归 未知 TZ(1) = 2*(TZ(2)+1) TZ(2) = 2*(TZ(3)+1) TZ(3) = 2*(TZ(4)+1) TZ(4) = 2*(TZ(5)+1) TZ(5)=1 未知 递归与递推比较: 递归 递推 已知 已知 强调:递归比递推的步骤要多一倍,因此,能用递推方法 解决的问题,尽量不要用递归来解决。

49 8.5 应用 传说印度教的主神梵天创造世界时,在印度北部佛教胜地贝拿勒斯圣庙里,安放了一块黄铜板,板上插着3根针,在其中一根针上自下而上放着由大到小的64个金盘。这就是所谓的梵塔(Hanoi)。梵天要僧侣们坚持不渝地按下面规则把64个盘子移到另一根针上: 1. 一次只能移一个盘子; 2. 盘子只许在3根针上存放; 3.永远不许大盘压小盘。 梵天称,当把他创造世界时所安放的64个盘子全部移到另一根针上之时,就是世界的毁灭之日。

50 8.5 应用 分析:假设三根针分别为: 1,2,3(分别用A,B,C表示)。 我们现在要将 N 个盘子从 1 号针移到 3 号针上,
在移动的过程中可以借助 2 号针。定义过程: HANOI( N , A , C , B ) 1. 我们将 N 个盘子分成两部分: 最下面的一个 和上面的 N-1 个; 2. 将 N-1 个盘子从 1 号针移到 2 号针上,将最下面 的一个盘子从 1 号针移到 3 号针上,再将N-1 个 盘子从 2 号针移到 3 号针上。 3. 当 N > 0 时重复上面的步骤, 即: HANOI( N-1 , A , B , C ) A -- C HANOI( N-1 , B , C , A )

51 8.5 应用 Dim A%, B%, C%, N% N = Val(InputBox("输入汉诺塔的高度", "输入"))
Call Hanoi(N, A, C, B) Private Sub Hanoi(N, A, C, B) If N > 0 Then Call Hanoi(N - 1, A, B, C) Print A; "--"; C Call Hanoi(N - 1, B, C, A) End If End Sub

52 第8章 作业 P213 习题:一、二 P217 三、 2~10 (任选3道题提交)


Download ppt "第8章 过程 郭清溥."

Similar presentations


Ads by Google