




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第6章章 过程与函数过程与函数6.1过程概述过程概述在程序设计时,经常要把一个大的任务划分成若干个小的子任务,每个子任务完成一个相对独立的功能。在Visual Basic中把这些子任务称为过程。使用过程编程有如下优点:()采用“分而治之”的思想。()引入“工程”的设计方法。 ()可以把设计好的模块作为产品在Visual Basic中,模块的具体体现为函数与过程。 6.1过程概述过程概述在Visual Basic中过程主要分为三种:子子过程过程、函数过程函数过程和属性过程属性过程,其中:子过程(Sub Procedure):子过程是没有返回值的函数。子过程一般用于接收或处理输入数据、显示输出或
2、者设置属性。 函数过程(Function Procedure):函数过程用来完成特定的功能并返回相应的结果。函数过程能够接收参数,并且总是以该函数名返回一个值。6.1过程概述过程概述属性过程(Property Procedure):属性过程用来创建和操作程序中用户定义的属性。它使能够定制现有的Visual Basic控件,并通过创建新的对象、属性和方法来扩展Visual Basic语言。 本章重点介绍Sub子过程和Function函数过程。6.2 Sub过程过程Sub过程可以放在标准模块和窗体模块中,Visual Basic的Sub过程分为事件过程和通用过程两大类。()事件过程是当发生某个事件
3、时,对该事件做出响应的程序段,它是Visual Basic应用程序的主体。6.2 Sub过程过程()通用过程有时多个不同的事件过程可能需要使用同一段程序代码,为此,可将这段代码独立出来,编写成一个共用的过程它独立于事件过程之外,可供其他事件过程调用。6.2.1 事件过程事件过程通过前面的学习,我们知道Visual Basic采用事件驱动的编程机制事件驱动的编程机制()事件事件是能被对象(窗体和控件)识别的动作。如对象的单击(Click)事件、双击(DblClick)事件、内容改变(Change)事件等等。()事件过程事件过程是为一个事件所编写的程序代码。当Visual Basic中的对象发生某
4、个事件时,便自动调用相应的事件过程。6.2.1 事件过程事件过程根据对象的不同,事件过程又分为窗体事件过程和控件事件过程。1窗体事件过程窗体事件过程定义为“Form_事件名”,其格式为:Private Sub Form_ (参数表参数表)语句块语句块End Sub6.2.1 事件过程事件过程思考:下面代码的功能?Private Sub Form_Click( )Me.BackColorVbRedEnd Sub6.2.1 事件过程事件过程2控件事件过程控件事件过程的定义是“控件名_事件名”,其格式为:Private Sub _ (参数表参数表)语句块语句块End Sub6.2.1 事件过程事件过
5、程思考:下面代码的功能?Private Sub Command1_Click( )Text1.Text = Visual Basic程序设计End Sub6.2.1 事件过程事件过程3建立事件过程方法一:在设计窗体上双击窗体或控件,就打开了代码编辑器窗口,并会出现该窗体或控件的默认过程代码。例如:Private Sub Text1_Change()End Sub6.2.1 事件过程事件过程方法二:单击工程资源管理器窗口的“查看代码”按钮,再从对象列表框中选择一个对象,从过程列表框中选择一个过程。6.2.2 通用过程通用过程事件过程只能针对某个具体的窗体或控件。而当有多个窗体或控件的事件过程中需
6、要执行某些相同的操作时,为了避免重复编写代码,可以把这些相同操作所对应的代码段拿出来定义一个通用过程。 通用过程通常完成指定的任务,通用过程不与任何特定的事件相联系,只能由别的过程来调用,它可以存储在窗体或标准模块中。6.2.2 通用过程通用过程1通用过程的定义通用过程定义的语法格式为:Private|Public Static Sub (参数表参数表)语句块语句块1Exit Sub语句块语句块2End Sub6.2.2 通用过程通用过程说明:(3) 子过程名:命名规则与变量名规则相同。子过程名不返回值,而是通过形参与实参的传递得到结果,调用时可返回多个值。 (4) 参数的定义形式:参数的定义
7、形式:ByValByRef变量名变量名( )As 类型类型,,ByVal表示当该过程被调用时,参数是按值传递的;缺省ByRef表示当该过程被调用时,参数是按地址传递的。 6.2.2 通用过程通用过程例如,编写全局Sub过程计算n!。Public Sub Fact(n As Integer, F As Double) Fact为过程名,参数F用于返回阶乘值 Dim i As Integer F = 1 For i = 1 To n F = F * i Next iEnd Sub6.2.2 通用过程通用过程2通用Sub过程的建立建立通用过程有两种方法:直接在代码编辑窗口中输入过程代码或使用添加过程
8、对话框。方法一:通过添加过程对话框建立。 方法二:在代码窗口的“对象”下拉列表中选择“通用”,输入过程名。 6.2.3 过程的调用过程的调用1通用事件过程的调用通用过程的调用有两种方式:Call (参数表参数表)和 参数表参数表例如,调用上面定义的Fact子过程的形式:Call Fact(a,b) 和 Fact a,b参数表:在调用语句中的参数称为实际参数(简称实参),实参可以是变量、常数、数组和表达式。参数与参数之间要用逗号隔开。6.2.3 过程的调用过程的调用2事件过程的调用事件过程的调用一般是由事件触发而引起,如单击按钮、窗体加载等,也可以通过像通用过程那样通过Call或过程名直接调用。
9、6.2.3 过程的调用过程的调用例如,可以在窗体的双击事件过程内部调用Text1的Change事件过程。Private Sub Form_Click() Call Text1_ChangeEnd Sub程序运行后,单击窗体等同于执行Text1的Change事件。子过程举例,不带参数子过程举例,不带参数例:例:单击按钮1,2,3,分别在窗体上打印3个*,5个#。方法方法1:使用我们已学过的方法:使用我们已学过的方法Private Sub Command1_Click() Print String(3, *) Print String(5, #)End SubPrivate Sub Command
10、2_Click()同上End Sub Private Sub Command3_Click()同上End Sub缺点缺点:多次输入相同代多次输入相同代码,冗余大,效码,冗余大,效率低率低改进改进:相同代码只写一相同代码只写一次,运行时多次次,运行时多次调用调用方法2:使用子过程实现Private Sub Command1_Click() Call prtEnd SubPrivate Sub Command2_Click()Call prtEnd SubPrivate Sub Command3_Click()Call prtEnd SubSub prt() Print String(3, *)
11、Print String(5, #)End Sub 添加子过程的方法:添加子过程的方法: 1.插入点在所有过程之外插入点在所有过程之外 2.工具工具-添加过程添加过程n例:单击按钮1,2,3,分别在窗体上打印 3个*,5个#;4个*,6个#;5个*,7个#.n方法: 使用带参数子过程子过程举例,带参数子过程举例,带参数Private Sub Command1_Click() Call prt(3, 5)End SubPrivate Sub Command2_Click() Call prt(4, 6)End SubPrivate Sub Command3_Click() Call prt(5,
12、 7)End SubSub prt(x%, y%) Print String(x, *) Print String(y, #)End Sub实参形参子过程举例,带参数带返回值子过程举例,带参数带返回值n 利用子过程计算任意2个数的和,要求在主调过程中输入2个数,在子过程中计算和并返回给主调函数。n代码:Private Sub Command1_Click()Dim a!, b!, s!a = Val(InputBox(请输入数a:)b = Val(InputBox(请输入数b:)Call sum(a, b, s)Print a+b=; sEnd SubSub sum(x!, y!, z!) z
13、 = x + yEnd Sub6.2.3 过程的调用过程的调用【例6-1】求S=7!+8!+5!的值。图6-2 计算阶乘法结果6.2.3 过程的调用过程的调用【例6-2】编写一个Sub过程,计算N个数的和,即1+2+N,并通过命令按钮的单击事件调用该过程计算S=1+(1+2)+(1+2+3)+(1+2+3+K)。图6-3 例8-2程序运行界面6.3 Function过程过程与Sub过程不同的是,Function过程可返回一个值到调用的过程。Function过程的格式为:Private | Public Static Function (参数表参数表) As 语句块语句块 函数名函数名=表达式表
14、达式 Exit Function 语句块语句块 函数名函数名=表达式表达式End Function6.3 Function过程过程(3) 函数过程通过函数过程名函数过程名返回其值,因此函数过程名是有类型的,其类型在Function语句中用As加以定义,可以定义为Integer、Long、Single、Double、 Boolean或String。若缺省了As语句,则函数过程名的类型为Variant。6.3 Function过程过程(4) 在函数过程结束前,函数过程名必须被赋予一个值作为函数的返回值,通过赋值语句=来实现,如果在函数体中没有该赋值语句,函数过程将返回一个默认值:数值函数过程返回0
15、,字符串函数过程返回一个空串。6.3 Function过程过程例如:求N的阶乘的算法用Function过程表示如下:Function Fact (N As Integer) As Long Dim i As Integer, T As Long T=1 For i=1 To N T=T*i Next i Fact=T 由函数过程名Fact返回阶乘值End Function6.3.2 Function过程的调用过程的调用 调用函数Function过程的方法和调用Visual Basic内部函数方法一样,在语句中直接使用函数名,Function过程可返回一个值到调用的过程。其语法格式为: 函数名函
16、数名(实参列表实参列表) 例如,下面的代码调用了计算阶乘的例如,下面的代码调用了计算阶乘的Function过程:过程:Text1.Text = Fact(7) 计算计算7的阶乘的阶乘例例6-36.4 过程中参数的传递6.4.1 形式参数和实际参数形式参数和实际参数1形式参数(形参) 在被调用过程中的参数称为形式参数,简称为形参,出现在Sub过程和Function过程中。 例如:Private Sub Swap( x As Integer, y As Integer) 其中x,y即为形参。6.4.1 形式参数和实际参数形式参数和实际参数2实际参数(实参) 在主调过程中的参数称为实际参数,简称为实
17、参,在过程调用时实参将数据传递给形参。 实参表可由常量、表达式、有效的变量名、数组名组成,实参表中各参数用逗号分隔。在调用过程时,实参和形参的数据类型、位置、个数必须一一对应。 例如:Call Swap(a,b)6.4.1 形式参数和实际参数形式参数和实际参数定义过程:sub Swap( x As Integer, y As Integer)调用过程:Call Swap( a, b) 图6-5 实参和形参的对应关系6.4.2 参数的传递方式参数的传递方式 参数传递是指主调过程的实参(调用时已有确定值和内存地址的参数)传递给被调过程的形参。 参数的传递有两种方式:按值传递和按地址传递。形参前加“
18、ByVal”关键字的是按值传递;缺省或加“ByRef”关键字的为按地址传递。 6.4.2 参数的传递方式参数的传递方式 按值传递参数时,Visual Basic给传递的形参分配一个临时的内存单元,将实参的值传递到这个临时单元去。实参向形参传递是单向的,如果在被调用的过程中改变了形参值,则只是临时单元的值变动,不会影响实参变量本身。 6.4.2 参数的传递方式参数的传递方式【例6-4】通过Swap1过程交换形参,要求交换的结果不能影响实参。图6-6 按值传递运行界面6.4.2 参数的传递方式参数的传递方式2按地址传递参数 按地址传递参数,是指把形参变量的内存地址传递给被调用过程,形参和实参具有相
19、同的地址,即形参、实参共享一段存储单元。因此,在被调过程中改变形参的值,则相应实参的值也被改变。 6.4.2 参数的传递方式参数的传递方式【例6-5】通过Swap2过程交换形参,要求实参与形参同步变化。图6-8 按地址传递运行界面传址与传值传址与传值n传值 与 传址10ax10 x的改变与a无关10axx与a共享存储单元,x变a也变实参与形参举例:交换两数 6.5.vbpn传值法:Sub sw1(ByVal x%, ByVal y%) Dim t% t = x: x = y: y = tEnd Subn传址法:Sub sw2(ByRef x%, ByRef y%) Dim t% t = x:
20、x = y: y = tEnd Sub主调过程:Sub Command1_Click() Dim a%, b% a = 10 b = 20 Print 原始值:a=; a;b=; b Call sw1(a, b) Print 1交换后:a=; a; b=; b Call sw2(a, b) Print 2交换后:a=; a; b=; bEnd Sub10a20bxy1020 xyab1020ByVal 传值传值ByRef 传地址传地址形参获得实参的值形参获得实参的值形参获得实参的地址形参获得实参的地址实参与形参举例:交换两数实参为ab,形参为xy6.4.3 数组参数的传递方式数组参数的传递方式
21、 Visual Basic允许在定义过程时,数组可以作为形参出现在过程的形参列表中。数组作参数是通过传地址方式传送。在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点:6.4.3 数组参数的传递方式数组参数的传递方式(1) 为了把一个数组的全部元素传送给一个过程,应将数组名分别写入形参表中,并略去数组的上下界,但括号不能省略。如:Private Sub Sort( a() As single) End Sub6.4.3 数组参数的传递方式数组参数的传递方式(3) 当用数组作形参时,对应的实参必须也是数组,且类型一致。(4) 实参和形参结合是按地址传递,即形参数组和实参数组共用一段内存单
22、元。例如,定义了实参数组b(1 to 8),给它们赋了值,调用Sort()函数过程的形式如下:Sort b() 或 Call Sort(b() ) 6.4.3 数组参数的传递方式数组参数的传递方式(5) 在被调用过程中不能用Dim语句对形参数组声明,否则会产生“重复声明”的编译错误。但是在使用动态数组时,可以用Redim语句改变形参数组的维数,重新定义数组的大小。当返回调用过程时,对应的实参数组的维数也随之发生变化。6.4.3 数组参数的传递方式数组参数的传递方式【例6-6】请定义一个通用过程,实现对数据的升序排序,采用冒泡法排序。求求数数组组的的最最大大值值6.5 过程的嵌套与递归过程的嵌套
23、与递归 在一个过程(Sub过程或Function过程)中调用另外一个过程,称为过程的嵌套调嵌套调用用,而过程直接或间接地调用自身,则称为过程的递归调用递归调用。6.5.1 过程的嵌套过程的嵌套 VB在定义过程时,不能嵌套定义过程,但可以嵌套地调用过程,即被主程序调用的过程还可以调用另外的过程,这种程序结构称为过程的嵌套。6.5.1 过程的嵌套过程的嵌套 图6-14 程序运行界面)!( !mnmnCmn【例6-10】利用函数嵌套求C(m,n)的值。6.5.1 过程的嵌套过程的嵌套【例6-10】利用函数嵌套求C(m,n)的值。主程序 Command1 .调用 Comb .End Sub被 调 程
24、序 Comb.调用 Fact.End Sub被 调 程 序 Fact.End Sub6.5.2 过程的递归过程的递归 在Visual Basic中,一个过程可以直接或间接地调用自身,前者称为直接递归调用,后者称为间接递归调用。 递归必须有相应的结束递归的条件,否则递归将不能结束,我们称这种递归为有穷递归。6.5.2 过程的递归过程的递归1直接递归 直接递归就是在过程体内出现直接调用自身的过程。如下面定义的Direct过程。 Function A(n As Integer) S = A(m) End Function6.5.2 过程的递归过程的递归Function S1(n As Integer
25、)x = S2(m)End FunctionFunction S2(m As Integer)y = S1(n)End Function2间接递归 间接递归就是在过程体内出现间接调用自身的过程。如下面定义的S1和S2过程。6.5.2 过程的递归过程的递归【例6-11】利用递归调用计算N!。图6-15 求n!运行界面6.6 .1 变量的作用范围变量的作用范围 变量的作用范围是指程序所定义的变量能有效发挥其作用的范围。根据定义变量的位置和定义变量的语句的不同,在Visual Basic中变量可以分为过程级变量、模块级过程级变量、模块级变量和全局变量。变量和全局变量。6.6 .1 变量的作用范围变量
26、的作用范围1过程级变量 在一个过程内部使用Dim或Static关键字声明变量时,只有该过程内部的代码才能只有该过程内部的代码才能访问或改变该变量的值,因此被称为过程访问或改变该变量的值,因此被称为过程级变量。级变量。过程级变量的作用范围限制在该过程内部,也称为局部变量。例如: Dim a As Integer, x As Single Static sum As Single6.6 .1 变量的作用范围变量的作用范围 过程级变量根据其生存期的不同又分为动态变量和静态变量。(1)动态变量的生存期为过程的一次调用期间。用Dim声明的变量属于动态变量。在过程内未经显式声明而直接使用的变量也是动态变量
27、。 6.6 .1 变量的作用范围变量的作用范围(2)静态变量的生存期为整个应用程序的执行期间。用 Static 声明的变量属于静态变量。静态变量在应用程序执行期间占据固定的内存单元,当静态变量所在的过程执行结束后,该变量不释放内存空间,变量的值保持不变。若该过程又被调用时,接着使用上次的值。6.6 .1 变量的作用范围变量的作用范围【例6-13】测试在过程内部使用Dim和Satic定义变量的不同。Private Sub Form_Click() Dim A1 As IntegerStatic A2 As Integer A1=A1+1 A2=A2+1 End Sub 6.6 .1 变量的作用范
28、围变量的作用范围2模块级变量 模块级变量是指在一个模块内所有的过程一个模块内所有的过程都可使用它都可使用它,但在其他的模块内则无法访问或改变其值的变量。可在窗体模块和标准模块顶部用Dim或Private关键字声明模块级变量,如图6-18所示。6.6 .1 变量的作用范围变量的作用范围3全局变量 全局变量的作用范围可以是应用程序的所应用程序的所有过程,也称为公用变量有过程,也称为公用变量。声明的方法是在窗体或标准模块的通用部分中使用Public关键字声明变量。例如: Public a As Integer, b As Single6.6.2 过程的作用范围过程的作用范围 在Visual Basi
29、c中,过程的作用范围分为模块级(或称文件级)和全局级(或称工程级)。(1)模块级过程模块级过程 是在某个模块内定义的过程。如果在Sub或Function过程前加Private,则该过程只能被本模块中定义的过程调用,即其作用范围为本模块。6.6.2 过程的作用范围过程的作用范围(2) 全局级过程全局级过程 是定义过程时,在Sub或Function前加关键字Public(系统默认为Public)。全局级过程可被整个应用程序的所有模块中定义的过程调用,即其作用范围是整个应用程序(工程)。 6.6.2 过程的作用范围过程的作用范围1. 调用窗体中的过程 所有窗体模块的外部调用必须指向包含此过程的窗体模块,其格式为: Call 窗体名窗体名.全局过程名全局过程名(实参表实参表)例如,在窗体Form2中定义一个全局过程Sub1,在窗体Form1中调用Form2中的Sub1过程的语句为: Call Form2.Sub1(实参表实参表)6.6.2 过程的作用范围过程的作用范围2调用标准模块中的过程 如果过程名是唯一的,则不必在调用时加模块名。如果有两个以上的模块包含同名的过程,则调用本模块内过程时不必加模块名,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护士入编面试试题及答案
- 五类人员笔试题及答案
- 激光工程师的专业能力培养与提升试题及答案
- 育婴师成长陪伴技巧试题及答案
- 2025届高考化学一轮复习专题一物质的量4含解析新人教版
- 二年级语文上册第三单元9朱德的扁担教学反思参考1语文S版
- 企业办公室试题及答案
- 2024年秋一年级语文上册课文14四季教学反思1新人教版
- 六年级体育下册山羊分腿腾越练习无答案
- 教师资格考试的全方位备考试题与答案
- 《绿色建筑概论》整套教学课件
- 证据法学李浩课件 第五章
- 图书馆建筑设计规范讲解课件
- 考研考博-英语-北京建筑大学考试押题卷含答案详解3
- 爱莲说-王崧舟
- 光伏支架安装施工协议
- 保定市县级地图PPT可编辑矢量行政区划(河北省)
- 第四章通道内非耦合层流的
- 供水管网施工组织设计
- 异面直线所成的角与求法
- 信息安全风险评估培训(课堂PPT)
评论
0/150
提交评论