已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三部分,VisualBasic程序设计基础二,3.7.1过程概述VisualBasic中有两类过程,一类是系统提供的内部事件过程,事件过程是构成VB应用程序的主体;另一类是用户自己定义的过程,可供事件过程多次调用的过程。,3.7过程,3.7过程,3.7.1过程概述在VB6.0中,除了系统提供的内部函数过程和事件过程外,用户可自定义下列四种过程:“Sub”保留字开始的子过程“Function”保留字开始的函数过程“Property”保留字开始的属性过程“Event”保留字开始的事件过程,在VB中,Sub子过程分为:事件过程和通用过程1事件过程(1)窗体事件的语法PrivateSubForm_事件名(参数列表)语句组EndSub(2)控件事件的语法PrivateSub控件名_事件名(参数列表)语句组EndSub,3.7.2Sub过程,3.7.2Sub过程,2通用过程(Sub过程)的定义多个不同的事件过程可能需要使用同一段程序代码,这时可将这段代码独立出来,编写为一个共用的过程,称为通用过程,它独立于事件过程之外,可供其他事件过程调用。子过程的定义形式如下:Public|PrivateStaticSub子过程名(形参表)语句组ExitSub语句组EndSub,说明:(1)子过程名:命名规则与变量名规则相同。子过程名不返回值,而是通过形参与实参的传递得到结果,调用时可返回多个值。(2)形式参数列表:形式参数通常简称“形参”,仅表示形参的类型、个数、位置,定义时是无值的,只有在过程被调用时,虚实参结合后才获得相应的值。(3)过程可以无形式参数,但括号不能省。(4)参数的定义形式:ByValByRef变量名()As类型,,ByVal表示当该过程被调用时,参数是按值传递的;缺省或ByRef表示当该过程被调用时,参数是按地址传递的。,例:编一个交换两个整型变量值的子过程。PrivateSubSwap(xAsInteger,yAsInteger)DimtempAsIntegertemp=x:x=y:y=tempEndSub,3.7.2Sub过程,3子过程的建立通过“工具”菜单中的“添加过程”命令,出现“添加过程”对话框(见下图),选择过程类型(子过程、函数、属性、事件)及作用范围(公有的Public、私有的Private),单击确定后得到一个过程或函数定义的结构框架(模板),如:PublicSubSort()EndSub,3.7.2Sub过程,4子过程的调用子过程名参数列表或Call子过程名(参数列表),说明:(1)参数列表称为实参或实元,它必须与形参保持个数相同,位置与类型一一对应。(2)调用时把实参值传递给对应的形参。其中值传递(形参前有ByVal说明)时实参的值不随形参的值变化而改变。而地址传递时实参的值随形参值的改变而改变。(3)当参数是数组时,形参与实参在参数声明时应省略其维数,但括号不能省。(4)调用子过程的形式有两种,用Call关键字时,实参必须加圆括号括起,反之则实参之间用“,”分隔。,例:调用上面定义的Sawp子过程的形式:Swapa,b或CallSwap(a,b),PrivateSubCmdOK()CallSwap(a,b)Swapa,bEndSub,PrivateSubSwap(x%,y%)Dimtemp%temp=xx=yy=tempEndSub,3.7.2Sub过程,过程调用的执行过程:,VisualBasic函数分为内部函数和外部函数,外部函数是用户根据需要用Function关键字定义的函数过程,与子过程不同的是函数过程将返回一个值。1函数过程(Function过程)的定义Public|PrivateStaticFunction函数名()As函数体函数名=返回值ExitFunction函数名=返回值EndFunction,3.7.3Function过程,说明:(1)函数名:命名规则与变量名规则相同。但不能与系统的内部函数或其它通用子过程同名,也不能与已定义的全局变量和本模块中模块级变量同名。(2)在函数体内,函数名可以当变量使用,函数的返回值就是通过对函数名的赋值语句来实现的,在函数过程中至少要对函数名赋值一次。(3)AS类型:是指函数返回值的类型,若省略,则函数返回变体类型值(Variant)。(4)ExitFunction:表示退出函数过程,常常是与选择结构(If或SelectCase语句)联用,即当满足一定条件时,退出函数过程。(5)形参数列表:形参的定义与子过程完全相同。,3.7.3Function过程,2函数的调用调用形式如下:函数名(实参列表),说明:在调用时实参和形参的数据类型、顺序、个数必须匹配。函数调用只能出现在表达式中,其功能是求得函数的返回值。,例:求任意一个数从1到该数自身的和.PrivateSubCommand1_Click()DimnAsInteger,sAsLongn=Val(inputbox(“请输入数值”)s=ss(n)调用函数printsEndSub,定义求和的函数PublicFunctionss(ByValmAsInteger)AsLongDimiAsIntegerf=0Fori=1Tomf=f+iNextiss=fEndFunction,3.7.4过程之间参数的传递,VisualBasic中不同模块(过程)之间数据的传递有两种方式:通过过程调用实参与形参的结合实现;使用全局变量来实现各过程中共享数据。1形式参数与实际参数(1)形式参数是指在定义通用过程时,出现在Sub或Function语句中的变量名后面圆括号内的数,是用来接收传送给子过程的数据,形参表中的各个变量之间用逗号分隔。(2)实际参数实际参数是指在调用Sub或Function过程时,写入子过程名或函数名后括号内的参数,其作用是将它们的数据(数值或地址)传送给Sub或Function过程与其对应的形参变量。,说明:实参可由常量、表达式、有效的变量名、数组名(后加左、右括号,如A())组成,实参表中各参数用逗号分隔。,3.7.4过程之间参数的传递,2参数传递(虚实结合)参数传递指主调过程的实参(调用时已有确定值和内存地址的参数)传递给被调过程的形参,参数的传递有两种方式:按值传递、按地址传递。形参前加“ByVal”关键字的是按值传递,缺省或加“ByRef”关键字的为按地址传递。传址与传值传址:形参得到的是实参的地址,当形参值改变的同时也改变实参的值。传值:形参得到的是实参的值,形参值的改变不会影响实参的值。,例:一个交换两个整型变量值的子过程。PrivateSubSwap1(ByValx%,ByValy%)DimtempAsIntegertemp=x:x=y:y=tempEndSub,例:一个交换两个整型变量值的子过程。PrivateSubSwap2(x%,y%)DimtempAsIntegertemp=x:x=y:y=tempEndSub,PrivateSubCmdOK_Click()a%=10:b%=20Swap1a,b传值PrintA1=;a,B1=;ba=10:b=20Swap2a,b传地址PrintA2=;a,B2=;bEndSub,值传递的执行过程如下图:,通过地址传递数据的执行过程,数据传递的几点说明:1.参数的数据类型2.按值传递参数:形参是实参的一个副本3.按地址传递参数:形参实参公用内存单元4.子过程执行一系列操作,函数过程返回一个值注意:如果实参是常量(系统常量、符号常量)或者表达式,则无论定义时使用值传递还是地址传递,都是按值传递将常量或者表达式的计算值传递给形参。,举例,编写判断一个整数是不是素数写函数过程。如果给定的整数是素数,则返回逻辑值True,否则返回False。,判断一个数是否是素数PrivateFunctionPrime(nAsInteger)AsBooleanDimk%,YesAsBooleanYes=TrueFork=2ton2IFnmodk=0thenYes=False:ExitForEndIfNextkPrime=Yes给函数名赋值,作为函的返回值EndFunction,验证哥德巴赫猜想PrivateSubForm_Click()Dimn%,n1%,n2%n=Val(InputBox(输入大于6的正整数)让n1从3开始分解Forn1=3ton2step2n2=n-n1求得n2如果n1和n2都是素数,则打印输出Ifprime(n1)Andprime(n2)thenPrintn&=&n1&+&n2ExitFor结束循环EndifNextn1EndSub,3.7.5数组作过程的参数,VisualBasic允许把数组作为实参传送到过程中。数组作参数是通过传地址方式传送。在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点:1把一个数组的全部元素传送给一个过程,应将数组名分别写入形参列表中,并略去数组的上下界,但括号不能省略。PrivateSubSort(a()Assingle)EndSub其中形参“a()”即为数组。,3.7.5数组作过程的参数,2被调过程可通过Lbound和Ubound函数确定实参数组的上、下界。3当用数组作形参时,对应的实参必须也是数组,且类型一致。4实参和形参结合是按地址传递,即形参数组和实参数组共用一段内存单元。,例如:定义了实参数组b(1to8),给它们赋了值,调用Sort()函数过程的形式如下:Sortb()或CallSort(b()实参数组后面的括号可以省略,但为便于阅读,建议一般不要省略为好。调用时形参数组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)a(4)a(5)a(6)a(7)a(8),3.7.6过程的嵌套和递归调用,1过程的嵌套在程序中调用一子过程,而在子过程中又调用另外的子过程,这种程序结构称为过程的嵌套。过程的嵌套调用执行过程如下图:,3.7.6过程的嵌套和递归调用,2过程的递归调用用自身的结构来描述自身,称递归。例如,对阶乘的定义:VisualBasic允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function函数。,例:编写求阶乘fac(n)=n!的递归函数PrivateFunctionfac(nAsInteger)AsIntegerIfn=1Thenfac=1Elsefac=n*fac(n-1)EndIfEndFunctionPrivateSubForm_Click()Print“fac(4)=”;fac(4)EndSub,程序的递归过程:,说明:递归处理一般用栈来实现,分递推和回归两个过程,如上图所示。递推过程:每调用一次自身,把当前参数(形参、局部变量、返回地址等)压入栈,直到递归结束条件成立。回归过程:然后从栈中弹出当前参数,直到栈空。递归算法设计简单,解决同一问题,使用递归算法消耗的机时和占据的内存空间要比使用非递归算法大。使用递归算法必须要满足以下的递归条件:(1)存在递归结束条件及结束时的值;(2)能用递归形式表示,且递归向终止条件发展。,3.7.7变量与过程的作用范围,1代码模块的概念,应用程序通常包括窗体文件(.frm)、模块文件(.bas)和类模块(.cls),2变量的作用范围(1)过程级变量在过程中,用dim或static声明的变量。过程级变量也称为局部变量,是指在一个过程内声明的变量,该变量只能在本过程内部被引用或被改变其值,而不能被其它的过程使用。(2)模块级变量在通用声明段用dim或private声明的变量。模块级变量是指在一个模块内的所有的过程都可使用它,但在其它的模块内则无法访问或改变其值的变量。(3)全局变量在通用声明段用public声明的变量。全局变量是指在整个应用程序中,所有的过程内都可引用或改变其值的变量。全局变量的作用范围是整个应用程序。,3.7.7变量与过程的作用范围,3过程的作用范围(1)私有过程私有过程也叫局部过程,是指在定义Sub过程或Function过程时选用“Private”关键字进行声明。(2)公共过程在标准模块中定义的公共过程(或变量),可以在整个应用程序内被所有的模块所有的过程直接调用。在窗体模块中定义的公共过程(或变量),可被在本窗体模块内的所有过程直接调用,而在其他模块中调用时必须加上公共过程(或变量)所在窗体的名称。Form1:PublicSubPrintMe(xAsString)Form2:CallForm1.PrintMe(hello),3.7.7变量与过程的作用范围,3.7.7变量与过程的作用范围,4.变量的生存期(1)动态变量在过程中使用Dim语句定义的局部变量称为动态变量,其生存期就是过程的调用期。(2)静态变量窗体/模块级变量和全局变量在整个程序运行期间都可以被其作用域内的过程访问,它们的生存期就是程序的运行期。还可以在过程中使用Static语句定义局部变量,这种局部变量称为静态变量。,注意:静态变量仍然是局部变量,他只能被本过程使用。定义过程时,如果在Sub之前加了Static关键字,则在过程体中所有的局部变量不管是否使用Static定义,均为静态变量。,例如编写一个验证密码程序ConstPWD=123456PrivateSubCmdOk_Click()StatictimesAsIntegerDimtxtInputAsStringtxtInput=TxtPwd.TextIftxtInputPWDThentimes=times+1MsgBox无效的密码!Iftimes=3ThenEndElseMsgBox欢迎光临本系统!times=0EndIfTxtPwd.Text=EndSub,3.7.8应用举例,1查找问题例1使用顺序查找法,在一组数中查找某给定的数x算法设计:设一组数据存放在数组a(1)-a(n)中,待查找的数据放在x中,把x与a数组中的元素从头到尾一一进行比较查找。用变量p表示a数组元素下标,p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房屋直更名合同范本
- 房屋翻建扩建协议书
- 房屋装修协议书范本
- 房屋隔断回收协议书
- 房源协议书转让合同
- 房租征收补偿协议书
- 房租还款协议书范本
- 房门锁供应合同范本
- 手写改动就业协议书
- 手袋加工合同协议书
- 2025广东河源市高新技术开发区有限公司国企职员招聘19人考试笔试备考试题及答案解析
- 第三章 指数运算与指数函数(高效培优单元测试-强化卷)数学北师大版2019必修第一册(原卷版)
- 桥梁施工关键质量控制方法与要点
- 重庆市国有企业招聘笔试题库2025
- 2025福建厦门轨道交通集团限公司(厦门地铁)社会招聘7人易考易错模拟试题(共500题)试卷后附参考答案
- 主题班会活动方案设计与实施步骤
- 统编版(2024)八年级上册历史第五单元测试卷(含答案)
- 2025年特种设备叉车作业证理论考试笔试试题(附含答案)
- 2025年南昌市消防救援支队水上大队招聘勤务及宣传勤务文员3人笔试考试参考试题及答案解析
- 2025-2026学年北师大版数学九年级上册期末考试模拟试卷
- 2025年南宁铁路机考题库及答案
评论
0/150
提交评论