已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 8 章 过程教学要求掌握VB的两种过程:事件过程和通用过程 掌握Sub过程的定义 掌握Function过程的定义 掌握过程的调用 掌握参数的传递按值传递和按地址传递 掌握递归算法 掌握变量的作用域8.1 Sub过程 8.1.1 事件过程当对象识别某事件后,进行的操作处理以代码的形式存储在事件过程中。分类:窗体事件过程 控件事件过程1 定义事件过程形式:Private Sub Form_事件名(参数列表) 局部变量和常数声明 语句块End SubInitialize(初始化)事件配置窗体时触发Load(加载)事件窗体装入内存时触发Activate(激活)事件窗体被激活时触发Gotfocus事件(得到焦点)事件窗体成为当前焦点时触发窗体上无可视控件时,触发窗体的Gotfocus事件;窗体上有可视控件时,触发控件的Gotfocus事件;执行次序: Initialize Load Activate Gotfocus窗体的Initialize、Load事件发生在窗体被显示之前,其中可放置系统初始化命令,但其中语句有所限制;窗体加载后,只要不被卸载,就不会再执行Initialize、Load事件,但Activate事件会多次发生;当访问另一窗体上的“非可视”数据或调用其中定义的全局过程时,只会触发该窗体的Initialize事件,而Load事件不触发;当访问另一窗体上的“可视”数据时,会同时触发该窗体的Initialize和Load事件;3 定义控件的事件过程一般形式:Private Sub 控件名_事件名(参数列表) 局部变量和常数声明 语句块End Sub8.1.2 通用过程完成某一特定功能的程序段 通用过程(自定义)必须显式调用方可执行;分为:公有过程(Public)私有过程(Private)1 通用Sub过程的定义一般形式: Private|Public static Sub () End Sub说明:(1) 以Sub开头,End Sub结束,中间是过程体包括变量声明和语句块;(2) 以Private为前缀的过程是模块级的,以Public为前缀的过程是应用程序级的,缺省默认是Public;(3) Static 选项说明过程中的局部变量是静态变量;(4) 过程名的命名规则和变量名相同,在同一个模块中,过程名必须是唯一的;(5) 参数列表中的参数称为形式参数,可以没有,但无参数时圆括号不能省略;有多个参数时,参数之间用逗号间隔;(6)参数说明格式: OptionalByVal|ByRef ()As 其中: a) 若参数是数组,则在变量名后面加一对圆括号,但无维界定义b) ByVal:指明参数传递方式是传值;c) ByRef:指明参数传递方式是传地址,为缺省值;d) 若参数是字符型的,必须是不定长字符串;e)Optional:参数是可选的,必须定义在必选参数后面。(7) 当过程调用结束,即执行到End Sub语句,系统自动返回调用程序的调用语句处,执行调用语句的下一条语句; (8) 过程不能嵌套定义,但可嵌套调用; (9)Exit Sub语句的功能是提前退出过程调用,返回调用语句。例: Private Sub Exchange(x As Integer,y As Integer) Dim Temp As Integer Temp=x : x=y : y=Temp End Sub该通用过程实现交换功能,包含两个参数,均是ByRef形式的参数。3 Sub过程调用 必须在事件过程或其它通用过程中显示调用。Sub过程调用格式一: Call ()格式二: 功能:对已定义的过程进行调用。如:Call Fact(x) Fact x(1)调用的过程必须是已经定义的,否则系统会出现“子程序或函数未定义”的信息提示;(2)实在参数可以是常量、变量或表达式;(3)实在参数的数目及类型要和定义时必选参数保持一致,否则系统会出现“参数不可选”的信息提示,参数之间用逗号间隔;(4)若子程序没有参数,则格式一中的括号可以省略;(5)格式一和格式二的区别在于:格式二的参数表无须括号,而是和过程名之间用空格隔开;例8-2 试编写一个找出任意一个正整数的因子的程序Option ExplicitPrivate Sub Command1_Click()Dim inta As Integer, st As String inta = Text1 Call factor(inta, st) Text2 = stEnd SubPrivate Sub factor(ByVal n As Integer, s As String) Dim i As Integer For i = 1 To n - 1 If n Mod i = 0 Then s = s & Str(i) Next iEnd Sub优点:程序即Sub过程的使用不仅可以缩短程序的长度,还能够使程序的结构更加清楚。例:定义一个通用过程用以求一维数组中的最小值Private Sub value(a() As Integer, min As Integer) Dim i As Integer min = a(1) For i = 2 To UBound(a)If a(i) min Then min = a(i) Next iEnd Sub 8 . 2 Function 过程Function过程的特点是返回一个值,因此我们通常也称之为自定义函数。通常我们利用Function过程得到一个数值或一个字符串或一个逻辑值。 格式: Private|Public Function (参数列表) As End Function(1) 以Function开头,以End Function结束,中间是函数体;(2)函数名命名规则、参数列表的表示都和Sub过程相同;(3)As 数据类型:函数过程将由函数名返回一个值,值的类型由As 数据类型定义; (4) 函数体中一定要有对函数名赋值的语句函数名=表达式,否则返回相应类型的初值; (5)函数体内可有Exit Function语句无条件退出函数过程,返回主程序。(6)Function过程不能嵌套定义,但可嵌套调用。例:定义函数: Private Function f(ByVal x As Integer) As Integer f = 3*x3-2*x2+6*x-1End Function例8-1:编写一个求n!的函数。Private Function Fact(Byval n As Integer) As Long Dim K As Integer Fact=1 If n=0 Or n=1 Then Exit Function Else For K=1 To N Fact=Fact*K Next K End IfEnd Function2 调用 Function 过程格式:(实在参数表)功能:返回一个函数值。说明:(1)一般情况下,函数的调用出现在赋值语句中,并且在赋值号的右侧;(2)若函数没有参数,函数名后的括号不能省略;(3)虽然VB允许象调用Sub过程那样调用Function过程,但这样调用时系统不返回函数值,建议大家不要使用这种调用方法。Call fact(x) Fact x 这两种方法均放弃函数的返回值例:用函数实现求一维数组中的最小值,对比前例(SUB)Private Function min( a( ) As Integer ) As Integer Dim i As Integer min = a(1) For i = 2 To UBound(a)If a(i) min Then min = a(i) Next iEnd Sub例:定义函数用以判断一个数是否是素数Private Function Prime(N As Integer) As BooleanDim i As IntegerPrime = False For i = 2 To N-1 If N Mod i = 0 Then Exit ForNext i If i =N then Prime = TrueEnd Function 例:S=1!+2!+10!Private Sub Form_Click() Dim S As Long, i As Integer For i = 1 To 10 Next i Print ”S=; SEnd SubPrivate Function Fact(n As Integer) As Long Dim i As Integer Fact = 1 For i = 1 To n Fact = Fact * i Next iEnd Function例8-3:利用函数过程编写一个求两个正整数的最大公约数的程序Private Sub Form_Click( ) 主调过程 Dim N As Integer, M As Integer, G As Integer N = InputBox(输入N) M = InputBox(输入M) G = Gcd(N, M) Print N; 和; M; 的最大公约数是:; GEnd SubPrivate Function Gcd(ByVal A As Integer, ByVal B As Integer) As Integer Dim R As Integer R = A Mod B Do While R 0 A = B B = R R = A Mod B Loop Gcd = BEnd Function2、调用标准模块中的公有过程格式:Call .()功能:调用其他标准模块中定义的公有过程。说明:若公有过程唯一,则直接调用,不加模块名。若存在同名的公有过程,则:调用本模块中过程:直接调用,不加模块名调用其它模块中过程:必须加模块名。被调用的函数和过程必须是公有的;函数也可以这样调用。8.4 参数的传递8.4.1 形式参数和实在参数形式参数: 过程定义时,在过程名后面的圆括号里的一系列变量; 过程被调用执行时,系统才给形参分配存储空间; 可以是除定长字符串外的任一简单变量; 可以是数组,变量名后接括号; 简称“形参”实在参数 主调程序中,调用语句中,出现在过程名后面圆括号里的变量,是实在参数,可以是常量、变量或表达式; 过程调用传递参数时,实参按“位置”和形参结合; 实在参数和形式参数,要求个数一样,位置对应,类型一致,否则会出错; 定长字符串变量可以作为实在参数; 简称“实参”举例:写出下列程序执行的结果Private Sub ExamSub( x as integer,y as integer) x=x+10 : y=y-10End SubPrivate Sub Form-click() Dim x as integer, y as integer x=10:y=100 Call ExamSub( y ,x ) Print “x=” ; x ; “y=” ; yEnd Sub8.4.2 按值传递参数格式:ByVal 传递方式 : 调用时,系统为形参分配一个临时存储单元,并将实参的值存储到该临时单元中。 若在被调用的过程体中改变了形参的值,只是改变了临时存储单元中的数据,对实参的值无任何影响。参数传值传递举例:Private Sub Form_Click() Dim M As Integer, N As Integer M = 15: N = 20 Call Value_change(M, N) Print M=; M, N=; NEnd SubPrivate Sub Value_change(ByVal x As Integer, ByVal y As Integer) x = x + 20 y = y + 20 Print X=; x, Y=; yEnd Sub传值是单向的:调用时,实参将值传递给形参,两者就无任何关联。过程中形参的值发生变化,对实参无任何影响。8.4.3 按地址传递参数格式: ByRef 传递方式: 系统在调用执行过程时,为形参分配临时存储单元,并将实参的内存单元地址传送给形参,存储在临时存储单元中 在被调用的过程体中一切对形参的操作,都是直接对地址保存在形参中的内存单元中的数据进行的,而实参就是保存在此内存单元中的数据,所以任何对形参的操作也就是对实参的操作; 按地址传递时,形式参数和实在参数共用同一“内存单元”。参数传址传递举例:(对比前例)Private Sub Form_Click() Dim M As Integer, N As Integer M = 15: N = 20 Call Value(M, N) Print M=; M, N=; NEnd SubPrivate Sub Value(x As Integer, y As Integer) x = x + 20 y = y + 20 Print X=; x, Y=; yEnd Sub传地址是双向的:举例:计算5!+4!+3!+2!+1!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=; SumEnd SubPrivate Function Fact(n As Integer) As Integer Fact = 1 Do While n 0 Fact = Fact * n n = n - 1 LoopEnd Function将传地址修改为传值的方式为:方法一:在形参n前加ByVal方法二:将调用语句中fact(i)改为fact( ( i ) )参数有两种传递方式:传值(ByVal)和传地址(ByRef)。 若调用时实参为常量或表达式,这两种方式没有区别,无论形参定义的是按值传递还是按地址传递,系统都是按传值方式传递 系统在调用时为形参分配一个临时存储单元,将表达式的值计算出来,存储到该临时单元;调用结束,系统收回临时单元。 调用函数或过程时,将单个变量转换成表达式的方法:将变量放在一对括号中。如用Fact(I)的方式调用函数,系统会按传值来处理。按地址传递时,当实参是变量时,实参与形参必须类型完全一致; 按地址传递时,当实参是常量或表达式时,VB会自动进行类型转换,然后再传递相应的值(即类型无须完全一致); 在算术表达式中,函数的优先级最高,若表达式中有函数的实参,而函数的参数又是按地址传递的,则函数中有可能改变了实参的值,即改变了表达式中变量的值,会引起混淆。Private Sub Form_Click() Dim S As Single S=125.5 Call Convert(S),”12”+”.5”)End SubPrivate Sub Convert(Inx As Integer,Sing As Single) Inx=Inx*2 Sing=Sing+23 Print “Inx=”;Inx,”Sing=”;SingEnd Sub8.4.4 数组参数 VB允许把数组作为形式参数,声明数组的格式是: () As 注意:(1)数组参数只能按地址传递,即不能用ByVal来修饰数组参数(2)定义数组参数时无须说明数组的维数和下标变化范围;(3)调用过程时,对应的实在参数也必须是数组,但只需要数组名,无须后跟括号,且数据类型也要一致。(4)在过程体或函数体中无须对数组参数再次说明;(5)若实参是动态数组,在过程体或函数体中可以使用重定义语句修改数组的维界;举例Private Sub Form_Click() Dim a() As Integer, i As Integer Dim n As Integer n = InputBox(请输入数组的初始大小) ReDim a(n) For i = 1 To n a(i) = i Next i Call PrintArray(a) Call Array1(a) Call PrintArray(a)End SubPrivate Sub PrintArray(x() As Integer) Dim i As Integer For i = LBound(x) To UBound(x) Print x(i); Next i PrintEnd SubPrivate Sub Array1(a() As Integer) Dim m As Integer, n As Integer n = UBound(a) m = InputBox(请输入新大小) ReDim Preserve a(m) Dim i As Integer For i = n + 1 To m a(i) = 0 Next iEnd Sub输入5和8,程序执行结果为:举例:自定义一个将一维数组按从小到大排序的通用过程Private Sub Command1_Click() Dim i As Integer, j As Integer Dim a(10) As Integer For i = 1 To 10 a(i) = Int(8 * Rnd) Picture1.Print a(i); Next i Call sort(a) For i = 1 To 10 Picture2.Print a(i); Next iEnd SubPrivate Sub sort(a() As Integer) Dim i As Integer, j As Integer For i = 1 To UBound(a) - 1 For j = i + 1 To UBound(a) If a(i) a(j) Then temp = a(i) a(i) = a(j) a(j) = temp End If Next j Next iEnd Sub本程序的功能是找出100200之间的所有素数。Private Sub Form_Click() Dim i As Integer, x As Integer For i = 100 To 200 If prime(i) Then Print i Next iEnd SubPrivate Function prime( byval n as integer ) As Boolean Dim i As Integer For i = 2 To Sqr(n) If n Mod i = 0 Then Next i prime = TrueEnd Function8.5 递归过程 所谓递归,就是在过程定义中,调用过程本身。例:使用递归函数求N!。 提示:N!=N*(N-1)!Private Sub Form_Click() Dim n As Integer n = InputBox(输入一个正整数) Print n; !=; fact(n)End SubPrivate Function fact(ByVal n As Integer) As Long If n = 1 Then fact = 1 Else fact = n * fact(n - 1) End IfEnd Function总结: 使用递归算法,最重要的是要有一个结束递归的条件,可以使递归得以返回,即终止条件或边界条件。例:使用递归算法计算裴波拉挈数列。Private Sub Form_Click() Dim n As Integer n = InputBox(求数列的第几项) Print “数列中第”; n; “项是”; Cal(n)End SubPrivate Function Cal(n As Integer) If n = 1 Or n = 2 Then Cal = 1 Else Cal = Cal(n - 1) + Cal(n - 2) End IfEnd Function递推法:利用未知项与已知项之间存在的某种关系,从已知项逐项推出未知项的方法。Private Sub Form_Click() Dim fb() As Integer Dim i As Integer, n as integer n = InputBox(“求数列中第几项的值”) Redim fb(n) fb(1)=1:fb(2)=1 For i = 3 To n fb(i)=fb(I-1)+fb(I-2) Next i Print 数列中的第; n; 项是; fb(n)End Sub例8-9:编写一个递归函数,求任意两个整数的最大公约数。Private Sub Command1_Click() Dim Gcdvalue As Long, M As Long, N As Long If M 0 And N 0 Then Gcdvalue = Gcd(M, N) Text3.Text = CStr(Gcdvalue) End If End SubPrivate Function Gcd(ByVal X As Long, ByVal Y As Long) Dim R As Long R = X Mod Y If R = 0 Then Gcd = Y Else X = Y :Y = R :Gcd = Gcd(X, Y) End IfEnd Function练 习写出下列程序运行的结果:Private Sub Command1_Click() Dim a As Integer a = 2 Call sub1(a)End SubPrivate Sub sub1(x As Integer) x = x * 2 + 1 If x 10 Then Call sub1(x) End If x = x * 2 + 1 Print “x=”;xEnd SubPrivate Sub Command1_Click() Dim a As Integer a = 2 Call sub1(a)End SubPrivate Sub sub1(x As Integer) x = x * 2 + 1 If x 0 Then X=X-n Y=X Else X=X+n Y=X+2 End If n=-n End Sub2执行下面的程序,连续三次单击命令按钮Commandl之后,A数组共有 (_) 个元素;数组元素A(2)的值是(_) ,A(4)的值是(_) 。 Option Explicit Option Base 1 Private Sub Commandl_Click() Static A()As Integer,n As Integer Dim i As Integer,k As Integer k=n n=n +2 ReDim Preserve A(n) For i=k+1 To n A(i)=i*n+1 Next i For i=1 To n Print A(i); Next i Print End Sub3执行下面的程序,单击Commandl,在窗体界面上显示的第一行是 (_) ,第二行是 (_) ,第三行是(_) ,第四行是(_) 。 Option Explicit Private Sub Commandl_Click() Dim a As Integer,b As Integer,i As Integer i=1218 a=i100 b=i Mod 100 If b0 Then Print a Print b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江西省十校联考2026届高三上学期1月期末阶段性作业语文试卷(含答案)
- 钢结构技术标准体系建设
- 2026石嘴山市大武口区审计局聘请2名专业人员辅助审计工作参考考试题库及答案解析
- 2026山东事业单位统考昌邑市招聘58人备考考试题库及答案解析
- 龙山龙虾活动策划方案(3篇)
- 建筑公司门卫房管理制度(3篇)
- 山地水管施工方案(3篇)
- 修复道路施工方案(3篇)
- 2026北京大学对外汉语教育学院招聘全职博士后研究人员备考考试题库及答案解析
- 2026贵州贵阳市观山湖区第二幼儿园第二分园招聘3人考试备考题库及答案解析
- 云南省2026年普通高中学业水平选择性考试调研测试历史试题(含答案详解)
- 广东省花都亚热带型岩溶地区地基处理与桩基础施工技术:难题破解与方案优化
- 家里办公制度规范
- 基于知识图谱的高校学生岗位智能匹配平台设计研究
- GB 4053.3-2025固定式金属梯及平台安全要求第3部分:工业防护栏杆及平台
- 环氧抛砂防滑坡道施工组织设计
- 2026中央广播电视总台招聘124人参考笔试题库及答案解析
- DB15∕T 3725-2024 煤矸石路基设计与施工技术规范
- 钢结构屋架拆除与安装工程施工方案
- 动力电池储能车间事故应急处置预案
- 医生合理用药知识培训课件
评论
0/150
提交评论