《VB程序设计-过程和函数.ppt》由会员分享,可在线阅读,更多相关《VB程序设计-过程和函数.ppt(53页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、VB程序设计唐四薪6.1 子过程的定义与调用6.2 函数的定义与调用6.3 子过程与函数的参数传递6.4 变量、过程的作用域6.5 递归6.6 常用算法举例第6章 过程与函数本节课要求本节课要求1.掌握掌握Sub过程、过程、Function函数的定义和调用函数的定义和调用2.理解理解Sub过程和过程和Function函数的区别函数的区别3.掌握编写过程和函数的一般流程掌握编写过程和函数的一般流程引入过程和函数的目的引入过程和函数的目的1.依据结构化程序设计的思想,实现依据结构化程序设计的思想,实现模块化模块化的程序设计的程序设计当需解决的问题当需解决的问题规模较大、复杂规模较大、复杂时时,可以
2、按功能细分成可以按功能细分成一个一个小的一个一个小的功能模块功能模块,这样的这样的小程序段小程序段,在,在VB中被称中被称为为过程过程;2.简化程序中多处重复出现处理相同功能的程序简化程序中多处重复出现处理相同功能的程序段的设计问题段的设计问题过程的定义过程的定义:过程是一段能完成一个或多个特定:过程是一段能完成一个或多个特定功能的独立的程序段,并可以被其他过程调用功能的独立的程序段,并可以被其他过程调用特点:功能独立;可被调用特点:功能独立;可被调用 VB VB中的过程有两种中的过程有两种:(1)(1)系统提供的系统提供的内部函数过程内部函数过程和和事件过程事件过程。(2)(2)用户根据应用
3、的需要而设计的过程。用户根据应用的需要而设计的过程。在在VBVB中中根根据据应应用用的的要要求求可可分分为为几几种种类类型型的的自自定定义义过过程程:(1)(1)以以“Sub”“Sub”保留字开始的子过程。保留字开始的子过程。(2)(2)以以“Function”“Function”保留字开始的函数过程。保留字开始的函数过程。(3)(3)以以“Property”“Property”保留字开始的属性过程。保留字开始的属性过程。(4)(4)以以“Event”“Event”保留字开始的事件过程。保留字开始的事件过程。本本 书书 仅仅 讨讨 论论 以以“Sub”“Sub”开开 头头 的的 子子 过过 程
4、程 和和 以以“Function”“Function”开头的函数过程。开头的函数过程。过程和函数在在VBVB中,过程有两种,一种是中,过程有两种,一种是SubSub子过程子过程,一种,一种是是FunctionFunction函数函数。两者的区别在于:两者的区别在于:SubSub子过程子过程只执行程序而不返回值,只执行程序而不返回值,而而FunctionFunction函数函数执行程序后会返回值。执行程序后会返回值。函数Function和过程Sub的区别函数函数Function参数1参数2返回值返回值过程过程Sub函数:既有输入又有输出:如数控机床、打爆米花函数:既有输入又有输出:如数控机床、打
5、爆米花的机器的机器过程:只有输入没有输出:如光驱过程:只有输入没有输出:如光驱参数n打爆米花打爆米花建立函数的一般过程建立函数的一般过程Function Function 函数名(函数名(形式参数形式参数1 1,形式参数,形式参数2 2,)End FunctionEnd Function输入:?输入:?输出:?输出:?Function Function 打爆米花(粮食,糖精)打爆米花(粮食,糖精)打爆米花打爆米花=爆米花爆米花End FunctionEnd Function6.1.1 子过程的定义 在在VBVB中中用用Sub Sub 语语句句定定义义的的过过程程叫叫做做子子过过程程。可按下列格
6、式定义子过程:可按下列格式定义子过程:Sub Sub 子过程名子过程名(形式参数列表形式参数列表)语句序列语句序列 End Sub End Sub 子过程的定义Sub sub1(a as long,b as long)c=a+bprint cEnd Sub形式参数列表由若干个形式参数构成,参数之间用逗号形式参数列表由若干个形式参数构成,参数之间用逗号分隔。每个形式参数按下列格式定义分隔。每个形式参数按下列格式定义::形式参数名形式参数名As类型名类型名省略类型说明则表示是省略类型说明则表示是Variant类型。类型。子过程中可以使用子过程中可以使用ExitSub语句语句跳出子过程。跳出子过程。
7、6.1.2 子过程的调用 子子过过程程只只能能作作为为语语句句被被调调用用,不不能能作作为为表表达达式式被被调调用用(即即不不能能把把子子过过程程赋赋值值给给某某个个变变量量)。可可以以用用下下列列两两种方法调用子过程:种方法调用子过程:Call Call 子过程名子过程名(实际参数列表实际参数列表 )或或 子过程名子过程名 实际参数列表实际参数列表 以以上上两两种种调调用用方方法法功功能能完完全全一一致致。注注意意,当当使使用用 Call Call 语法时,参数必须在括号内。语法时,参数必须在括号内。Call sub1Call sub1(2 2,3 3)或或 sub1 2sub1 2,3 3
8、 6.1.2 通用子过程7)End Sub标志Sub过程执行结束,程序将返回调用该Sub过程的语句处继续执行;8)过程不能嵌套定义。Private Sub Command1_Click()Call P()End SubPrivate Sub()Print“输出结果为:”End Sub事件过程事件过程事件过程的调用事件过程的调用:当有事件发生时,系统会自动:当有事件发生时,系统会自动调用与事件相对应的事件过程。事件过程是与对调用与事件相对应的事件过程。事件过程是与对象相关联的,是对象对事件做出的响应。事件过象相关联的,是对象对事件做出的响应。事件过程的名称由对象名、下划线、事件名连接而成。程的名
9、称由对象名、下划线、事件名连接而成。Sub过程(子程序)SubSub子程序的语法如下:子程序的语法如下:Sub Sub 子程序名(子程序名(形式参数形式参数1 1,形式参数,形式参数2 2,)End SubEnd Sub调用子程序的两种方式:调用子程序的两种方式:(1 1)Call Call 子程序名子程序名(实际参数实际参数1 1,实际参数,实际参数2 2,)(2 2)子程序名)子程序名 实际参数实际参数1 1,实际参数,实际参数2 2,Function函数FunctionFunction函数的语法如下:函数的语法如下:Function Function 函数名(函数名(形式参数形式参数1
10、1,形式参数,形式参数2 2,)End FunctionEnd Function调用函数调用函数变量变量=Function=Function 函数名(参数函数名(参数1 1,参数,参数2 2,)函数可以向变量一样引用和参与运算函数可以向变量一样引用和参与运算6.2 定义Function过程定义定义Function过程说明:过程说明:1)Function过程以过程以Function语句开头,以语句开头,以EndFunction结束;中间代码部分为函数体;结束;中间代码部分为函数体;2)函数名有返回值,其值类型由)函数名有返回值,其值类型由As数据类型指定;数据类型指定;3)函数体内一般都会至少为
11、函数名赋值一次函数体内一般都会至少为函数名赋值一次;如果;如果不赋值,不赋值,函数返回值默认为函数返回值默认为0或空或空;4)函数中途可以利用)函数中途可以利用ExitFunction退出。退出。Function函数返回值的方式与与SubSub过程不同的是,过程不同的是,FunctionFunction函数函数通过函数名通过函数名返回一返回一个值,这个值是在过程的语句中赋给函数名的。个值,这个值是在过程的语句中赋给函数名的。FunctionmySquare(intA,intB)intA和和intB是形式参数是形式参数DimlngSumlngSum=intA2+intB2mySquare=lng
12、SumEndFunction函数可以作为表达式来调用。格式为:函数可以作为表达式来调用。格式为:函数名函数名(实际参数列表)(实际参数列表)如果函数要直接作为语句来使用,则必须按照如果函数要直接作为语句来使用,则必须按照子过程的方式来调用,当然此时也就不能利用函数的子过程的方式来调用,当然此时也就不能利用函数的返回值了。返回值了。例如下列三条语句都可以调用前面定义的函数例如下列三条语句都可以调用前面定义的函数Fun1Fun1:Print fun1(2,3)Print fun1(2,3)Call fun1(2,3)Call fun1(2,3)fun1 2,3 fun1 2,3 6.2.2 函数的
13、调用6.2 定义Function过程例如,求n!Private Function fac%(n As Integer)If n0 Then fac=-1:Exit FunctionElsefac=1For i=1 To nfac=fac*iNext iEnd IfEnd Function6.2 定义Function过程例如,求例如,求m,n的最大公约数的最大公约数PrivateFunctiongcd%(ByValm%,ByValn%)Dimr%,t%IfmnThenCallChange(m,n)r=mModnDoWhiler0m=nn=rr=mModnLoopgcd=nEndFunctionP
14、rivateSubChange(x1%,x2%)DimTempAsIntegerTemp=x1x1=x2x2=TempEndSub过程和函数需注意的几点过程和函数需注意的几点过程的定义不可以嵌套过程的定义不可以嵌套函数和过程必须先定义才能使用函数和过程必须先定义才能使用使用自定义过程的两个步骤:使用自定义过程的两个步骤:定义过程定义过程和和调用过程调用过程函数和过程的相互转换函数和过程的相互转换写函数首先要确定函数的输入和输出写函数首先要确定函数的输入和输出Private Sub Command1_Click()Print sum(5,3)End SubFunction sum(x,y)s=x
15、+ysum=sEnd Function定义函数定义函数调用函数调用函数函数和过程的相互转换函数和过程的相互转换Private Sub Command1_Click()Call sum(5,3,s)Print sEnd SubSub sum(x,y,s)s=x+yEnd Sub定义过程定义过程调用过程调用过程例题编写一个求任意三角形面积的函数编写一个求任意三角形面积的函数Private Function Area!(a!,b!,c!)Dim t!t=(a+b+c)/2Area=Sqr(t*(t-a)*(t-b)*(t-c)End Function例题编写一个求任意三角形面积的子过程编写一个求任意
16、三角形面积的子过程Private Sub Area(a!,b!,c!,s!)Dim z!z=(a+b+c)/2s=Sqr(z*(z-a)*(z-b)*(z-c)End Sub过程实例过程实例定义定义Sub过程判断手机号码格式是否正确并调用它过程判断手机号码格式是否正确并调用它 Sub IsTel(tel)if len(tel)=11 and IsNumeric(tel)thenPrint 手机号码格式正确elsePrint 格式不正确,请重新输入end ifend Sub调用Sub过程 函数的实例函数的实例限制标题显示的内容长度的函数限制标题显示的内容长度的函数,如果输入的字符串(如果输入的字
17、符串(tit)长度大于指定的长)长度大于指定的长度(度(n),则返回按指定的长度截取前面部分并加省略号的字符串,如果长度),则返回按指定的长度截取前面部分并加省略号的字符串,如果长度小于等于指定长度,则返回原字符串。小于等于指定长度,则返回原字符串。function title(tit,n)if len(tit)n thentitle=left(tit,n)&返回函数值elsetitle=tit 返回函数值end ifend function5.7参数传递参数传递5.7.1 形参与实参形参:置于过程定义时,参数列表中的变形参:置于过程定义时,参数列表中的变量或数组;在过程被调用前,系统不对其量
18、或数组;在过程被调用前,系统不对其分配空间;分配空间;实参:当程序中想调用某过程时,所提供实参:当程序中想调用某过程时,所提供的实际值;的实际值;当实参和形参结合的时候,形参才被分配当实参和形参结合的时候,形参才被分配空间,接收由实参传递过来的值;空间,接收由实参传递过来的值;形参、实参个数、类型、位置要一致。形参、实参个数、类型、位置要一致。6.4.1 形参与实参常见的错误Private Sub F1(a%,b%).End SubPrivate Sub Command1_Click()Dim x!,y!x=3.14:y=123Call F1(x,y)Call F1(x)End Sub5.7.
19、2 参数传递方式传值(传值(ByVal)传址(传址(ByRef或省略默认)或省略默认)区别区别1:形参定义前面放的关键字不一样;:形参定义前面放的关键字不一样;区别区别2:形参接收到的值不一样;:形参接收到的值不一样;区别区别3:形参对实参的影响不一样:形参对实参的影响不一样6.4.23 参数传递方式 例如:(两个数的交换)Private Sub Exchange(ByVal a%,ByVal b%)Dim t%t=aa=bb=tPrint a,bEnd SubPrivate Sub Command1_Click()Dim x%,y%x=12y=21Call Exchange(x,y)Prin
20、t“主过程中:“;x,yEnd Sub6.4.23 参数传递方式说明:说明:形参前加形参前加ByVal时表示传值时表示传值不加或加不加或加ByRef时表示传址时表示传址传值是单方向的传值是单方向的传址是传址是“双方向的双方向的”6.4.23 参数传递方式Private sub add(x as integer,y as integer,z as integer)z=x+yx=x+1y=y+1print“子过程中子过程中”&x&y&zEnd subPrivate sub Form_Click()dim a as integer,b as integer,c as integera=3:b=2:c
21、=1add a,b,c 或者写成或者写成Call add(a,b,c)print“外部过程中外部过程中”&a&b&cEnd sub1.1.参数传递方式参数传递方式 过程的参数有两种传递方式:过程的参数有两种传递方式:传值(传值(ByValByVal)传地址(传地址(ByRefByRef)(默认方式默认方式)。)。按值传递参数按值传递参数:在形式参数前加上关键字在形式参数前加上关键字ByValByVal表示指定按值传递参数。调用时实际参数仅将值表示指定按值传递参数。调用时实际参数仅将值传递给形式参数,传递给形式参数,形式参数的任何改变不会影响形式参数的任何改变不会影响实际参数。实际参数。6.3
22、子过程与函数的参数传递按地址传递参数按地址传递参数:在形式参数前加上关键字ByRefByRef表示指定按地址传递参数。调用时如果实际参数是表达式,则传递方式与按值传递调用时如果实际参数是表达式,则传递方式与按值传递效果相同;如果实际参数是变量,则将实际参数的内存效果相同;如果实际参数是变量,则将实际参数的内存地址传递给形式参数,形式参数与实际参数指向同一个地址传递给形式参数,形式参数与实际参数指向同一个内存地址,内存地址,形式参数的改变也就是实际参数的改变。形式参数的改变也就是实际参数的改变。6.3 子过程与函数的参数传递【例6-4】下列程序运行后,每次单击窗体就会显示“a=3”,“b=8”。
23、Option Explicit Dim a As Long Dim b As Integer Sub s(c As Long)c=c+1 End Sub Sub Form_Click()a=2 b=8 s a Print a=;a s(b)Print b=;bEnd Sub 说明:本例中,圆括号用于将实际参数由变量b转换为表达式,即按值传递(s(b),否则就是按址传递(s a)。2.2.可选参数可选参数 在形式参数前加上关键字Optional可以指定该形式参数为可选参数。可选参数在过程调用时可以不提供与可选参数对应的实际参数。可选参数可以指定默认的缺省值。3.3.命名参数命名参数 实际参数使用
24、“形式参数名:=实际参数”的格式即为命名参数。命名参数出现的位置可以与定义时的顺序无关。但需注意非命名参数仍需按定义时的位置出现,所以非命名参数在定义时应排在第一个命名参数之前。4.4.数组作为参数和返回值数组作为参数和返回值 数组可以作为实际参数传递到过程中。此时形式参数应为Variant类型或与实际参数类型完全相同的数组类型。作为形式参数的数组应为可变数组,用数组名跟空的圆括号表示。函数的返回值也可以是数组,此时类型说明为Variant类型或“As 类型()”。6.3 子过程与函数的参数传递【例【例6-76-7】下列程序运行后,单击窗体时显示“9”、“8”、“7”。Option Expli
25、cit Function f(a()As Long)As Long()f=a End Function Sub Form_Click()Dim b()As Long Dim c(2)As Long c(0)=9 c(1)=8 c(2)=7 b=f(c)print b(0)b()=f(c()print b(1)Print f(c)(2)函数表达式直接带数组下标代表数组元素 End Sub6.3 子过程与函数的参数传递5.5.可变个数参数可变个数参数 将最后一个形式参数声明为Variant类型的数组,同时在前面加上ParamArray关键字,就变成可变个数的参数;调用过程时可输入任意个数的参数,输
26、入的参数转变为数组的元素;也可以省略该参数。ParamArray 关键字不能与 ByVal或ByRef一起使用,也不能在参数列表中出现Optional。【例【例6-86-8】下列程序运行后,每次单击窗体就会显示“6”。Option Explicit Function f(a,ParamArray b()f=a+b(0)+b(1)End Function Sub Form_Click()Print f(1,2,3)End Sub 注意:在用可变个数参数时,实参个数不能少于使用的形参个数。6.3 子过程与函数的参数传递6.4 变量、过程的作用域 1.1.过程的作用域过程的作用域 定义过程时在过程名
27、前加关键字定义过程时在过程名前加关键字PrivatePrivate,则该,则该过程为私有过程,仅在定义该过程的模块内有效,其过程为私有过程,仅在定义该过程的模块内有效,其他模块的过程不能调用该过程。他模块的过程不能调用该过程。如果没有加关键字如果没有加关键字PrivatePrivate或加了关键字或加了关键字PublicPublic,则该过程为公共过程,则该过程为公共过程,在整个工程内有效,其他模块内的过程可以调用该过在整个工程内有效,其他模块内的过程可以调用该过程。程。调用当前过程所在模块定义的过程可以直接使用调用当前过程所在模块定义的过程可以直接使用过程名。调用其他窗体模块或其他标准模块定
28、义的过过程名。调用其他窗体模块或其他标准模块定义的过程,使用程,使用“模块名模块名.过程名过程名”的格式。的格式。Private Sub Form_Click()Print 第1次调用过程b b Print Print 第2次调用过程b b Print Print 第1次调用静态过程e e 0 Print Print 第2次调用静态过程e e 0End Sub6.4 变量、过程的作用域 运行结果如图所示。过程如果直接或间接地调用了自身,这就是过程如果直接或间接地调用了自身,这就是递归过程。递归过程。例例【6-126-12】求求n!n!的递归函数。的递归函数。Public Function FN
29、(n As Integer)As IntegerPublic Function FN(n As Integer)As Integerif n=1 Thenif n=1 ThenFN=1FN=1ElseElseFN=n*FN(n-1)FN=n*FN(n-1)End ifEnd ifEnd FunctionEnd Function可见递归是一个不断自己调用自己的过程可见递归是一个不断自己调用自己的过程6.5 递归【例例6-136-13】一只猴子一天从山上摘来一袋桃子,从这天开始,它每天都要把袋中的桃子平分为二堆,吃掉其中的一堆,然后再从剩下的桃中拿出一个解谗,等到第10天,它发现袋中只有一只桃可吃
30、,问猴子总共摘了多少桃。程序如下(运行结果如下图):Private Sub Command1_Click()Dim Num As Integer Num=Val(InputBox(请输入天数:)Label1.Caption=桃子数量为:&Eat(Num)End SubPrivate Function Eat(N As Integer)递归函数 If N=1 Then Eat=1 Else Eat=2*Eat(N-1)+2 End IfEnd Function6.5 递归6.6 常用算法举例 程序设计不仅仅需要具备程序设计语言的语法知识,更重要的是要掌握基本的算法并能灵活的加以应用。下面给出一些
31、常用算法的应用实例。1.1.欧几里德算法求最大公约数和最小公倍数欧几里德算法求最大公约数和最小公倍数 欧几里德算法也叫做辗转相除法,是计算两个数最大公约数的传统算法。步骤如下:(1)如果a b,则交换a和b。(2)令c是a/b的余数。(3)如果c0,则令gcdb并终止;否则令ab,bc并转向步骤(2)。具体算法应用见下例:【例【例6-156-15】求最大公约数的函数为:求最大公约数的函数为:Function gcd(ByVal a As Long,ByVal b As Long)As Long Function gcd(ByVal a As Long,ByVal b As Long)As Lo
32、ng Dim c As LongDim c As Long If a b ThenIf a L Then j=0 Next i code=aEnd Function Private Sub Form_click()Dim a()As Byte Dim b()As Byte Dim c()As Byte a=用于加密的密码 b=密码 Print 加密前的明文:;a a=code(a,b)将原文与密码进行异或运算,实现对原文的加密 Print 加密后的密文:,a a=code(a,b)将密文与密码进行异或运算,实现对密文的解密 Print 解密后的明文:,aEnd Sub3.3.数制转换数制转换【
33、例【例6-186-18】将任意进制正整数形式的字符串转换为数值(十进制),实现函数如下:Function str2n(ByVal a As String,Optional ByVal b As Long)As Long Dim i As Long Dim num As Long Dim c As String*1 For i=1 To Len(a)c=mid(a,i,1)c=UCase(c)If c=0 And c=A And c=Z Then num=num*b+Asc(c)-Asc(A)+10 End If Next i str2n=num End Function6.6 常用算法举例 4
34、.4.多项式求值和求导数多项式求值和求导数【例【例6-196-19】多项式 a0 xn+a1 xn-1+an-1x+an 的值可以用下面的函数计算:Function polynomial(a()As Double,ByVal x As Double)As Double Dim i As Long Dim fx As Double fx=a(0)For i=1 To UBound(a)fx=x*fx+a(i)Next i polynomial=fx End Function6.6 常用算法举例 本章介绍了与过程的定义与调用有关的内容。过程有两种基本的形式:子过程与函数,这两种形式没有本质的区别。子过程是事件响应过程采用的形式,函数则使用起来更为灵活。过程调用时的参数有两种传递方式:值传递和引用传递。值传递仅仅是复制实际参数的副本传递给形式参数,所以形式参数的变化不会影响实际参数的值,引用传递时形式参数与实际参数是同一个变量,形式参数的改变也就是实际参数的改变。过程和变量都有作用域限制,同名过程或变量在调用时有优先级的差异,变量还有生存期的问题。本章最后给出了一些实用的自定义过程,读者可从中学习算法,加深对语法知识的理解。本章小结