版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第八章 过程,8.2 Function函数定义及调用,8.4 递归过程,8.3 参数的传递,8.1 SUB过程及其调用,8.5 变量的作用域,8.6 程序示例,8.7 实验,如同常量的定义一样,有时不仅仅是几个数字反复出现在程序中,而且是很多段代码在做几乎同样的事,如果有一些通用的代码可供调用的话,那么程序就会简练得多,而且更为清晰,这就是过程与函数。Vb中使用的过程分为子程序过程、函数过程和属性过程。,8 过 程,8.1 SUB过程及其调用,通用过程,过程,事件过程,(1)打开代码窗口(双击控件或窗体,单击查看代码)选择对象和事件输入代码保存,1、建立事件过程,加入对发生事件进行处理的代码的
2、过程,称为事件过程。,8.1.1 事件过程,(2)“工具”菜单“添加过程”(如下图)输入代码保存,(1)控件事件过程形式:,8.1.1 事件过程,Private Sub 控件名_事件名 (argumentlist) 语句块 End Sub 说明: (1)控件名必须与窗体中某个控件相匹配,否则为通用过程且该过程也属于私有过程。 (2)argumentlist 指的是参数列表,所谓参数,就是指过程操作所需的指导条件。有无参数由事件本身决定,用户不可以自行添加。,2、定义事件过程,Private Sub cmd1_Click() end End Sub,Private Sub Form_事件名 (a
3、rgumentlist) 语句块 End Sub,2)窗体事件过程形式:,8.1.1 事件过程,说明: (1)Private 表明该过程的使用范围是模块级的,在该窗体之外是不可见的。 (2)不论定义的窗体名称为什么,均用Form 或MIDFORM(多文档界面窗体)表示。 (3)事件由VB提供。注意部分事件的发生顺序:Initialize、 Load、Activate、GotFocus事件的发生顺序是依次的。,如有一窗体名为f1,则可以有如下代码: Private Sub Form_Activate() L2.ForeColor = RGB(0, 255, 255) End Sub,例题,8.1
4、.1 事件过程,演示,引例1:编程时经常要用到两个数的交换,可以将其编写成过程。,8.1.2 通用过程,将多次被重复使用的程序段设计成一个具有一定功能的独立程序段,即为通用过程。,8.1.2 通用过程,1、建立通用过程 (1)打开代码编辑器窗口选择工具菜单选择添加过程,(2)在代码编辑器窗口中选择“通用声明”,形式如下: Private/PublicStatic Sub 过程名 (参数列表) 局部变量和常量声明 语句块 Exit Sub 语句块 End Sub,2. 通用过程的定义:,8.1.2 通用过程,说明: (1)Private/Public可缺省,若缺则系统默认为Public。Stat
5、ic如果不省则指定过程中的局部变量为“静态”变量。 (2)过程名命名规则和变量名相同,且不能重名。 (3)参数列表中的参数是形式参数,可以是变量名或数组名(此时要加(),参数可以省略,但是外层()不可省,若有多个参数,则用逗号分开。 (4)过程体中Exit Sub可以有多个,执行到此语句,立即退出该过程。Sub过程不可以嵌套。,8.1.2 通用过程,3.SUB过程调用,8.1.2 通用过程,格式1:CALL 过程名 (实参表) 格式2:过程名 实参1,实参2,,说明: (1)过程名是被调用过程的名字,当调用程序执行到此代码时,VB将开始执行被调用过程。 (2)实参是传送给被调用过程的变量、常数
6、或表达式。实参的个数和类型、顺序应与被调过程的形参相匹配,且个参数之间应用逗号分隔。对于格式1,若被调过程无参数,则(实参表)可以省略。而格式2,不论是否有参数,实参列表均不需要加括号。,例题,8.1.2 通用过程,若在应用程序中用“Private Sub Sub1(X As Integer, Y As Single)”定义了子程序Sub1,调用程序中的变量I,J均为Integer型,则正确调用子程序Sub1的Call语句是_。 Call Sub1(I,J) Call Sub1(3.1415,I) Call Sub1(3.14,234) Call Sub1(245,231.5) A. B. C
7、. D. 无,例1:调用两数交换过程,8.1.2 通用过程,Public Sub swap(x, y) Dim t As Integer t = x: x = y: y = t End Sub Private Sub Command2_Click() Dim a As Integer, b As Integer a = Val(Text2.Text): b = Val(Text3.Text) call swap (a,b) Text2.Text = Str(a):Text3.Text = Str(b) End Sub,或 swap a, b,例2:将以前学过的冒泡排序改写成过程调用的形式,8.
8、1.2 通用过程,Private Sub bubble_sort(sort() As Integer) Dim ub As Integer, Tem As Integer, I As Integer, switch As Boolean ub = UBound(sort) :switch = True Do While switch switch = False :ub = ub - 1 For i = 1 To ub If sort(i) sort(i + 1) Then switch = True :Tem = sort(i) sort(i) = sort(i + 1) :sort(i +
9、 1) = Tem End If Next i Loop End Sub,8.1.2 通用过程,Option Explicit :Option Base 1 Private Sub Command1_Click() Dim number(10) As Integer, i As Integer Randomize For i = 1 To 10 number(i) = Int(100 - 1) * Rnd) + 1 Text1 = Text1 m, n=; n End Sub Private Sub value(ByVal x As Integer, ByVal y As Integer) x
10、 = x + 20: y = y + x Print x=; x, y=; y End Sub,m,n的值不变,没有数值往回传递,接收m的值,接收n的值,演 示,8.3.2 按地址传递,按地址传送时传送的是实参的地址,在调用时,被调用过程 直接将接受到的地址里的值进行修改,从而将原来的实参值覆盖 掉,所以,执行完调用语句后,实参的值将会有所改变。,格式如下: 形式参数为 byref变量名()AS 类型 ,byref变量名()AS 类型,8.3.2 按地址传递,例:,Private Sub Command2_Click() Dim m As Integer, n As Integer m = 1
11、5: n = 20 Call value1(m, n) Print m=; m, n=; n End Sub Private Sub value1(ByRef x As Integer, y As Integer) x = x + 20: y = y + x Print x=; x, y=; y End Sub,接收m的地址,接收n的地址,m,n的值即为 x,y的值,(数值往主调过程传递),演 示,8.3.2 按地址传递,传值和传址在形式上表现的主要区别为:,如果是按值传送,则形参的参数前加有BYVAL,若形 参前没有加上任何关键字或是加上“BYREF”,则指定他是按 地址传递的参数。使用时应
12、具体分析,否则容易产生错误。,8.3.2 按地址传递,例题 用语句Private Sub Convert(Y As Integer) 定义的Sub过程时,以下不是按值传递的语句是_25_。 A. Call Convert(X) B. Call Convert(X*1) C. Convert(X) D. Convert X,说明:按地址传送的形参,若调用时与之结合的实参是常数或表达式,则vb会将之变为“按值传递”,8.3.2 按地址传递,例1:求1!+2!+3!+4!+5!的和。,Private Static Function fact( n As Integer) As Integer fac
13、t = 1 Do While n 0 fact = fact * n n = n 1 Loop End Function,8.3.2 按地址传递,例1:求1!+2!+3!+4!+5!的和。,Private Sub Form_Click() Dim sum As Integer, i As Integer For i = 5 To 1 Step 1 sum = sum + fact(i) Next I Print sum=; sum End Sub,sum = sum + fact((i)),演 示,8.3.2 按地址传递,例2:四则运算,Private Function add(a As In
14、teger, b As Integer, c As Integer) a = a + 10: b = b + 10: c = c + 10 add = a + b + c End Function Private Sub Form_Click() Dim v1 As Integer, v2 As Integer, v3 As Integer v1 = 2: v2 = 3: v3 = 4 Print v1 + v2 + v3 * add(v1, v2, v3) End Sub,函数的优先级高,演 示,8.3.2 按地址传递,例3:验证9的倍数(如果一个数的各位数之和等于该数的两倍的各位数之和,则
15、该数为9的倍数。如:99的两倍是198,且9+9=1+9+8,则99就是9的倍数。),Private Function sm(_) As Integer Dim sm1 As Integer sm1 = 0 Do While n 0 sm1 = sm1 + n Mod 10 n = n 10 Loop sm = sm1 End Function,ByVal n As Integer,8.3.2 按地址传递,例3:验证9的倍数,Private Sub Command1_Click() Dim n As Integer, s1 As Integer, s2 As Integer n = Val(T
16、ext1.Text) s1 = sm(n) s2 = _ If s1 = s2 Then MsgBox 该数是9的倍数 Else MsgBox 该数不是9的倍数 End If Text1.Text = Text1.SetFocus End Sub,sm(2 * n),演 示,数组可以作为形式参数。 格式为:形参数组名()AS类型。 但形参数组只能是按地址传递的参数。对应实参的类型,长度必须和形参一致,数组名在实参中后面不加一对括号。在被调用的过程中不可以用DIM对形参进行声明,但是动态数组时,可以用REDIM来重新定义数组的维界与大小。,8.3.3 数组参数,8.3.3 数组参数,例4:求任一
17、一维数组元素之和,Private Function tim(a() As Integer) Dim t As Double, i As Integer t = 1 For i = LBound(a) To UBound(a) t = t * a(i) Next i tim = t End Function,8.3.3 数组参数,例4:求任一一维数组元素之和,Private Sub Form_Click() Dim a(1 To 5) As Integer, b(2 To 10) As Integer, i As Integer, t1 As Integer, t2 As Long For i
18、= 1 To 5 a(i) = i Next i For i = 2 To 10 b(i) = i Next i t1 = tim(a) t2 = tim(b) Print t1=; t1, t2=; t2 End Sub,实参数组后不 加圆括号,8.3.3 数组参数,例5:数组参数传递(教材P173),Private Sub change(a() As Integer) Dim i As Integer ReDim a(7) For i = 1 To 7 a(i) = I Next I End Sub,形参数组只能按地址传递,8.3.3 数组参数,例5:数组参数传递,Option Expli
19、cit Option Base 1 Private Sub Form_Click() Dim arraya() As Integer, i As Integer ReDim arraya(5) Print 调用前上界是:; UBound(arraya) Call change(arraya) Print 调用后上界是:; UBound(arraya) Print 数组各元素的值是:; For i = 1 To UBound(arraya) Print arraya(i); Next i Print End Sub,演 示,对象也可以作为参数传递,但也 只能是按地址来传递。在形参中若是 控件,则
20、类型声明为“CONTRAL”,若是 窗体,则类型声明为“FORM”。,8.3.4 对象参数,8.3.4 对象参数,例6:,Public Sub cf(ByVal colorfrm As Form) Dim i As Integer,gradcolor As Long colorfrm.ScaleMode = 3:colorfrm.DrawStyle = 6 colorfrm.DrawWidth = 2:colorfrm.AutoRedraw = True For i = 1 To 64 gradcolor = RGB(0, 0, 255 - (i * 4 - 1) colorfrm.Line
21、(0, colorfrm.ScaleHeight * (i - 1) / 64)- (colorfrm.ScaleWidth,colorfrm.ScaleHeight*i/64), gradcolor, BF Next i colorfrm.Refresh Form1.Hide colorfrm.Show End Sub,演 示,8.4 递归过程,递归的概念 用自身的结构来描述自身称为“递归”即一个过程调用过程本身,在递归调用中,一个过程执行的某一步要用到它自身的上一步或上几步的结果。例如:最典型的例子是对阶乘运算可作如下定义: n!=n*(n-1)! (n-1)!=(n-1) *(n-2)!
22、,8.4 递归过程,递归有两种 直接递归:自己调用自己 间接递归:A调用B,B调用A 递归过程中必须有递归结束语句。,递归子过程和递归函数 VB允许一个子过程或函数在自身定义的内部调用自己,这样的子过程或函数称为递归子过程或递归函数。许多问题中具有递归的特性,用递归调用描述它们就非常方便。 注意:递归过程必须有一个结束递归的终止条件,否则会无限制的执行下去。,8.4 递归过程,例7、 求fac(n)=n! 的值 (n已4为例),递推,fac(4)=4*fac(3),fac(3)=3*fac(2),fac(2)=2*fac(1),fac(1)=1,fac(2)=2*1,fac(3)=3*2,fa
23、c(4)=4*6,回归,8.4 递归过程,Public Function fac(n As Integer) As Integer If n=1 Then fac=1 Else fac=n*fac(n-1) End If End Function Private Sub Command1_Click() Print “fac(4)=“; fac(4) End Sub,递归调用,演示,8.4 递归过程,1、求阶乘。n!=n*(n-1)! 2、求菲波那契数列前10项。F(1)=1,F(2)=1,后面各项满 足:F(n)=F(n-1)+F(n-2) 3、求两个数的最大公约数。 4、逆转输出一个字符串
24、。 5、汉诺塔游戏。,相关习题:,8.5 变量的作用域,变量的作用域,过程的作用域,静态变量,同名变量,8.5 变量的作用域,应用程序 (.vbp文件),类模块(.cls)文件,一个或若干个窗体 模块(*.frm)文件,用户自定义子过程(Sub) 用户自定义函数过程(Function),事件过程(Sub) 用户自定义子过程(Sub) 用户自定义函数过程(Function),一个或若干个标准 模块(*.bas)文件,全局级,模块级,过程级,8.5.1 变量的作用域,1.局部变量,作用域为定义的过程内。指在过程内用Dim语句声明的变量(或不加声明直接使用的变量),只能在本过程中使用,别的过程不可访
25、问。局部变量随过程的调用而分配存储单元,并进行变量的初始化,一旦该过程体结束,变量的内容自动消失,占用的存储单元释放。不同的过程中可有相同名称的变量,彼此互不相干。使用局部变量有利于程序的调试,如 Dim b as string,8.5.1 变量的作用域,2.窗体/模块级变量,作用域为定义的窗体/模块内。指在一个窗体/ 模块的任何过程外,即在“通用声明”段中用Dim语句 或用Private语句声明的变量,可被本窗体/模块的 任何过程访问。,如 Dim c as string,8.5.1 变量的作用域,3.全局变量,作用域为整个应用程序内。指在窗体或标准模块的任何过程或函数外,即在“通用声明”段
26、中用Public语句声明的变量,可被应用程序的任何过程或函数访问。全局变量的值在整个应用程序中始终不会消失和重新初始化,只有当整个应用程序结束时,才会消失。,4、例题,如 Dim a as string,8.5.1 变量的作用域,演示,8.5.2 过程的作用域,1.窗体/模块级,指在某个窗体或标准模块内定义的过程,定义子过程或函数时前加 Private关键字,过程只能被本窗体或本标准模块中的过程调用,8.5.2 过程的作用域,2、全局级,指在窗体或标准模块中定义的过程,其默认是全局的,也可加Public进行说明。全局级过程可供该应用程序的所有窗体和所有标准模块调用,调用方式有如下两种: 在窗体定义的过程,外部过程调用时,必须加窗体名 在标准模块定义的过程,外部过程均可调用,但过程名必须唯一,否则要加标准模块名,8.5.3 静态变量,每次调用过程时,用Static说明的变量保持原来的值,而用Dim说明的变量,每次调用过程时,都重新初始化。,形式如下: Stat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年建筑工程消防应急预案编制培训
- 极端高温下户外工作者的健康舆情引导
- 灵活用工管理协议书
- 临汾《网络安全师技能》培训试卷
- 海南省万宁市2025-2026学年七年级下学期5月期中生物试卷
- 美发护理趋势分析
- 肺脓肿患者的营养支持
- 26年临床试验随访规范
- 医学26年老年他汀类药物使用查房课件
- 医学26年:脑囊虫病诊疗要点 查房课件
- GB 4806.8-2022食品安全国家标准食品接触用纸和纸板材料及制品
- GB/T 36073-2018数据管理能力成熟度评估模型
- GB/T 24765-2009耐磨沥青路面用钢渣
- GB 4806.1-2016食品安全国家标准食品接触材料及制品通用安全要求
- ISO-37301-2021-合规管理体系要求及使用指南(中文版)
- 电子版-铁路货物运价规则
- 客源国概况-墨西哥课件
- 机电一体化专业毕业论文-
- 最新高中物理中常用的三角函数数学模型(强烈推荐)
- 多层厂房框架结构设计-混凝土结构课程设计
- 排架支撑结构搭设方案
评论
0/150
提交评论