版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.,1,第八章 子程序和函数,8.1 子程序概述 在VB5.0/6.0中,除了系统提供的内部函数过程和事件过程外,用户可自定义过程下列四种过程: “Sub” 保留字开始的为子过程 “Function” 保留字开始的为函数过程 “Property”保留字开始的为属性过程 “Event”保留字开始的事件过程,.,2,在VB中,的Sub子过程分为:事件过程和通用过程 8.2.1 事件过程 (1)窗体事件的语法 Private Sub Form_事件名(参数列表) 语句组 End Sub (2)控件事件的语法 Private Sub 控件名_事件名(参数列表) 语句组 End Sub,8.2 Sub过
2、程,.,3,子过程的定义形式如下: Public|PrivateStatic Sub 子过程名(形参表) 语句组 Exit Sub 语句组 End Sub,8.2.2 通用过程(Sub过程)的定义,说明: (1)子过程名:命名规则与变量名规则相同。子过程名不返回值,而是通过形参与实参的传递得到结果,调用时可返回多个值。,.,4,(2)形式参数列表:形式参数通常简称“形参”,仅表示形参的类型、个数、位置,定义时是无值的,只有在过程被调用时,虚实参结合后才获得相应的值。 (3)过程可以无形式参数,但括号不能省。 (4)参数的定义形式: ByValByRef变量名( )As 类型,, ByVal表示
3、当该过程被调用时,参数是按值传递的;缺省或ByRef表示当该过程被调用时,参数是按地址传递的。,例8.1编一个交换两个整型变量值的子过程。 Private Sub Swap( X As Integer, Y As Integer) Dim temp As Integer Temp=X : X=Y : Y=Temp End Sub,.,5,8.2.3 子过程的建立,通过 “工具”菜单中的“添加过程”命令,出现“添加过程”对话框(见图6.1),选择过程类型(子过程、函数、属性、事件)及作用范围(公有的Public、私有的Private),单击确定后得到一个过程或函数定义的结构框架(模板),如: P
4、ublic Sub Sort( ) End Sub,.,6,8.2.4 过程的调用 1 子过程的调用 子过程名 参数列表 或 Call 子过程名(参数列表) 2 函数过程的调用 变量名 = 函数过程名(参数列表) 说明: (1)参数列表称为实参或实元,它必须与形参保持个数相同,位置与类型一一对应。 (2)调用时把实参值传递给对应的形参。其中值传递(形参前有ByVal说明)时实参的值不随形参的值变化而改变。而地址传递时实参的值随形参值的改变而改变。,.,7,(3)当参数是数组时,形参与实参在参数声明时应省略其维数,但括号不能省。 (4)调用子过程的形式有两种,用Call关键字时,实参必须加圆括号
5、括起,反之则实参之间用“,”分隔。 例:调用上面定义的Sawp子过程的形式: Swap a,b Call Swap(a,b),.,8,Private Sub CmdOK() Call Swap(a,b) Swap a,b End Sub,Private Sub Swap(x%,y%) Dim temp% Temp=X X=Y Y=Temp End Sub,过程调用的执行过程:,.,9,8.3 Function过程,Visual Basic函数分为内部函数和外部函数,外部函数是用户根据需要用Function关键字定义的函数过程,与子过程不同的是函数过程将返回一个值 。,8.3.1 函数过程(Fu
6、nction过程)的定义,Public|PrivateStaticFunction 函数名()As 函数体函数名=返回值 Exit Function 函数名=返回值 End Function,.,10,说明: (1)函数名:命名规则与变量名规则相同。但不能与系统的内部函数或其它通用子过程同名,也不能与已定义的全局变量和本模块中模块级变量同名。 (2)在函数体内,函数名可以当变量使用,函数的返回值就是通过对函数名的赋值语句来实现的,在函数过程中至少要对函数名赋值一次。 (3)AS类型:是指函数返回值的类型,若省略,则函数返回变体类型值(Variant)。 (4)Exit Function:表示退
7、出函数过程,常常是与选择结构(If或Select Case语句)联用,即当满足一定条件时,退出函数过程。 (5)形参数列表:形参的定义与子过程完全相同。,例6.2,.,11,8.3.2 函数的调用,调用形式如下: 函数名(实参列表) 说明: 在调用时实参和形参的数据类型、顺序、个数必须匹配。函数调用只能出现在表达式中,其功能是求得函数的返回值。,.,12,8.4 过程的作用域,Public|Private Sub 子过程名(形式参数列表) . End Sub,概念,通用子过程和函数过程既可写在窗体模块中也可写在标准模块中,在定义时可选用关键字Private(局部)和Public(全局),来决定
8、它们能被调用的范围。,.,13,1、窗体/模块级过程: 加Private关键字的过程,只能被定义的窗体或模 块中的过程调用。 2、全局级过程: 加Public关键字(或缺省)的过程,可供该应用程序的所有窗体和所有标准模块中的过程调用。,按过程的作用范围来划分,过程可分为: 模块级过程 全局级过程,用例7.1来说明过程的作用域,.,14,总结归纳过程的定义及作用域如下表(教材Pg.163),.,15,8.5 过程之间参数的传递,Visual Basic中不同模块(过程)之间数据的传递有两种方式: 通过过程调用实参与形参的结合实现; 使用全局变量来实现各过程中共享数据。,8.5.1 形式参数与实际
9、参数,1、形式参数 是指在定义通用过程时,出现在Sub或Function语句中的变量名后面园括号内的数,是用来接收传送给子过程的数据,形参表中的各个变量之间用逗号分隔。,.,16,2、实际参数 实际参数是指在调用Sub或Function过程时,写入子过程名或函数名后括号内的参数,其作用是将它们的数据(数值或地址)传送给Sub或Function过程与其对应的形参变量。 实参可由常量、表达式、有效的变量名、数组名(后加左、右括号,如A())组成,实参表中各参数用逗号分隔。,8.5.2 参数传递(虚实结合),参数传递指主调过程的实参(调用时已有确定值和内存地址的参数)传递给被调过程的形参,参数的传递
10、有两种方式:按值传递、按地址传递。形参前加“ByVal”关键字的是按值传递,缺省或加“ByRef”关键字的为按地址传递。,.,17,传址与传值 传址: 形参得到的是实参的地址,当形参值的改变同时也改变实参的值。 传值: 形参得到的是实参的值,形参值的改变不会影响实参的值。,Sub Swap2(x%, y%) Dim Temp% Temp = x: x = y: y = Temp End Sub,Sub Swap1(ByVal x%, ByVal y%) Dim Temp% Temp = x: x = y: y = Temp End Sub,例8.4,.,18,Private Sub CmdOK
11、_Click() a% = 10: b% = 20: Swap1 a, b 传 值 Print A1=; a, B1=; b a = 10: b = 20: Swap2 a, b 传地址 Print A2=; a, B2=; b End Sub,程序调用执行过程:,.,19,值传递的执行过程如下图:,通过地址传递数据的执行过程,.,20,数据传递的几点说明: 1.参数的数据类型 2.按值传递参数 形参是实参的一个副本 3.按地址传递参数 形参实参公用内存单元 4.子过程执行一系列操作,函数过程返回一个值 注意:如果实参是常量(系统常量、符号常量)或者表达式,则无论定义时使用值传递还是地址传递,
12、都是按值传递将常量或者表达式的计算值传递给形参。,.,21,8.6 高级用法(数组做为参数),Visual Basic允许把数组作为实参传送到过程中。数组作参数是通过传地址方式传送。在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点: 1把一个数组的全部元素传送给一个过程,应将数组名分别写入形参列表中,并略去数组的上下界,但括号不能省略。 Private Sub Sort( a() As single) End Sub 其中形参“a( )”即为数组。,.,22,2被调过程可通过Lbound和Ubound函数确定实参数组的上、下界。 3当用数组作形参时,对应的实参必须也是数组,且类型一致
13、。 4实参和形参结合是按地址传递,即形参数组和实参数组共用一段内存单元。 例如:定义了实参数组b(1 to 8),给它们赋了值,调用Sort()函数过程的形式如下: Sort b() 或 Call Sort(b() ) 实参数组后面的括号可以省略,但为便于阅读,建议一般不要省略为好。,.,23,调用时形参数组a和实参数组b虚实结合,共用一段内存单元,如下所示。因此在Sort()过程中改变数组a的各元素值,也就相当于改变了实参数组b中对应的元素的值,当调用结束时,形参数组a成为无定义。 b(1) b(2) b(3) b(4) b(5) b(6) b(7) b(8) a(1) a(2) a(3)
14、a(4) a(5) a(6) a(7) a(8) 参数为数组时虚实结合示意图,例6.7改写上章例5.3的排序程序,分别将排序用子过程Sort(),产生N个随机整数用子过程GetData(),输入N个数组元素用PrData()子过程来完成。,.,24,补充例题:编写判断一个整数是不是素数写函数过程。如果给定的整数是素数,则返回逻辑值True,否则返回False,Private Function Prime(n As Integer) As Boolean Dim k%,Yes As Boolean Yes=True For k=2 to n2 IF n mod k =0 then Yes=Fal
15、se : Exit For Next k Prime=Yes 给函数名赋值,作为函的返回值 End Function,如何调用该函数呢? 使用该函数,编一验证哥德巴赫猜想。,.,25,Private Sub Form_Click() Dim n%,n1%,n2% n=Val(InputBox(输入大于6的正整数) For n1=3 to n2 step 2 让n1从3开始分解 n2=n-n1 求得n2 如果n1和n2都是素数,则打印输出 If prime(n1) And prime(n2) then Print n & = & n1 & + & n2 Exit For 结束循环 End if
16、Next n1 End Sub,.,26,For i = 1 To n - 1 p = i For j = i + 1 To n If a(p) a(j) Then p = j Next j temp = a(i) a(i) = a(p) a(p) = temp Next i,选择法排序(升序)的VB程序:,如何写一个排序的VB过程?,补充例题2:排序子过程,.,27,Private Sub Sort( a( ) As single) Dim i%,j%,p%,n%,temp! n=Ubound(a) For i = 1 To n - 1 p = i For j = i + 1 To n If
17、 a(p) a(j) Then p = j Next j temp = a(i) a(i) = a(p) a(p) = temp Next I End Sub,.,28,8.7 过程的嵌套和递归调用,8.7.1 过程的嵌套,在程序中调用一子过程,而在子过程中又调用另外的子过程,这种程序结构称为过程的嵌套。过程的嵌套调用执行过程如下图:,.,29,8.7.2 过程的递归调用,用自身的结构来描述自身,称递归。例如,对阶乘的定义:,Visual Basic允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function函数。,例8.8编求阶乘fac(n)=n!
18、 的递归函数,.,30,Private 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 Form_Click() Print “fac(4)=”;fac(4) End Sub,程序的递归过程:,.,31,说明: 递归处理一般用栈来实现,分递推和回归两个过程,如上图所示。 递推过程:每调用一次自身,把当前参数(形参、局部变量、返回地址等)压入栈,直到递归结束条件成立。 回归过程:然后从栈中弹出当前参数,直到栈空
19、。 递归算法设计简单,解决同一问题,使用递归算法消耗的机时和占据的内存空间要比使用非递归算法大。 使用递归算法必须要满足以下的递归条件: (1)存在递归结束条件及结束时的值; (2)能用递归形式表示,且递归向终止条件发展。,.,32,8.8 应用举例,8.8.1 查找问题,例8.11使用顺序查找法,在一组数中查找某给定的数x,算法设计: 设一组数据存放在数组a(1)-a(n)中,待查找的数据放在x 中,把x与a数组中的元素从头到尾一 一进行比较查找。用变量p表示a数组元素下标,p初值为1,使x与a(p)比较,如果x不等于a(p),则使p=p+1,不断重复这个过程;一旦x等于a(p)则退出循环;
20、另外,如果p大于数组长度,循环也应该停止,则可由以下语句来实现它。,For P=1 to n IF a(p)=x then Exit For Next P,.,33,下面编写一查找函数Find(),若找到x则返回下标值,找不到返回0 Private Function Find( a() As Single, x As Single) As Integer Dim n%,p%,m% m=Lbound(a) n=Ubound(a) For P=m to n IF a(p)=x then Exit For Next P If pn then p=0 Find=p End Function,.,34,
21、例8.12 使用折半查找法,在一批有序数列中查找给定的数x。,分析:设n个有序数(从小到大)存放在数组a(1)-a(n)中,要查找的数为x。用变量bot、top、mid 分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间,mid=(top+bot)/2,折半查找的算法如下: (1)x=a(mid),则已找到退出循环,否则进行下面的判断; (2)xa(mid),x必定落在mid+1和top的范围之内,即bot=mid+1; (4)在确定了新的查找范围后,重复进行以上比较,直到找到或者bot=top。,.,35,8.8.2 插入问题,例8.13把一个给定数插到有序数列中,插入后数列仍
22、然有序 分析:设n个有序数(从小到大)存放在数组a(1)a(n)中,要插入的数x。首先确定x插在数组中的位置p;(可由以下语句实现) ReDim Preserve a(n + 1)让数组长度增加1,以便存放插入的数 p=1 do while xa(p) and p=n p=p+1 loop,.,36,a(p)a(n)元素向后顺移一个位置以空出a(p)元素放入x.。(可由以下语句实现) for i=n to p step -1 a(i+1)=a(i) next i a(p)=x,将其写成一插入函数 ( 教材Pg.154 ),.,37,VB提供了上百种内部函数(库函数),要求掌握这些常用函数的功能
23、及使用。 调用方法: 函数名(参数列表) 有参函数 函数名 无参函数 说明: (1) 使用库函数要注意参数的个数及其参数的数据类型 (2) 要注意函数的定义域(自变量或参数的取值范围) 例如: sqr(x) 要求: x=0 (3)要注意函数的值域。 如:exp(23773) 的值就超出实数在计算机中的表示范围。,8.9 常用内部函数,.,38,1. 数学函数 常用的数学函数见P121表8-1所示 Abs(N) Cos(N) Sin(N) Exp(N) Log(N) Sqr(N) Rnd(N) Sgn(N) 说明: (1) 在三角函数中的自变量是以弧度为单位。 如:sin300 sin(3.14159/180*30) (2) Rnd函数返回0 1(包括0和不包括1)之间的双精度随机数。 若要产生1-100的随机整数: Int(Rnd *100)+1 提问:怎样产生N,M区间的随机数?,.,39,2. 转换函数 常用的转换函数见p123表8-4所示 说明: (1)要区别两个取整函数int()和fix() Fix(N)为截断取整,即去掉小数后的数。 Int(N)不大于N的最大整数。 N0与int(N) 相同,当N0时, int(N) 与fix(N) -1相等。 例如: Fix(9.59) =9, Int(9.59) =9 Fix(-9.59) =-9,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- YC/Z 623-2024烟草商业企业卷烟物流应急作业指南
- 2025版卷帘门销售与安装及售后服务合同3篇
- 城市排水系统改造招标意见
- 2024年停车场新能源汽车充电设施建设合同3篇
- 电视媒体收费规范:发票管理办法
- 城市供水项目钻井工程施工合同
- 水厂石材施工合同
- 办事处员工福利与关怀措施
- 医疗文创企业人才引进协议书
- 污水处理承台施工合同
- 弘扬科学精神激发创新活力-2024全国科普日主题宣教课件
- 大学《中国古代文学史》期末复习题库
- 个人代开税票合同协议书
- 酒店英语会话(第六版)教案 unit 1 Room Reservations
- 冀教版数学五年级上册7.2 综合与实践 估算玉米收入
- DL∕T 2558-2022 循环流化床锅炉基本名词术语
- DL∕T 523-2017 化学清洗缓蚀剂应用性能评价指标及试验方法
- 抖音账号归属合同范本
- CJT 313-2009 生活垃圾采样和分析方法
- 教师进企业实践日志
- 广安市岳池县2022-2023学年七年级上学期期末道德与法治试题【带答案】
评论
0/150
提交评论