收藏 分享(赏)

江苏省计算机二级vb8.ppt

上传人:无敌 文档编号:805998 上传时间:2018-04-26 格式:PPT 页数:91 大小:884KB
下载 相关 举报
江苏省计算机二级vb8.ppt_第1页
第1页 / 共91页
江苏省计算机二级vb8.ppt_第2页
第2页 / 共91页
江苏省计算机二级vb8.ppt_第3页
第3页 / 共91页
江苏省计算机二级vb8.ppt_第4页
第4页 / 共91页
江苏省计算机二级vb8.ppt_第5页
第5页 / 共91页
点击查看更多>>
资源描述

1、第 8 章 过程,2,教学要求,掌握VB的两种过程:事件过程和通用过程 掌握Sub过程的定义 掌握Function过程的定义 掌握过程的调用 掌握参数的传递按值传递和按地址传递 掌握递归算法 掌握变量的作用域,3,8.1 Sub过程8.2 Function过程8.3 过程调用8.4 参数传递8.5 递归过程8.6 变量的作用域 8.7 程序示例,教学内容,4,基本思想:将一个大的程序按功能分割成一些小模块特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法: 自上向下,逐步分解,分而治之,模块化程序

2、设计,5,VB中过程的分类,6,8.1 Sub过程 8.1.1 事件过程,当对象识别某事件后,进行的操作处理以代码的形式存储在事件过程中。分类:窗体事件过程 控件事件过程,7,1 定义事件过程,形式:Private Sub Form_事件名(参数列表) 局部变量和常数声明 语句块End Sub,完全由系统决定,用户无权修改,窗体的事件过程名中不使用其具体名称,而固定用Form,窗体事件固定有“Private”关键字,说明它是模块级的,8,2 窗体的Initialize、Load、 Activate、 Gotfocus事件,Initialize(初始化)事件配置窗体时触发Load(加载)事件窗体

3、装入内存时触发Activate(激活)事件窗体被激活时触发Gotfocus事件(得到焦点)事件窗体成为当前焦点时触发窗体上无可视控件时,触发窗体的Gotfocus事件;窗体上有可视控件时,触发控件的Gotfocus事件;执行次序: Initialize Load Activate Gotfocus,9,注 意,窗体的Initialize、Load事件发生在窗体被显示之前,其中可放置系统初始化命令,但其中语句有所限制;窗体加载后,只要不被卸载,就不会再执行Initialize、Load事件,但Activate事件会多次发生;当访问另一窗体上的“非可视”数据或调用其中定义的全局过程时,只会触发该窗

4、体的Initialize事件,而Load事件不触发;当访问另一窗体上的“可视”数据时,会同时触发该窗体的Initialize和Load事件;,10,3 定义控件的事件过程,一般形式:Private Sub 控件名_事件名(参数列表) 局部变量和常数声明 语句块End Sub,由系统决定,用户无权修改,控件的事件过程名中必须使用其具体名称,控件事件固定有“Private”关键字,说明它是模块级的,11,4 建立事件过程,打开“代码编辑器”窗口;先选定某对象,再选定事件过程;编辑代码;,对象,过程,Private Sub Command1_Click() n = Val(Text1.Text) m

5、 = Val(Text2.Text) k = n t = 1 For i = 1 To k t = t * i Next i s = t k = m t = 1 For i = 1 To k t = t * i Next i s = s / t k = n - m t = 1 For i = 1 To k t = t * i Next i s = s / t Text3.Text = Str(s)End Sub,能不能简化?,计算:,13,Private Sub Command1_Click() Dim m As Integer, n As Integer Dim i As Integer,

6、k As Integer Dim t As Long, s As Long n = Val(Text1.Text) m = Val(Text2.Text) s = fact(n) / (fact(m) * fact(n - m) Text3.Text = Str(s)End SubPrivate Function fact(k As Integer) As Long Dim i As Integer fact = 1 For i = 1 To k fact = fact * i Next iEnd Function,使用函数,14,在以下两种情况下,经常使用自定义过程:(1)应用程序中出现较频

7、繁的处理,仅仅是每次处理的数据不同而已;(2)程序中比较复杂的算法,独立出来,增强程序的可读性; “过程”的引入使得整个程序的结构更加清晰,模块化更强。,过程的引入:,15,8.1.2 通用过程,完成某一特定功能的程序段 通用过程(自定义)必须显式调用方可执行;分为:公有过程(Public)私有过程(Private),16,1 通用Sub过程的定义,一般形式: Private|Public static Sub () End Sub,说明:(1) 以Sub开头,End Sub结束,,中间是过程体包括变量声明和语句块;(2) 以Private为前缀的过程是模块级的,以Public为前缀的过程是应

8、用程序级的,缺省默认是Public;(3) Static 选项说明过程中的局部变量是静态变量;(4) 过程名的命名规则和变量名相同,在同一个模块中,过程名必须是唯一的;,17,(5) 参数列表中的参数称为形式参数,可以没有,但无参数时圆括号不能省略;有多个参数时,参数之间用逗号间隔;(6)参数说明格式: OptionalByVal|ByRef ()As 其中: a) 若参数是数组,则在变量名后面加一对圆括号,但无维界定义b) ByVal:指明参数传递方式是传值;c) ByRef:指明参数传递方式是传地址,为缺省值;d) 若参数是字符型的,必须是不定长字符串;e)Optional:参数是可选的,

9、必须定义在必选参数后面。(7) 当过程调用结束,即执行到End Sub语句,系统自动返回调用程序的调用语句处,执行调用语句的下一条语句; (8) 过程不能嵌套定义,但可嵌套调用; (9)Exit Sub语句的功能是提前退出过程调用,返回调用语句。,说 明,18,例: Private Sub Exchange(x As Integer,y As Integer) Dim Temp As Integer Temp=x : x=y : y=Temp End Sub,该通用过程实现交换功能,包含两个参数,均是ByRef形式的参数。,19,2 建立通用Sub过程方法一:在“代码编辑窗口”的“通用”中自行

10、输入; 方法二:进入代码编辑器窗口,执行“工具”菜单的“添加过程”,在“添加过程”对话框中输入定义过程的名称、类型和范围后单击“确定”按钮,系统会自动在代码窗口添加自定义过程的框架。,20,3 Sub过程调用 必须在事件过程或其它通用过程中显示调用。,Private Sub sub1() Call Sub2(实参表) End Sub,Private Sub sub2(形参表)过程语句End Sub,主调程序,被调过程,注意 :一个过程或函数可以被调用多次;,21,Sub过程调用格式一: Call ()格式二: 功能:对已定义的过程进行调用。如:,P164,Call Fact(x) Fact x

11、,22,(1)调用的过程必须是已经定义的,否则系统会出现“子程序或函数未定义”的信息提示;(2)实在参数可以是常量、变量或表达式;(3)实在参数的数目及类型要和定义时必选参数保持一致,否则系统会出现“参数不可选”的信息提示,参数之间用逗号间隔;(4)若子程序没有参数,则格式一中的括号可以省略;(5)格式一和格式二的区别在于:格式二的参数表无须括号,而是和过程名之间用空格隔开;,说 明,23,例8-2 试编写一个找出任意一个正整数的因子的程序,P165,24,定义子程序factor求因子,该子程序定义了两个参数,来传递求因子实现前的原始数据和返回功能实现后的结果数据;,Option Explic

12、itPrivate Sub Command1_Click()Dim inta As Integer, st As String inta = Text1 Call factor(inta, st) Text2 = stEnd Sub,调用过程factor,Private 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过程的使用不仅可以缩短程序的长

13、度,还能够使程序的结构更加清楚。,25,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,例:定义一个通用过程用以求一维数组中的最小值,26,8 . 2 Function 过程 Function过程的特点是返回一个值,因此我们通常也称之为自定义函数。通常我们利用Function过程得到一个数值或一个字符串或一个逻辑值。 格式: Private|Public Fun

14、ction (参数列表) As End Function,函数名=表达式,函数返回值的类型,27,(1) 以Function开头,以End Function结束,中间是函数体;(2)函数名命名规则、参数列表的表示都和Sub过程相同;(3)As 数据类型:函数过程将由函数名返回一个值,值的类型由As 数据类型定义; (4) 函数体中一定要有对函数名赋值的语句函数名=表达式,否则返回相应类型的初值; (5)函数体内可有Exit Function语句无条件退出函数过程,返回主程序。(6)Function过程不能嵌套定义,但可嵌套调用。,说 明,28,Private Function f(ByVal

15、x As Integer) As Integer f = 3*x3-2*x2+6*x-1End Function,例:定义函数:,函数返回值的类型,函数名=表达式,29,例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 Function,函数名=表达式,传值的参数,30,2 调用 Function 过程 格

16、式:(实在参数表)功能:返回一个函数值。说明:(1)一般情况下,函数的调用出现在赋值语句中,并且在赋值号的右侧;(2)若函数没有参数,函数名后的括号不能省略;(3)虽然VB允许象调用Sub过程那样调用Function过程,但这样调用时系统不返回函数值,建议大家不要使用这种调用方法。,Call fact(x) Fact x 这两种方法均放弃函数的返回值,例如:,31,Private Function min( a( ) As Integer ) As Integer Dim i As Integer min = a(1) For i = 2 To UBound(a)If a(i) 0 Fact

17、= Fact * n n = n - 1 LoopEnd Function,举例:计算5!+4!+3!+2!+1!,修改:方法一:在形参n前加ByVal方法二:将调用语句中fact(i)改为fact( ( i ) ),P171,50,参数有两种传递方式:传值(ByVal)和传地址(ByRef)。 若调用时实参为常量或表达式,这两种方式没有区别,无论形参定义的是按值传递还是按地址传递,系统都是按传值方式传递 系统在调用时为形参分配一个临时存储单元,将表达式的值计算出来,存储到该临时单元;调用结束,系统收回临时单元。 调用函数或过程时,将单个变量转换成表达式的方法:将变量放在一对括号中。如用Fac

18、t(I)的方式调用函数,系统会按传值来处理。,注 意,51,按地址传递时,当实参是变量时,实参与形参必须类型完全一致; 按地址传递时,当实参是常量或表达式时,VB会自动进行类型转换,然后再传递相应的值(即类型无须完全一致); 在算术表达式中,函数的优先级最高,若表达式中有函数的实参,而函数的参数又是按地址传递的,则函数中有可能改变了实参的值,即改变了表达式中变量的值,会引起混淆。,注 意,见例,见例,52,Private Sub Form_Click() Dim S As Single S=125.5 Call Convert(S),”12”+”.5”)End SubPrivate Sub C

19、onvert(Inx As Integer,Sing As Single) Inx=Inx*2 Sing=Sing+23 Print “Inx=”;Inx,”Sing=”;SingEnd Sub,实际的参数传递方式是按值传递,强制转换后,inx =126 sing=12.5,举例:,53,Private function fun_add(a as integer,b as integer,c as integer) as integera=a+10 : b=b+10 : c=c+10fun_add=a+b+cEnd function,Private sub command1_click()Di

20、m v1 as integer,v2 as integer,v3 as integerV1=2 : v2=3 : v3=4Debug.print v1+v2+v3*fun_add(v1,v2,v3)End sub,问题出在哪?,举例:,54,(1)写出程序运行结果(2)若改为按值传递,结果又如何?,Dim p As integer, q As integer, r As integerPrivate Sub Form_Click() p = 2: q = 3 Print p, q, r Call pq(p, q, r) Print p, q, rEnd SubPrivate Sub pq(x

21、As integer, y As integer, z As integer) x = p + q y = p - q z = x + y End Sub,练 习,55,Option ExplicitPrivate Sub command1_click() Dim i As Integer, j As Integer Dim k As Integer i = 1: j = 2 k = fun(i, fun(i, j) + i + j Print I=; i; J=; j; K=; kEnd SubPrivate Function fun(a As Integer, ByVal b As Int

22、eger) As Integer a = a + b b = b + a fun = a + bEnd Function,练 习,写程序运行的结果:,56,8.4.4 数组参数 VB允许把数组作为形式参数,声明数组的格式是: () As 注意:(1)数组参数只能按地址传递,即不能用ByVal来修饰数组参数(2)定义数组参数时无须说明数组的维数和下标变化范围;(3)调用过程时,对应的实在参数也必须是数组,但只需要数组名,无须后跟括号,且数据类型也要一致。(4)在过程体或函数体中无须对数组参数再次说明;(5)若实参是动态数组,在过程体或函数体中可以使用重定义语句修改数组的维界;,57,Privat

23、e 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 Sub,Private Sub Array1(a() As Integer) Dim m As Integer, n As Integer n = UBound(a) m = InputBox(请输入新大小) ReD

24、im Preserve a(m) Dim i As Integer For i = n + 1 To m a(i) = 0 Next iEnd Sub,输入5和8,程序执行结果为:,Private Sub PrintArray(x() As Integer) Dim i As Integer For i = LBound(x) To UBound(x) Print x(i); Next i PrintEnd Sub,举例,58,举例:自定义一个将一维数组按从小到大排序的通用过程。,Private Sub sort(a() As Integer) Dim i As Integer, j As I

25、nteger 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,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)

26、 For i = 1 To 10 Picture2.Print a(i); Next iEnd Sub,59,完善程序:本程序的功能是找出100200之间的所有素数。,Private Sub Form_Click() Dim i As Integer, x As Integer For i = 100 To 200 If Then Print i Next iEnd SubPrivate Function prime( ) As Boolean Dim i As Integer For i = 2 To Sqr(n) If n Mod i = 0 Then Next i prime = Tru

27、eEnd Function,练 习,Prime(i),ByVal n As Integer,Exit Function,若不希望实参随形参改变,就将参数传递方式定义为传值,60,8.4.5 对象参数 在VB中,支持过程的形参是对象: 当传递窗体时,定义形参类型是Form; 当传递控件时,定义形参类型是Control.,不做要求,61,8.5 递归过程 所谓递归,就是在过程定义中,调用过程本身。,Private Sub Form_Click() Dim n As Integer n = InputBox(输入一个正整数) Print n; !=; fact(n)End Sub,Private F

28、unction fact(ByVal n As Integer) As Long If n = 1 Then fact = 1 Else fact = n * fact(n - 1) End IfEnd Function,例:使用递归函数求N!。 提示:N!=N*(N-1)!,函数调用,调用自身,表示为:fact(n)=n*fact(n-1),错误的调用:fact(n)=n*fact(n-1),62,执行过程分析(以输入3为例):,总结: 使用递归算法,最重要的是要有一个结束递归的条件,可以使递归得以返回,即终止条件或边界条件。,63,例:使用递归算法计算裴波拉挈数列。,Private Fun

29、ction 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 n As Integer n = InputBox(求数列的第几项) Print “数列中第”; n; “项是”; Cal(n)End Sub,64,Private Sub Form_Click() Dim fb() As Integer Dim i As Integer, n as integer n = InputBo

30、x(“求数列中第几项的值”) 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,上例的非递归解法例5-7(P109)。,递推法:利用未知项与已知项之间存在的某种关系,从已知项逐项推出未知项的方法。,65,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

31、.Text = CStr(Gcdvalue) End If End Sub,Private Function Gcd(ByVal a As Long, ByVal b As Long) Dim r As Long r = a Mod b Do While r0 a=b b=r r=a Mod b Loop Gcd = bEnd Function,例8-9:编写一个递归函数,求任意两个整数的最大公约数。,Private 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,P190,66,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 Sub,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教育教学 > 计算机等级考试

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报