【文档说明】计算机基础与VisualBasic程序设计(第三版)第九章过程课件.ppt,共(33)页,737.000 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-2502.html
以下为本文档部分文字说明:
第9章过程与函数第1页,共33页。过程的定义:在设计一个规模较大、复杂程度较高的程序时,往往根据需要按功能将程序分解成若干个相对独立的部分,然后对每个部分分别编写一段程序,这些程序段称为过程。过程是构成程序逻辑部件的基本单位,将程序分割成较小的逻辑部件可以简化程
序设计任务,结构化设计就是建立在这个思路之上。每个过程完成一个具有特定目的的任务。9.1事件过程与通用过程第2页,共33页。VB中有两类子程序过程函数内部函数(如:Sin(3.14/6))通用函数(自定义函数Function)事件过程通用过程(自
定义过程Sub)窗体事件过程(如:Form_Click())控件事件过程(如:Command1_Click())VB子程序分类图事件过程——是对发生的事件进行处理的程序段通用过程和通用函数——是由用户根据自己的需要定义和编写的、可供
事件过程多次调用的程序段它们都不直接与特定的事件相关联9.1事件过程与通用过程第3页,共33页。9.2通用过程(Sub过程)•Sub过程是指以规定语法结构组织的、可以被重复调用的、具有特定功能的、相对独立的程序段。•Sub过程不与任何特定的事件过程相关联,只能
由别的过程调用1、声明Sub过程(定义)声明Sub过程就是在窗体或标准模块的代码窗口编写一个能实现预期功能的语句块。声明Sub过程的语法格式为:[Private|Public][Static]Sub过程名([<形参列表>])[<语句块1>][ExitSub]过程体[<语句块2>]End
Sub注意:Sub过程名无值,无类型。第4页,共33页。说明:1、每个通用过程都有一个过程名(由用户自己指定,规定同变量名),同一模块中过程名不得重复。2、过程前加上Public关键字或缺省,则该过程为全局级过程,可以被应用程序的所有窗体模块或标准模块中的过程调用(在窗体中定义,调用时应加窗
体名)。3、过程前加上Private关键字,则该过程为模块级过程,只有在声明它的模块中才可以调用此过程。4、在过程名前加上Static关键字,表明该过程的变量都是静态变量。5、形参列表是传递到过程中的变量名(
多个时用“,”分隔),它指明了调用时传递给过程的参数的类型和个数.过程可以有参数,也可以不带任何参数。根据需要而定格式为:[ByVal|ByRef]变量名[()][AS数据类型][,……]ByVal表示按值传递;ByRef表示按地址传递6、过程内不能再定义过程,过程定义也不能写在事件过程内第5页,
共33页。如:SubTryout(xasinteger,yasinteger)x=x+100y=y*6Printx,yEndSub7、建立通用过程可以使用以下两种方法:①“工具”——”添加过程”②在标准模块或窗体模块中,直接输入通用过程的代码。8、子过程名不返回值,只能通过形式参数与调用语句通
信9、过程体中的ExitSub表示强制退出过程返回9.2通用过程(Sub过程)第6页,共33页。2、调用Sub过程要执行一个过程,必须调用该过程。调用的方法为:方法1.使用Call语句格式:Call过程名[(实参列表)]方法2.将过程名作为语句使用:格式:过程名<实参列表>特
点:Sub过程的调用是一句独立的语句。例:要调用前面的Tryout过程,可以使用下面两种方式:CallTryout(a,b)或Tryouta,b主过程Call过程1EndSub过程1Call过程2EndSub过程2EndSub调用的本质:转入被调用过程去执
行,完成后返回第7页,共33页。说明:1、使用Call语句调用时,参数必须放在括号内,如没有参数,括号可省略2、用过程名调用时,过程名后不能加括号,若有参数,参数与过程名间用空格隔开3、参数表:在调用语句中的参数称为实际参数(简称实参),实参可以是变量、常量、数组或表达式,参数
间用逗号隔开4、可以直接调用本模块中声明的过程或标准模块中声明的全局过程;5、当定义的过程重名时,调用过程时,过程名前应加模块名修饰;6、如果要调用窗体模块中声明的全局过程,调用时过程名前应加窗体名。第8页,共33页。Function过程与Sub过程的主要区别是:Function过程可通过函数
名返回一个值到调用的过程1、声明Function过程(函数定义)格式:[Public|Private][Static]Function函数过程名[(<参数列表>)][As<类型>][<语句块>][<函数过程名
>=<表达式>]‘返回值语句[ExitFunction]EndFunction注意:•在函数体内,函数名可以当变量名使用,函数的返回值就是通过对函数名的赋值语句来实现的。即函数值通过函数名返回。•函数体中的ExitFunction
语句的功能是强制退出函数并返回•函数过程需要返回的值的类型由As<类型>设置。9.3Function过程(自定义函数)函数体第9页,共33页。2、调用Function过程Function过程的调用,与标准函数(内部函数)相同。通常用在表达式中格式:函数名(<实参
列表>)特点:不能独立成为语句,必须参加表达式的运算。如1:下面是已知直角三角形两直角边的值,计算斜边的函数。functionmyfun(Aasinteger,Basinteger)asstringmyfun=sqr(A*A+B*B)EndfunctionSubCommand1_Cli
ck()a=val(text1.text):b=val(text2.text)label1.caption=myfun(a,b)EndSub第10页,共33页。例2:将前面的两个Sub过程改为Function过程。PrivateFunctiontri
area(xAsDouble,yAsDouble,zAsDouble)DimsAsDoubles=(x+y+z)/2triarea=Sqr((s-x)*(s-y)*(s-z)*s)EndFunctionPrivateSubCommand
1_Click()Dima#,b#,c#,s#,intYesorNo%a=Val(Text1.Text):b=Val(Text2.Text)c=Val(Text3.Text)Ifa+b>cAndb+c>aAndc+a>bThen
Print"面积=";triarea(a,b,c)ElseintYesorNo=suberr()‘无参数时,括号不能省略EndIfEndSub第11页,共33页。9.4参数传递不同模块(过程)之间数据的传递方式:通过全局变量实现各过程中共享数据(即在“通
用”部份定义的变量,由该模块所有过程共享)通过过程调用实参与形参的结合实现按值传递(单向传递)按地址传递(双向传递)第12页,共33页。Sub过程和Function函数过程中的<参数列表>中的参数称为形式参数(形参),在程序中调用Sub过程和Function
函数过程时<参数列表>中称为实际参数(实参)。•在调用过程时,就是把“实参”依次按位置传递给被调用过程的“形参”,然后执行被调用过程中的语句。参数传递时相当于给变量赋初值。•如:Printgreatcd(x,y)PublicFunctiongreatcd(mAsI
nteger,nAsInteger)•参数传递有两种模式:按值传递与按址传递9.4参数传递第13页,共33页。•按值传递就是将实参的值传送给被调用过程中的形参。即:系统把实参复制一份传送给形参。这样,被调用的过程如果改变了形参的值,也不会改变实参的值。•在VB中,传值方
式的标志为:在形参前加上ByVal。•这种传递方式是一种单向的数据传递,即调用时只能由实参的值传递给形参,调用结束不能由形参将操作结果返回给实参。实参可以是常数、变量或表达式。1、按值传递第14页,共33页。例:写出下列程序的运行结果Subtryout(ByValxasin
teger,ByValyasinteger)x=x+100y=y*6print“x=“;x.”y=“;yEndSubSubForm_click()Dima%,b%a=10:b=20tryouta,bPrint“a
=“;a,”b=“;bEndSub传值:X=110y=120a=10b=20第15页,共33页。2、按址传递——变量的引用•传址方式是将实参在内存的地址传递给形参,也就是实参、形参公用内存的“地址”。•在VB中,按址传
递数据是在形参前加上ByRef(默认方式)。•这种传递方式是一种双向的数据传递,即调用时实参将值传递给形参;调用结束由形参将操作结果返回给实参。当用传址方式时,实参只能是变量、数组名,不能是常数、表达式。•修改前例题ByValByR
ef再写其运行结果第16页,共33页。Subtryout(ByRefxasinteger,ByRefyasinteger)x=x+100y=y*6print“x=“;x.”y=“;yEndSubSubForm
_click()Dima%,b%a=10:b=20tryouta,bPrint“a=“;a,”b=“;bEndSub传址:X=110y=120a=110b=120第17页,共33页。3、数组作过程的参数V
isualBasic允许把数组作为实参传送到过程中。数组作参数是通过传地址方式传送。在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点:1.为了把一个数组的全部元素传送给一个过程,应将数组名分别写入形参表中,并略去数组的上下界,但括号不能省略。PrivateSub
Sort(a()Assingle)……EndSub其中形参“a()”即为数组。第18页,共33页。2.被调过程可通过Lbound和Ubound函数确定实参数组的上、下界。3.当用数组作形参时,对应的实参必须也是数组,且类型一致。4.实参和形参结合是按地址传递,即形参
数组和实参数组共用一段内存单元。例如:定义了实参数组b(1to8),给它们赋了值,调用Sort()函数过程的形式如下:Sortb()或CallSort(b())实参数组后面的括号可以省略,但为便于阅读,建议一般不要省略
为好。3、数组作过程的参数第19页,共33页。调用时形参数组a和实参数组b虚实结合,共用一段内存单元,如图6-7所示。因此在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、数组作过程的参数第20页,共33页。可选参数和可变参数1、可选
参数在过程的形参列表中加入Optional关键字,就可以指定过程的参数为可选的。如果指定了可选参数,则参数表中此参数后面的其它参数也必是可选的,并且要用Optional关键字来声明。例6:求两个数的和的函数过程。lt6.vbp函
数过程:PublicFunctionmysum(firstAsInteger,secondAsLong,Optionalthird)mysum=first+secondIfNotIsMissing(third)Thenmysum=mysum+thirdEndFunctio
n第21页,共33页。事件过程:PrivateSubCommand1_Click()DimaAsInteger,bAsLong,cAsDoubleDimsumAsIntegera=10:b=20Sum=mysum(a,b)Print"sum=";Suma=10:
b=20:c=30Sum=mysum(a,b,c)Print"sum=";SumEndSub•IsMissing()——检测可选参数是否被省略第22页,共33页。2、不定数量的参数(可变参数)一般说来,过程调用中
的参数个数应等于过程说明的参数个数。在传递参数时,如果要求参数的数目可以变化,则在函数过程或Sub过程的形参前可加ParamArray关键字(不能与ByValByDef…连用)指明。格式如下:Sub过程名([其他参数
,]ParamArray<数组名>())第23页,共33页。PrivateSubCommand1_Click()Dims(),a%,bAsLong,cAsVariant,dAsDoubles=Array(1,2,3,4,5)Print"sum=";multisum(s(0),s(2),s(
4))a=1000:b=10000:c=100:d=10Print"sum=";multisum(a,b,c,d)EndSubPublicFunctionmultisum(ParamArrayp())Dimint1%,sumasvar
iantForint1=LBound(p)ToUBound(p)sum=sum+p(int1)Nextmultisum=sumEndSub第24页,共33页。9.4.4对象参数•窗体参数–形参定义格式:形参名Asform–调用时实参:
必须为某个窗体名称•控件参数:–形参定义格式:形参名AsControl–调用时实参:可为任意一个控件对象第25页,共33页。变量的作用域•根据变量的作用域,变量分为局部(过程级)变量、窗体/模块变量和全局变量•局部变量–在过程中用Di
m/static语句定义,只存在于过程中–用Dim定义的变量称为动态变量,生存期为过程的一次调用.–用Static定义的变量称为静态变量,生存期为整个应用程序的执行期间(重点掌握,举例)•窗体/模块变量–Dim语句或Private语句定义,模块中的所有过程都可使用•全局变量–Public语句定
义,可以在所有模块中使用9.5变量与过程的作用范围第26页,共33页。PrivateSubForm_Click()DimaccAsInteger,iAsIntegeracc=0Fori=1To3acc=acc+funa(i)NextiPrintaccEndSubPrivateFuncti
onfuna(xAsInteger)AsIntegerStaticsAsIntegers=s+xfuna=sEndFunction运行时单击窗体,程序输出结果为:第27页,共33页。能能变量名前加窗体名不能不能被其他模块存取能能不能被本模块的其他过程存取通用声明通用声明过程
中声明位置PublicDimPrivateDimStatic声明方式标准模块窗体全局变量窗体/模块级变量局部变量作用范围不同作用范围的三种变量声明及使用规则第28页,共33页。不同作用范围的二种过程定义及调用规则能但过程名必须唯一,否则要加标准模块名能但必须在过程名前加窗体名不能不能能否被本应用
程序其他模块调用能能能能能否被本模块其他过程调用Public缺省Private定义方式标准模块窗体标准模块窗体全局级模块级作用范围根据过程的作用域,过程分为窗体/模块级和全局级。第29页,共33页。9.7过程的嵌套和递归1、过程的嵌套
在程序中调用一子过程,而在子过程中又调用另外的子过程,这种程序结构称为过程的嵌套。过程的嵌套调用执行过程如下图:第30页,共33页。2、过程的递归调用用自身的结构来描述自身,称递归。例如,对阶乘的定义:)!2()1()!1()!1(!−−=−−=nnnnnnVisualBasic允
许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function函数。直接调用自己称为直接递归调用间接调用自己称为间接递归调用9.7过程的嵌套和递归调用第31页,共33页
。PrivateFunctionfac(nAsInteger)AsIntegerIfn=1Thenfac=1Elsefac=n*fac(n-1)EndIfEndFunctionPrivateSubForm_Click
()Print“fac(4)=”;fac(4)EndSub程序的递归过程:第32页,共33页。说明:➢递归处理分递推和回归两个过程,如上图所示。➢当一个大问题能够分解成同类型的小问题,且问题规模在逐渐减小,才适合用递归解决.➢使用递归算法必须要满足以下的递归条件:(1)存在递归
结束条件及结束时的值;(2)能用递归形式表示,且递归向终止条件发展。第33页,共33页。