《子过程和函数过程讲稿.ppt》由会员分享,可在线阅读,更多相关《子过程和函数过程讲稿.ppt(71页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、子过程和函数过程第一页,讲稿共七十一页哦本章内容及要求8.1 Sub过程的定义和调用8.2 Function函数过程的定义和调用8.3 参数传递8.4 过程的嵌套和递归调用8.5 变量及过程的作用域第二页,讲稿共七十一页哦(1)窗体事件过程)窗体事件过程Private Sub Form_事件名事件名(参数列表参数列表)语句组语句组End Sub(2)控件事件过程)控件事件过程PrivateSub控件名控件名_事件名事件名(参数列表参数列表)语句组语句组 End Sub8.1.1事件事件Sub过程过程8.1Sub子过程的定义和调用子过程的定义和调用在在VB中中Sub子过程分为:事件过程和用户自定
2、义过程子过程分为:事件过程和用户自定义过程第三页,讲稿共七十一页哦方方法法一一:通通过过“工工具具”菜菜单单中中的的“添添加加过过程程”命命令令,出出现现“添添加加过过程程”对对话话框框,选选择择过过程程类类型型(子子过过程程、函函数数、属属性性、事事件件)及及作作用用范范围围(公公有有的的Public、私私有有的的Private),单单击击确确定定后后得得到到一一个个过过程程定定义义的的结结构框架(模板),如:构框架(模板),如:Sub子过程的定义子过程的定义-两种方法两种方法8.1.2用户自定义用户自定义Sub子过程定义子过程定义PublicSubSort()EndSub第四页,讲稿共七十
3、一页哦Public|PrivateStatic Sub 子过程名子过程名(形参表形参表)语句组语句组 Exit Sub 语句组语句组End Sub方法二:方法二:直接在代码窗口中输入直接在代码窗口中输入过程体过程体第五页,讲稿共七十一页哦例例1:编一个交换两个整型变量值的子过程。编一个交换两个整型变量值的子过程。Private Sub Swap(X As Integer,Y As Integer)Dim temp As Integer Temp=X X=Y Y=TempEnd Sub第六页,讲稿共七十一页哦例例2:编写求阶乘的子过程。:编写求阶乘的子过程。Privatesubfact(nAsI
4、nteger,fasDouble)DimiAsIntegerf=1Fori=1Tonf=f*iNextEndsub第七页,讲稿共七十一页哦。说明:说明:(1)子过程名:子过程名:命名规则与变量名规则相同。子过程命名规则与变量名规则相同。子过程名不名不返回值,而是返回值,而是通过形参与实参的传递得到结果,调用时可返回多个值通过形参与实参的传递得到结果,调用时可返回多个值(2)形形式式参参数数列列表表:形形式式参参数数通通常常简简称称“形形参参”,仅仅表表示示形形参参的的类类型型、个个数数、位位置置,定定义义时时是是无无值值的的,只只有有在在过过程程被被调调用用时时,虚虚实实参参结结合合后后才才获
5、获得得相相应应的值。的值。(3)过程可以无形式参数,但括号不能省。过程可以无形式参数,但括号不能省。(4)参数的定义形式:参数的定义形式:ByValByRef变量名变量名()As 类型类型,ByVal表示当该过程被调用时,参数是按值传递的;表示当该过程被调用时,参数是按值传递的;ByRef表示当该过程被调用时,参数是按地址传递的表示当该过程被调用时,参数是按地址传递的,缺省时传址。缺省时传址。第八页,讲稿共七十一页哦方法一:方法一:Call子过程名子过程名(参数列表参数列表)方法二:子过程名方法二:子过程名参数列表参数列表说明:说明:(1)参数列表参数列表称为实参或实元,它必须与形参保持个数相
6、同,称为实参或实元,它必须与形参保持个数相同,位置与类位置与类型一一对应型一一对应。(2)调用时把调用时把实参实参值传递给对应的值传递给对应的形参形参。其中值传递(形参前有其中值传递(形参前有ByVal说明)时实参的值不随形参的值变化而改变。说明)时实参的值不随形参的值变化而改变。而地址传递时实参的值随形参值的改变而改变。而地址传递时实参的值随形参值的改变而改变。8.1.3子过程的调用子过程的调用第九页,讲稿共七十一页哦(3)当参数是数组时,形参与实参在参数声明时应省略其维数,当参数是数组时,形参与实参在参数声明时应省略其维数,但但括号不能省括号不能省。(4)调用子过程的形式有两种,用调用子过
7、程的形式有两种,用Call关键字时,实参必须加圆括关键字时,实参必须加圆括号括起号括起,反之则不用,反之则不用加圆括号括起。加圆括号括起。实参之间用实参之间用“,”分隔。分隔。例:调用上面定义的例:调用上面定义的Swap子过程的形式:子过程的形式:Swap a,b Call Swap(a,b)在某个事件过程中调用已定义的阶乘在某个事件过程中调用已定义的阶乘的过程的过程fact:PrivateSubCommand1_Click()DimnAsInteger,mAsLongn=5Callfact(n,m)PrintmEndSub第十页,讲稿共七十一页哦PrivateSubCmdOK_click()
8、CallSwap(a,b)Swapa,bEndSubPrivateSubSwap(x%,y%)Dimtemp%Temp=XX=YY=TempEndSub过程调用的执行过程:过程调用的执行过程:第十一页,讲稿共七十一页哦 VisualBasic函数分为函数分为内部函数内部函数和和外部(自定义)外部(自定义)函数函数,外部函数是用户根据需要用,外部函数是用户根据需要用Function关键字定关键字定义的函数过程,义的函数过程,与子过程不同的是函数名将返回一个与子过程不同的是函数名将返回一个值值。8.2Function函数过程的定义和调用函数过程的定义和调用第十二页,讲稿共七十一页哦方方法法一一:通
9、通过过“工工具具”菜菜单单中中的的“添添加加过过程程”命命令令,出出现现“添添加加过过程程”对对话话框框,选选择择过过程程类类型型(子子过过程程、函函数数、属属性性、事事件件)及及作作用用范范围围(公公有有的的Public、私有的私有的Private),单击确定后得到一个函数定义的结构框架(模板),如:),单击确定后得到一个函数定义的结构框架(模板),如:PublicFunctionSort()EndFunction8.2.1Function函数过程的定义函数过程的定义Function函数过程过程的定义函数过程过程的定义-两种方法两种方法第十三页,讲稿共七十一页哦Public|PrivateS
10、taticFunction函数名函数名()As函数名函数名=返回值返回值ExitFunction函数名函数名=返回值返回值EndFunction方法二:方法二:直接在代码窗口中输入直接在代码窗口中输入函数体函数体第十四页,讲稿共七十一页哦Functionfact(nAsInteger)AsDoubleDimiAsInteger,fAsDoublef=1Fori=1Tonf=f*iNextfact=fEndFunction把例把例2阶乘的阶乘的sub子过程改为子过程改为Function函数过程函数过程第十五页,讲稿共七十一页哦说明:说明:(1)函函数数名名:命命名名规规则则与与变变量量名名规规则
11、则相相同同。但但不不能能与与系系统统的的内内部部函函数数或或其其它它通通用用子子过过程程同同名名,也也不不能能与与已已定定义义的的全全局局变变量量和和本本模模块块中模块级变量同名。中模块级变量同名。(2)在在函函数数体体内内,函函数数名名可可以以当当变变量量使使用用,函函数数的的返返回回值值就就是是通通过过对对函函数数名名的的赋赋值值语语句句来来实实现现的的,在在函函数数过过程程中中至至少少要要对对函函数数名名赋赋值值一一次。次。(3)AS类类型型:是是指指函函数数返返回回值值的的类类型型,若若省省略略,则则函函数数返返回回变变体体类型值(类型值(Variant)。)。(4)ExitFunct
12、ion:表表示示退退出出函函数数过过程程,常常常常是是与与选选择择结结构构(If或或SelectCase语句)联用,即当满足一定条件时,退出函数过程。语句)联用,即当满足一定条件时,退出函数过程。(5)形参数列表形参数列表:形参的定义与子过程完全相同。:形参的定义与子过程完全相同。第十六页,讲稿共七十一页哦调用形式如下:调用形式如下:函数名(实参列表)函数名(实参列表)说说明明:在在调调用用时时实实参参和和形形参参的的数数据据类类型型、顺顺序序、个个数数必必须须匹匹配配。函函数数调用只能出现调用只能出现在表达式中在表达式中,其,其功能功能是求得函数的是求得函数的返回值返回值。8.2.2函数过程
13、的调用函数过程的调用调用阶乘的过程调用阶乘的过程:Private Sub Command1_Click()Dim S As Integer S=5 Print fact(S)End Sub第十七页,讲稿共七十一页哦2009-03-29以下关于过程及过程参数的描述中,错误的是以下关于过程及过程参数的描述中,错误的是A)过程的参数可以是控件名称)过程的参数可以是控件名称B)调用过程时使用的实参的个数应与过程形参的个数相同)调用过程时使用的实参的个数应与过程形参的个数相同C)只有函数过程能够将过程中处理的信息返回到调用程中)只有函数过程能够将过程中处理的信息返回到调用程中D)窗体可以作为过程的参数)
14、窗体可以作为过程的参数课堂练习课堂练习2010-03-22下面是求最大公约数的函数的首部下面是求最大公约数的函数的首部Functiongcd(ByValxAsInteger,ByValyAsInteger)AsInteger若要输出若要输出8、12、16这这3个数的最大公约数,下面正确的语句是个数的最大公约数,下面正确的语句是A)Printgcd(8,12),gcd(12,16),gcd(16,8)B)Printgcd(8,12,16)C)Printgcd(8),gcd(12),gcd(16)D)Printgcd(8,gcd(12,16)第十八页,讲稿共七十一页哦VisualBasic中不同模
15、块(过程)之间数据的传递有两种方式:中不同模块(过程)之间数据的传递有两种方式:通过过程调用实参与形参的结合实现;通过过程调用实参与形参的结合实现;使用全局变量来实现各过程中共享数据。使用全局变量来实现各过程中共享数据。1、形式参数、形式参数 是指在是指在定义定义子过程和函数时,出现在子过程和函数时,出现在Sub过程名或过程名或Function函数名函数名后面括号内的变量后面括号内的变量,是用来接收传送给是用来接收传送给Sub过程或过程或Function的数据的数据,形,形参表中的各个变量之间用逗号分隔。参表中的各个变量之间用逗号分隔。8.3参数传递参数传递8.3.1形式参数与实际参数形式参数
16、与实际参数第十九页,讲稿共七十一页哦2、实际参数、实际参数实实际际参参数数是是指指在在调调用用Sub或或Function时时,出出现现在在子子过过程程名名或或函函数数名名后后括括号号内内的的参参数数,其其作作用用是是将将它它们们的的数数据据(数数值值或或地地址址)传传送送给给Sub或或Function过程与其对应的形参变量。过程与其对应的形参变量。实实参参可可由由常常量量、表表达达式式、有有效效的的变变量量名名、数数组组名名(如如A())组组成成,实参表中各参数用实参表中各参数用逗号分隔逗号分隔。参数传递指参数传递指主调主调过程的实参(调用时过程的实参(调用时已有确定值和内存地址的参数已有确定
17、值和内存地址的参数)传递给传递给被调被调过程的形参。过程的形参。参数的传递有两种方式:参数的传递有两种方式:按值传递、按地址传递按值传递、按地址传递。形参前加形参前加“ByVal”关键字的是按关键字的是按值传递值传递,缺省缺省或加或加“ByRef”关键字关键字则按则按地址传递地址传递。8.3.2传地址与传值传地址与传值第二十页,讲稿共七十一页哦传址:传址:形参得到的是实参的形参得到的是实参的地址地址,当形参值的改变同时也改变实参,当形参值的改变同时也改变实参的值。因为它们共用一个地址。的值。因为它们共用一个地址。传值:传值:形参只得到的是实参的形参只得到的是实参的值值,形参值的改变不会影响实参
18、的值。因,形参值的改变不会影响实参的值。因为形参并不知道实参的地址。为形参并不知道实参的地址。SubSwap2(x%,y%)DimTemp%Temp=x:x=y:y=TempEndSubSubSwap1(ByValx%,ByValy%)DimTemp%Temp=x:x=y:y=TempEndSub什么是传址和传值呢?什么是传址和传值呢?传值传值传址传址传值传值第二十一页,讲稿共七十一页哦PrivateSubCmdOK_Click()Dima%,b%a=10:b=20Swap1a,b传传值值PrintA1=;a,B1=;ba=10:b=20Swap2a,b传地址传地址PrintA2=;a,B2=
19、;bEndSubSubSwap2(x%,y%)DimTemp%Temp=x:x=y:y=TempEndSubSubSwap1(ByValx%,ByValy%)DimTemp%Temp=x:x=y:y=TempEndSub第二十二页,讲稿共七十一页哦值传递的执行过程如下图:值传递的执行过程如下图:第二十三页,讲稿共七十一页哦通过地址传递数据的执行过程通过地址传递数据的执行过程第二十四页,讲稿共七十一页哦 在在子子过过程程和和函函数数过过程程调调用用时时,如如果果实实参参是是常常量量(包包括括系系统统常常量量、用用Const自自定定义义的的符符号号常常量量)或或表表达达式式,无无论论在在定定义义时
20、时使使用用值值传传递递还还是是地地址址传传递递,此此时时都都是是按按值值传递方式将常量或表达式计算的传递方式将常量或表达式计算的值传递给形参变量值传递给形参变量。如果形参定义是按传地址方式,但调用时想使实参变量如果形参定义是按传地址方式,但调用时想使实参变量按值方式传递,按值方式传递,可以把实参变量加上括号,可以把实参变量加上括号,将其转换成表达将其转换成表达式即可。式即可。8.3.3有关过程之间数据传递的几点说明有关过程之间数据传递的几点说明第二十五页,讲稿共七十一页哦 解解决决一一个个问问题题既既可可以以使使用用子子过过程程,也也可可以以使使用用函函数数过过程程,是使用子过程还是使用函数过
21、程呢?是使用子过程还是使用函数过程呢?如如果果是是需需要要求求得得一一个个值值,一一般般情情况况使使用用函函数数过过程程,如如不不是是为为了了求求一一个个值值,而而是是完完成成一一些些操操作作,或或需需要要返返回回多多个个值值,则则使用子过程比较方便使用子过程比较方便。使用子过程还是使用函数过程使用子过程还是使用函数过程?第二十六页,讲稿共七十一页哦 VisualBasic中中数数组组作作参参数数是是通通过过传传地地址址方方式式传传送送。在在传传送送数数组组时时,除遵守参数传送的一般规则外,还应注意以下几点:除遵守参数传送的一般规则外,还应注意以下几点:1为为了了把把一一个个数数组组的的全全部
22、部元元素素传传送送给给一一个个过过程程,应应将将数数组组名名写入形参表中,并写入形参表中,并略略去数组的上下界,但去数组的上下界,但括号不能省略。括号不能省略。Private Sub Sort(a()As single)End Sub其中形参其中形参“a()”即为数组。即为数组。8.3.4数组作为过程的参数数组作为过程的参数第二十七页,讲稿共七十一页哦2被调过程可通过被调过程可通过Lbound和和Ubound函数确定实参数组的上、下界。函数确定实参数组的上、下界。3当用数组作形参时,对应的实参必须也是数组,且类型一致。当用数组作形参时,对应的实参必须也是数组,且类型一致。4实实参参和和形形参参
23、结结合合是是按按地地址址传传递递,即即形形参参数数组组和和实实参参数数组组共共用用一一段段内内存单元。存单元。例例如如:定定义义了了实实参参数数组组b(1to8),给给它它们们赋赋了了值值,调调用用Sort()函函数数过过程的形式如下:程的形式如下:Sortb()或或CallSort(b()实参数组后面的括号可以省略实参数组后面的括号可以省略,但为便于阅读,但为便于阅读,建议建议一般不要省略为一般不要省略为好。好。第二十八页,讲稿共七十一页哦课堂练习课堂练习第二十九页,讲稿共七十一页哦FunctionFirProc(zAsInteger,yAsInteger,zAsInteger)FirPro
24、c2x+y+3zEndFunctionFunctionSecProc(xAsInteger,yAsInteger,zAsInteger)SecProcFirProc(x,y,z)+xEndFunctionPrivateSubCommand1_Click()()DimaAsInteger,bAsInteger,cAsIntegera2:b3:c4PrintSecProc(c,b,a)EndSubA)21B)19C)17D)34课堂练习课堂练习第三十页,讲稿共七十一页哦2010-9-22以下关于局部变量的叙述中错误的是以下关于局部变量的叙述中错误的是A)在过程中用)在过程中用Dim语句或语句或St
25、atic语句声明的变量是局部变量语句声明的变量是局部变量B)局部变量的作用域是它所在的过程)局部变量的作用域是它所在的过程C)在过程中用)在过程中用Static语句声明的变量是静态局部变量语句声明的变量是静态局部变量D)过程执行完毕,该过程中用)过程执行完毕,该过程中用Dim或或Static语句声明的变量语句声明的变量即被释放即被释放课堂练习课堂练习第三十一页,讲稿共七十一页哦下列程序的输出结果是下列程序的输出结果是10110。PrivateSubsub1(ByValaAsInteger,bAsInteger)a=a+b:b=b+aEndSubPrivateSubForm_Click()Dim
26、xAsInteger,yAsIntegerx=10:y=20Callsub1(x,y)sub1x,yPrintx;yEndSub第三十二页,讲稿共七十一页哦过程的嵌套:类似选择结构和循环结构的嵌套。也就是指一个过程的嵌套:类似选择结构和循环结构的嵌套。也就是指一个过程中包含了另一个过程的调用。过程中包含了另一个过程的调用。8.4.1过程的嵌套过程的嵌套8.4过程的嵌套和递归调用过程的嵌套和递归调用Subform_click()Callsub1EndsubSubsub1Y=F1(n)EndsubFunctionF1(x)F1=.EndFunction第三十三页,讲稿共七十一页哦过程的递归:简单说
27、就是自己调用自己。过程的递归:简单说就是自己调用自己。8.4.2过程的递归过程的递归Functionfact(n%)AsDoubleDimiAsInteger,fAsDoublef=1Fori=1Tonf=f*iNextfact=fEndFunctionFunctionfact(n%)AsDoubleIfn=1thenfact=1elsefact=n*fact(n-1)EndFunction用递归实现用递归实现阶乘阶乘不用递归实现不用递归实现阶乘阶乘第三十四页,讲稿共七十一页哦Functionfact(n%)AsDoubleIfn=1thenfact=1elsefact=n*fact(n-1)
28、EndFunction现在假现在假N=4,观察观察执行过程执行过程Fact(4)=4*fact(3)Fact(3)=3*fact(2)Fact(2)=2*fact(1)Fact(1)=1Fact(2)=2*1Fact(3)=3*2Fact(4)=4*6第三十五页,讲稿共七十一页哦注意VB语言语言不不允许过程的允许过程的嵌套定义嵌套定义,即一个过程内不能包含另,即一个过程内不能包含另一个过程一个过程.VB语言语言允许允许过程的过程的嵌套调用嵌套调用,即在调用一个过程的过程中,即在调用一个过程的过程中,又调用另一个过程又调用另一个过程.第三十六页,讲稿共七十一页哦窗体模块:文件扩展名为窗体模块:文
29、件扩展名为.frm窗窗体体模模块块是是VB程程序序的的基基础础,与与窗窗体体对对应应,存存放放着着该该窗窗体体的的所所有有信信息息,如如窗窗体体及及其其上上各各控控件件对对象象的的界界面面信信息息、属属性性、事事件件过过程、通用过程、变量和常量的声明等。程、通用过程、变量和常量的声明等。可以通过记事本打开查看。可以通过记事本打开查看。8.5.1窗体模块和标准模块窗体模块和标准模块8.5变量及过程的作用域变量及过程的作用域第三十七页,讲稿共七十一页哦标准模块:标准模块:文件扩展名为文件扩展名为Bas它们可以包含变量、常数、类型、外部过程和全局过程的它们可以包含变量、常数、类型、外部过程和全局过程
30、的全局全局(在整个应用程序范围内有效的在整个应用程序范围内有效的)声明或模块级声明。写声明或模块级声明。写入标准模块的代码不必绑在特定的应用程序上,则在许多入标准模块的代码不必绑在特定的应用程序上,则在许多不同的应用程序中可以重用标准模块。不同的应用程序中可以重用标准模块。当当一一个个过过程程要要被被多多个个不不同同对对象象或或不不同同模模块块中中的的程程序序调调用时,那么该过程一般可放在标准模块中。用时,那么该过程一般可放在标准模块中。第三十八页,讲稿共七十一页哦 在在VB中中,由由于于可可以以在在过过程程中中和和模模块块中中声声明明变变量量,根根据据定定义义变变量量的的位位置置和和定定义义
31、变变量量的的语语句句不不同同,变变量量可以分为:可以分为:局部变量(过程级变量)局部变量(过程级变量)窗窗体体/模模块块级级变变量量(私私有有的的模模块块级级变变量量,能能被被本本模模块块的所有过程和函数使用)的所有过程和函数使用)全局级变量(公有的模块级变量)。全局级变量(公有的模块级变量)。8.5.2变量的作用域变量的作用域第三十九页,讲稿共七十一页哦关于变量的生存期关于变量的生存期变量的生存期:变量的生存期:是指变量的值能够保留多长时间,即分是指变量的值能够保留多长时间,即分配给变量的存储空间能够被保留多长时间。配给变量的存储空间能够被保留多长时间。1、局部变量局部变量Dim声明的局部变
32、量在本过程执行期间有效声明的局部变量在本过程执行期间有效Static声明的局部变量在整个应用程序运行期间有效声明的局部变量在整个应用程序运行期间有效2、模块变量模块变量在整个应用程序运行期间有效在整个应用程序运行期间有效3、全局变量、全局变量在整个应用程序运行期间有效在整个应用程序运行期间有效第四十页,讲稿共七十一页哦局部变量:局部变量:在在过程内过程内声明的变量,声明的变量,只能只能在本过程中使用。在本过程中使用。在过程内部使用在过程内部使用Dim或者或者Static关键字来声明的变关键字来声明的变量,量,只在声明它们的过程中只在声明它们的过程中才能被访问或改变该变量的值,才能被访问或改变该
33、变量的值,别的过程不可访问。所以可以在不同的过程中声明相同名字的别的过程不可访问。所以可以在不同的过程中声明相同名字的局部变量而互不影响。局部变量而互不影响。8.5.2.1局部变量局部变量过程级变量过程级变量第四十一页,讲稿共七十一页哦例:例:PrivateSubForm_Load()Dimn%n=10EndSubPrivateSubFrom_Click()Dimn%Print“n=“;nEndSub程序运行后单击窗体,其输出结果是什么?程序运行后单击窗体,其输出结果是什么?局部变量局部变量局部变量局部变量第四十二页,讲稿共七十一页哦窗窗体体/模模块块级级变变量量:在在“通通用用声声明明”段段
34、中中用用Dim语语句句或或用用Private语语句句声声明明的的变变量量,可可被被本本窗窗体体/模模块块的的任任何何过过程程访访问问。但但其其他他模模块块却却不不能能访访问问该该变变量。量。例如:在例如:在“通用声明通用声明”段声明如下变量段声明如下变量PrivatesAsStringDimaAsInteger,bAsSingle8.5.2.2窗体模块级变量窗体模块级变量第四十三页,讲稿共七十一页哦 全全局局变变量量也也称称公公有有的的模模块块级级变变量量,在在窗窗体体模模块块或或标标准准模模块块的的顶顶部部的的“通通用用”声声明明段段用用Public关关键键字字声声明明,它它的的作作用用范范
35、围围是是整整个个应应用用程程序序,即即可可被被本本应应用用程程序序的的任任何何过过程程或或函函数访问。数访问。例如:例如:PublicaAsInteger,bAssingle8.5.2.3全局级变量全局级变量第四十四页,讲稿共七十一页哦3种变量声明及使用规则如下表:种变量声明及使用规则如下表:第四十五页,讲稿共七十一页哦全局变量与局部变量同名全局变量与局部变量同名在不同过程中定义同名变量,它们互不影响,但若在一过程中定在不同过程中定义同名变量,它们互不影响,但若在一过程中定义使用了与全局变量义使用了与全局变量同名同名的变量,则就应注意。的变量,则就应注意。注意:注意:当变量名相同而作用域不同时
36、,将优先访问作用域当变量名相同而作用域不同时,将优先访问作用域小小的变量。的变量。8.5.2.4关于多个变量同名关于多个变量同名小第四十六页,讲稿共七十一页哦Public x As Integer 定义全局变量定义全局变量Private Sub Form_Load()x=1 将全局变量将全局变量x 的值设置成的值设置成 1End SubPrivate Sub Command1_Click()Dim x As Integer 定义局部变量定义局部变量 x=2 将局部变量将局部变量x的值设置成的值设置成 2 Print“x=;x Print“x=;Form1.xEnd SubPrivate Sub
37、 Command2_Click()Print“x=;x End Sub窗体将输出什么?窗体将输出什么?第四十七页,讲稿共七十一页哦全局变量与全局变量同名全局变量与全局变量同名 如如果果不不同同模模块块中中的的全全局局变变量量使使用用同同一一名名字字,则则通通过过同同时时引引用用模模块块名名和和变变量量名名就就可可以以在在代代码码中中区区分分它它们们。例例如如,如如果果有有一一个个在在 Form1 和和 Module1 中中都都声声明明了了公公用用的的 Integer 变变量量 X,则则把把它它们们作作为为 Module1.X 和和Form1.X 来来引引用用便便得得到到正正确确值值。也也就就是
38、是说说如如果果不不同同模模块块中中的的全全局局变变量量使使用用同同一一名名字字,引引用用时时就就需需要要使使用用“模模块块名名.变量名变量名”的形式来区分它们。的形式来区分它们。第四十八页,讲稿共七十一页哦每次调用过程时每次调用过程时重新分配重新分配存贮单元,存贮单元,初始化初始化变量变量过程调用过程调用结束结束后后释放释放存贮单元,变量内容自动存贮单元,变量内容自动消失消失动态变量与静态变量动态变量与静态变量动态变量动态变量第一次第一次调用过程时调用过程时分配分配存贮单元,存贮单元,初始化初始化变量变量以后以后每次调用过程时每次调用过程时不再不再重新分配存贮单元,变量重新分配存贮单元,变量保
39、持上保持上次次调用结束时的值调用结束时的值过程名前加过程名前加Static,表示该过程内的局部变量都是静态,表示该过程内的局部变量都是静态变量变量静态变量静态变量(由由static定义)定义)第四十九页,讲稿共七十一页哦Public|Private Sub 子过程名子过程名(形式参数列表形式参数列表)EndSubSub过过程程和和Function函函数数既既可可写写在在窗窗体体模模块块中中也也可可写写在在标标准准模模块块中中,在在定定义义时时可可选选用用关关键键字字PrivatePrivate(局局部部)和和PublicPublic(全全局局),来来决决定定它们能被调用的范围。它们能被调用的范
40、围。8.5.3过程与函数的作用域过程与函数的作用域第五十页,讲稿共七十一页哦1、窗体窗体/模块级过程:模块级过程:加加Private关键字的过程,只能被定义的窗体或模块中的过程调用。关键字的过程,只能被定义的窗体或模块中的过程调用。2、全局级过程:全局级过程:加加Public关键字关键字(或缺省)(或缺省)的过程,可供的过程,可供该应用程序该应用程序的的所有所有窗窗体和所有标准模块中的过程调用。体和所有标准模块中的过程调用。按过程的作用范围来划分,过程可分为:按过程的作用范围来划分,过程可分为:模块级过程模块级过程全局级过程全局级过程第五十一页,讲稿共七十一页哦总结归纳过程的定义及作用域如下表
41、总结归纳过程的定义及作用域如下表第五十二页,讲稿共七十一页哦第五十三页,讲稿共七十一页哦8.7过程的嵌套和递归调用过程的嵌套和递归调用8.7.1过程的嵌套过程的嵌套 在程序中调用一子过程,而在子过程中又调用另外的子过程,这种程序结构称为过程的嵌套。过程的嵌套调用执行过程如下图:第五十四页,讲稿共七十一页哦8.7.2过程的递归调用过程的递归调用用自身的结构来描述自身,称递归。例如,对阶乘的定义:Visual Basic允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function函数。例例编求阶乘fac(n)=n!的递归函数第五十五页,讲稿共七十一页哦P
42、rivate Function fac(n As Integer)As Integer If n=1 Then fac=1 Else fac=n*fac(n-1)End IfEnd FunctionPrivate Sub Form_Click()Print“fac(4)=”;fac(4)End Sub程序的递归过程:程序的递归过程:第五十六页,讲稿共七十一页哦说明:说明:递归处理一般用栈来实现,分递推和回归两个过程,如上图所示。递推过程:每调用一次自身,把当前参数(形参、局部变量、返回地址等)压入栈,直到递归结束条件成立。回归过程:然后从栈中弹出当前参数,直到栈空。递归算法设计简单,解决同一问
43、题,使用递归算法消耗的机时和占据的内存空间要比使用非递归算法大。使用递归算法必须要满足以下的递归条件:使用递归算法必须要满足以下的递归条件:(1)存在递归结束条件及结束时的值;(2)能用递归形式表示,且递归向终止条件发展。第五十七页,讲稿共七十一页哦*8.8过程的可选参数与不定数量参数过程的可选参数与不定数量参数8.8.1可选参数(可选参数(Optional)概念:概念:当然用户在自定义子过程或函数时也可以定义可选参数。要指定某个形参为可选参数,这就是在形参变量前加入Optional关键字即可。如果一个过程某个形参为可选参数,则在调用此过程时可以不提供对应于这个形参的实参,若一个过程有多个形参
44、,当它的一个形参被设定为可选参数,则这个参数之后面的其它参数也必是可选的,并且要用 Optional 关键字来声明。第五十八页,讲稿共七十一页哦例例可选参数的使用Private Sub Nadres(x As String,Optional y As String)Text1.text=x Text2.text=yEnd SubPrivate Sub Command1_Click()Dim strName As StringDim strAddress As StringstrName=张玉张玉strAddress=杭州市学院路杭州市学院路85号号 提供了两个参数。提供了两个参数。Call N
45、adres(strName,strAddress)End Sub第五十九页,讲稿共七十一页哦说明:说明:1、检测可选参数是否被省略检测可选参数是否被省略使用使用VB的内部函数的内部函数IsMissing(可选参数名)(可选参数名)来测试过程被来测试过程被调用时,某个参数是否被省略。如果可选参数被省略了,则返回调用时,某个参数是否被省略。如果可选参数被省略了,则返回True,未省略,返回,未省略,返回False。注意:若可选参数是其它类型,则注意:若可选参数是其它类型,则IsMissing()总是返回()总是返回False,不能起到检测的作用。,不能起到检测的作用。例:例:Private Sub
46、 Nadres(x As String,Optional y As Variant)Text1.Text=x If Not IsMissing(y)Then Text2.Text=y End IfEnd Sub第六十页,讲稿共七十一页哦2指定可选参数的缺省值指定可选参数的缺省值 也也可可以以给给可可选选参参数数指指定定缺缺省省值值。在在下下例例中中,如如果果未未将将可可选选参参数数传传递递到到函数过程,则返回一个缺省值。函数过程,则返回一个缺省值。Sub Nadres(x As String,Optional y As String=杭杭州州市学院路市学院路85号号)Text1.text=x
47、Text2.text=yEnd SubPrivate Sub Command1_Click()Dim strName As String strName=张玉张玉 未提供第二个参数。未提供第二个参数。Call Nadres(strName)End Sub第六十一页,讲稿共七十一页哦8.8.2使用不定数量的参数使用不定数量的参数一一般般说说来来,过过程程调调用用中中的的参参数数个个数数应应等等于于过过程程说说明明的的参参数数个个数数。可可用用ParamArray关键字指明,过程将接受任意个数的参数。关键字指明,过程将接受任意个数的参数。其定义形式如下:其定义形式如下:Sub过程名过程名(Para
48、mArray数组名数组名()Function函数名函数名(ParamArray数组名数组名()As数据类型数据类型第六十二页,讲稿共七十一页哦8.9应用举例应用举例8.9.1查找问题查找问题例例使用顺序查找法,在一组数中查找某给定的数使用顺序查找法,在一组数中查找某给定的数x算法设计:算法设计:设一组数据存放在数组设一组数据存放在数组a(1)-a(n)中,待查找的数据放在中,待查找的数据放在x中,把中,把x与与a数组中的元素从头到尾一数组中的元素从头到尾一一进行比较查找。用变量一进行比较查找。用变量p表示表示a数组数组元素下标,元素下标,p初值为初值为1,使,使x与与a(p)比较,如果比较,如
49、果x不等于不等于a(p),则使,则使p=p+1,不断重复这个过程;一旦,不断重复这个过程;一旦x等于等于a(p)则退出循环;另外,则退出循环;另外,如果如果p大于数组长度,循环也应该停止,则可由以下语句来实现它。大于数组长度,循环也应该停止,则可由以下语句来实现它。For P=1 to n IF a(p)=x then Exit ForNext第六十三页,讲稿共七十一页哦 下面编写一查找函数下面编写一查找函数Find(),若找到,若找到x则返回下标值,找不到返回则返回下标值,找不到返回0Private Function Find(a()As Single,x As Single)As Inte
50、ger Dim n%,p%,m%m=Lbound(a)n=Ubound(a)For P=m to n IF a(p)=x then Exit ForNext If pn then p=0 Find=pEnd Function 第六十四页,讲稿共七十一页哦例例使用折半查找法,在一批有序数列中查找给定的数使用折半查找法,在一批有序数列中查找给定的数x。分分析析:设设n个个有有序序数数(从从小小到到大大)存存放放在在数数组组a(1)-a(n)中中,要要查查找找的的数数为为x。用用变变量量bot、top、mid分分别别表表示示查查找找数数据据范范围围的的底底部部(数数组组下下界界)、顶顶部部(数数组组