Presentation is loading. Please wait.

Presentation is loading. Please wait.

第六章 过 程 6.1 函数过程的定义与调用 6.2 子过程的定义与调用 6.3 参数传递 6.4 递 归 6.5 综合应用.

Similar presentations


Presentation on theme: "第六章 过 程 6.1 函数过程的定义与调用 6.2 子过程的定义与调用 6.3 参数传递 6.4 递 归 6.5 综合应用."— Presentation transcript:

1 第六章 过 程 6.1 函数过程的定义与调用 6.2 子过程的定义与调用 6.3 参数传递 6.4 递 归 6.5 综合应用

2 例:已知 的值。 4 7 ,求 C m!(n - m)! n! C m n = k1 = 1: k2 = 1: k3 = 1
For i = 1 To n k1 = k1 * i Next i For i = 1 To m k2 = k2 * i For i = 1 To n - m k3 = k3 * i s = k1 / k2 / k3 本章目录

3 把一项复杂的工作分成简单的功能块,分而治之 过程: 完成一段独立功能,可供其他过程使用。
过程的引入: 使同类的操作不重复编写,写一次多次用 把一项复杂的工作分成简单的功能块,分而治之 过程: 完成一段独立功能,可供其他过程使用。 调用过程: 调用Sprg1 调用Sprg2 子过程: Sprg1 子过程: Sprg2 本章目录

4 常用过程分类: 内部函数(标准函数) 自定义函数过程 Function过程 事件过程 自定义子过程 Sub过程
1)过程是一段程序代码,是相对独立的逻辑模块。 2)一个完整的VB应用程序由若干过程和模块组成。 Sub子过程:完成一定的操作和功能,无返回值。 Function函数过程:完成一定的操作和功能,并且可将数据处理的结果返回。 本章目录

5 6.1 函数过程的定义和调用 例6.1:已知多边形各条边的长度,计算多边形的面积。
计算多边形面积,可将多边形分解成若干个三角形。计算三角形面积的公式如下: 本章目录

6 6.1 函数过程的定义和调用 定义函数过程area: Function area(x!, y!, z!) As Single Dim c!
c = 1 / 2 * (x + y + z) area = Sqrt(c * (c - x) * (c - y) * (c - z)) End Function Sub command1_click() … 输入若干个三角形边长 S=area(a,b,c)+area(c,d,e)+area(e,f,g) Msgbox("面积=" & S) End Sub 调用函数过程 本章目录

7 6.1 函数过程的定义和调用 函数过程的定义 在窗体、模块等的代码窗口把插入点放在所有现有过程之外,直接输入函数过程。定义函数过程的形式如下: [Public |Private] Function 函数名(形参)[As 类型] 变量声明 语句块 函数名=表达式 End Function 本章目录

8 6.1 函数过程的定义和调用 Public 全局函数过程,可被程序任何模块调用 Private 仅供本模块中的其它过程调用
形参(或称哑元) 只能是变量或数组名( ),仅表示参数的个数和类型,无值。 例6.2 编写一个求最大公约数的函数过程 。 Function gcd( m%, n%) As Integer If m < n Then t = m: m = n: n = t Do while n<>0 r = m Mod n : m = n: n = r Loop gcd = m End Function 本章目录

9 6.1 函数过程的定义和调用 6.1.2 函数过程的调用 调用形式:函数过程名([参数列表])
参数列表(称为实参或实元):必须与形参个数相同,位置与类型一一对应。可以是同类型的常量、变量、表达式。 本章目录

10 6.1 函数过程的定义和调用 Sub Form_Click() Dim x%, y%, z% x = 124: y = 24
z = gcd(x, y) MsgBox("最大公约数是" & z) End Sub Function gcd( m%, n%) As Integer If m < n Then t = m: m = n: n = t Do while n<>0 r = m Mod n : m = n: n = r Loop gcd = m End Function 程序运行流程 本章目录

11 6.1 函数过程的定义和调用 例6.3 编一函数,统计字符串中汉字的个数。
分析:在VB中,字符以Unicode码存放,每个汉字和英文是一个字符、占有两个字节,区别是汉字的机内码最高位为1,若利用Asc函数求其码值为小于0(以补码表示),而西文字符的最高位为0,Asc函数求其码值为大于0。 本章目录

12 6.2 子过程的定义与调用 6.2.1 引例 以下情况使用函数过程存在不便: 不是为了获得某个函数值,而是为了某种功能的处理。
6.2 子过程的定义与调用 6.2.1 引例 以下情况使用函数过程存在不便: 不是为了获得某个函数值,而是为了某种功能的处理。 要获得多个结果。 VB中提供了使用更灵活的子过程。 例6.4编一过程,对Label1控件进行移动,通过参数Tag的 值(1或-1)决定移动方向。 该过程不是为了计算获得某个结果,而是进行对控件移动的处理。 本章目录

13 6.2 子过程的定义与调用 6.2.2 子过程的定义 子过程定义的方法类似函数过程,形式如下: 局部变量或常数定义 语句
6.2 子过程的定义与调用 6.2.2 子过程的定义 子过程定义的方法类似函数过程,形式如下: [Public |Private] Sub 子过程名 ([参数列表]) 局部变量或常数定义 语句 [Exit Sub] End Sub 子过程名、形参同函数过程中对应项的规定,当无形参时不要括号。 本章目录

14 6.2 子过程的定义与调用 1. 子过程与函数过程的区别
6.2 子过程的定义与调用 1. 子过程与函数过程的区别 把某功能定义为函数过程还是子过程,没有严格的规定。一般若程序有一个返回值时,函数过程直观;当有多个返回值时,习惯用子过程。 函数过程必须有返回值,函数名有类型。子过程名没有值,也没有类型,不能在子过程体内对子过程名赋值。 本章目录

15 6.2 子过程的定义与调用 2.参数问题 形参是过程与主调程序交互的接口,从主调程序获得初值,或将计算结果返回给主调程序;
6.2 子过程的定义与调用 2.参数问题 形参是过程与主调程序交互的接口,从主调程序获得初值,或将计算结果返回给主调程序; 不要将过程中所有使用过的变量均作为形参; 形参没有具体的值,只代表了参数的个数、位置、类型; 形参只能是简单变量、数组名,不能是常量、数组元素、表达式。 本章目录

16 6.2 子过程的定义与调用 例6.5:找定冠词的ProcThe子过程。
6.2 子过程的定义与调用 例6.5:找定冠词的ProcThe子过程。 Sub ProcThe(ByVal s$, ByRef Count%) …… End Sub Call ProcThe(Text1.Text, n ) 本章目录

17 6.2 子过程的定义与调用 6.2.3 子过程调用 子过程的调用是一句独立的调用语句,有两种形式: Call 子过程名[(实参列表)]
6.2 子过程的定义与调用 子过程调用 子过程的调用是一句独立的调用语句,有两种形式: Call 子过程名[(实参列表)] 子过程名 ([实参列表]) 用Call关键字时,若有实参,则实参必须用圆括号括起,无实参圆括号省略。 注意:若实参要获得子过程的返回值,则实参只能是变量(与形参同类型的简单变量、数组名、结构类型),不能是常量、表达式,也不能是控件名。 本章目录

18 6.2 子过程的定义与调用 例6.6 分别编一个统计字符串S中定冠词The出现个数的子过程和函数过程,并分别调用。
6.2 子过程的定义与调用 例6.6 分别编一个统计字符串S中定冠词The出现个数的子过程和函数过程,并分别调用。 处理方法:利用InStr函数反复在字符串S找The子串。 分析:当定义好函数过程后,要改为子过程,只要将函数过程的返回结果作为子过程的形参,即在子过程中增加一个参数。 本章目录

19 6.3 参数传递 6.3.1 形参与实参 在参数传递中,一般是按位置传送,按实参的位置次序与形参的位置次序对应传送,与参数名没有关系。
形参与实参 在参数传递中,一般是按位置传送,按实参的位置次序与形参的位置次序对应传送,与参数名没有关系。 按位置传送是最常用的参数传递方法,如在调用标准函数时,用户根本不知道形参名,只要关心形参的个数、类型、位置,例如Mid函数形式: Mid(字符串$,起始位%,取几位%) 调用语句:s=Mid("This is VB" ,9,2) 则s中的结果为“VB”。 本章目录

20 6.3 参数传递 6.3.2 传地址与传值 实参与形参的结合有传地址(ByRef)和传值(ByVal)两种方法。
传地址与传值 缺省关键字 实参与形参的结合有传地址(ByRef)和传值(ByVal)两种方法。 传地址方式 当调用一个过程时,它将实参的地址传递给形参。因此在被调过程体中对形参的任何操作都变成了对相应实参的操作,实参的值就会随过程体内对形参的改变而改变。 传值方式 当调用一个过程时,系统将实参的值复制给形参,实参与形参断开了联系。在过程体内对形参的任何操作不会影响到实参。 本章目录

21 例6.7 编写交换两个数的过程,Swap1用传值方式, Swap2用传地址方式。
6.3 参数传递 例6.7 编写交换两个数的过程,Swap1用传值方式, Swap2用传地址方式。 形参获得实参的值 形参获得实参的地址 本章目录

22 6.3 参数传递 选用传值还是传地址一般进行如下考虑:
要将被调过程中的结果返回给主调程序,则形参必须是传址方式。这时实参必须是同类型的变量,不能是常量、表达式; 不希望过程修改实参的值,则应选用传值方式,减少各过程间的关联。因为在过程体内对形参的改变不会影响实参; 形参是数组都是地址传递。 本章目录

23 6.3 参数传递 6.3.3 数组参数的传递 例6.8 如下sum子过程求数组a各元素和、并改变数组各元素值:
数组参数的传递 例6.8 如下sum子过程求数组a各元素和、并改变数组各元素值: Function sum%(ByRef x() As Integer) Dim i% sum = 0 For i = 0 To UBound(x) sum = sum + x(i): x(i) = 2 * x(i) Next i End Function 本章目录

24 6.3 参数传递 形参是数组 要以数组名加圆括号表示,不要给出维数上界;多维数组,每维以逗号分隔。在过程中通过Ubound函数确定每维的上界。 实参是数组 要给出数组名(不需要圆括号)。 当数组作为参数传递时,系统将实参数组的起始地址传给过程,使形参数组也具有与实参数组相同的起始地址。 形参数组 实参数组 1 3 5 7 9 本章目录

25 6.4 递归 用自身的结构来描述自身就称为递归。 最典型的例子是阶乘运算,作如下的定义: 递归过程在自身定义的内部调用自己。 本章目录

26 6.4 递归 例6.9 编fac(n)=n!的递归函数。 Function fac(n As Integer) As Integer
6.4 递归 例6.9 编fac(n)=n!的递归函数。 Function fac(n As Integer) As Integer If n = 1 Then fac = 1 Else fac = n * fac(n - 1) End If End Function 本章目录

27 6.4 递归 递推 回归 递推过程:每调用自身,当前参数压栈,直到达到递归结束条件。 回归过程:不断从栈中弹出当前的参数,直到栈空。
6.4 递归 递推 回归 fac(4)=4*fac(3) fac(3)=3*fac(2) fac(2)=2*fac(1) fac(1)=1 fac(4)=4*6 fac(3)=3*2 fac(2)=2*1 递推过程:每调用自身,当前参数压栈,直到达到递归结束条件。 回归过程:不断从栈中弹出当前的参数,直到栈空。 递归算法设计简单,但消耗的机时和占据的内存空间比非递归大,由此可见构成递归的结构如下: 递归结束条件及结束时的值; 能用递归形式表示,并且递归向终止条件发展。 本章目录

28 6.4 递归 例6.10 用递归求最大公约数。 Public Function gcd(m As Integer, n As Integer) As Integer If (m Mod n) = 0 Then gcd = n Else gcd = gcd(n, m Mod n) End If End Function 本章目录

29 6.5 变量的作用域 过程级变量 在一个过程内用Dim或Static语句声明的变量,只能在本过程中使用;
模块级变量 在模块内、任何过程外用Dim、Private语句声明的变量,可被本模块的任何过程访问; 全局变量 在模块级用Public语句声明的变量,可被应用程序的任何过程或函数访问 。 本章目录

30 6.5 变量的作用域 6.5.1 变量的作用域 例如,在下面一个标准模块文件中不同级的变量声明:
变量的作用域 例如,在下面一个标准模块文件中不同级的变量声明: Public Pa As integer ' 全局变量 Private Mb As string *10 ' 窗体/模块级变量 Sub F1( ) Dim Fa As integer '过程级变量 End Sub Sub F2( ) Dim Fb As Single '过程级变量

31 6.5 变量的作用域 6.5.2 静态变量 静态变量 程序运行过程中可保留变量的值。 声明形式:Static 变量名 [AS 类型]
静态变量 静态变量 程序运行过程中可保留变量的值。 声明形式:Static 变量名 [AS 类型] 用Dim声明的变量,每次调用过程时重新初始化。 本章目录

32 6.5 变量的作用域 例6.11 编写程序,利用变量count统计单击窗体的次数。 Private Sub Form_Click()
Dim count% count = count + 1 Print "已单击窗体"; count; "次" End Sub Private Sub Form_Click() Static count% count = count + 1 Print "已单击窗体"; count; "次" End Sub 本章目录

33 6.6 综合应用 1. 数制转换 不同进制数之间的转换,可通过编程来实现;也可通过VB提供的内部函数:十进制转换为八进制函数(Oct)、转换为十六进制函数(Hex)来实现。 本章目录

34 6.6 综合应用 例6.12 编一函数,实现一个十进制整数转换成二至十六任意进制的字符。
例6.12 编一函数,实现一个十进制整数转换成二至十六任意进制的字符。 分析:十进制正整数m转换成r进制数,将m不断除r取余数(若余数超过9,还要进行相应的转换,例如10变成A,11变成B等),直到商为零,以反序得到结果,即最后得到的余数在最高位。 本章目录

35 6.6 综合应用 2.加密和解密 信息加密是信息安全性的措施之一。信息加密有各种方法,最简单的加密方法是将每个字母平移一个位置( 称为密钥)。例如,后移5个位置,这时,A→F,B →G… Y →D,Z→E ,a →f ;解密是加密的逆操作。 例6.13 编一加密和解密的程序,即将输入的一行字符串中的所有字母加密,加密后还可再进行解密。 本章目录

36 6.6 综合应用 Welcome stud 对取得的一个字符“W”放入变量C中, 加密的过程如左图所示。 W C 87
IAsc=Asc(C) +5 92 IAsc> IAsc=IAsc-26 B C=Chr(IAsc) 本章目录

37 6.6 综合应用 3. 查找 查找是在线性表(在此为数组)中根据指定的关键值,找出与其值相同的元素。 查找方法:一般有顺序查找和二分法查找。
顺序查找:将待查找的关键值与数组的元素逐一比较,若相同,则查找成功,若找不到,则查找失败。 例6.14 实现顺序查找。 本章目录

38 6.6 综合应用 4. 字符处理应用 例6.15 编写一个英文打字训练的程序,要求如下: (1)在标签框内随机产生30个字母的范文;
例6.15 编写一个英文打字训练的程序,要求如下: (1)在标签框内随机产生30个字母的范文; (2)当焦点进入输入文本框时开始计时,并显示当时的时间; (3)当输入了30个字母时结束计时,禁止向文本框输入内容,显示打字的速度和正确率。 此题关键是:对输入的字符串与随机产生的字符串,一一对应比较,判断输入正确与否。 本章目录

39 思考题 1. 为什么要使用过程? 2. 简述子过程和函数过程的异同点? 3. 什么是形参?什么是实参?实参与形参之间怎样传值?
4. 按变量声明的位置可分为哪几种变量? 5. 什么是静态变量?如何声明静态变量? 本章目录


Download ppt "第六章 过 程 6.1 函数过程的定义与调用 6.2 子过程的定义与调用 6.3 参数传递 6.4 递 归 6.5 综合应用."

Similar presentations


Ads by Google