VB程序设计-过程和函数ppt课件_第1页
VB程序设计-过程和函数ppt课件_第2页
VB程序设计-过程和函数ppt课件_第3页
VB程序设计-过程和函数ppt课件_第4页
VB程序设计-过程和函数ppt课件_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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) 系统提供的内部函数过程和事件过程。系统提供的内部函数过程和事件过程。

3、(2) (2) 用户根据应用的需要而设计的过程。用户根据应用的需要而设计的过程。 在在VBVB中根据应用的要求可分为几种类型的自定义过中根据应用的要求可分为几种类型的自定义过程程: : (1) (1) 以以“SubSub保留字开始的子过程。保留字开始的子过程。 (2) (2) 以以“FunctionFunction保留字开始的函数过程。保留字开始的函数过程。 (3) (3) 以以“PropertyProperty保留字开始的属性过程。保留字开始的属性过程。 (4) (4) 以以“EventEvent保留字开始的事件过程。保留字开始的事件过程。 本 书 仅 讨 论 以本 书 仅 讨 论 以 “

4、S u bS u b 开 头 的 子 过 程 和 以 开 头 的 子 过 程 和 以“FunctionFunction开头的函数过程。开头的函数过程。 过程和函数在在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

6、 Sub 语句定义的过程叫做子过程。语句定义的过程叫做子过程。可按下列格式定义子过程:可按下列格式定义子过程: Sub Sub 子过程名子过程名 ( ( 形式参数列表形式参数列表 ) 语句序列语句序列 End SubEnd Sub 子过程的定义Sub sub1 (a as long, b as long) c = a+bprint cEnd Sub形式参数列表由若干个形式参数构成,参数之间用逗号分隔。每个形式参数按下列格式定义:: 形式参数名 As 类型名省略类型说明则表示是Variant类型。子过程中可以使用Exit Sub语句跳出子过程。 6.1.2 子过程的调用 子过程只能作为语句被调用

7、,不能作为表达式被子过程只能作为语句被调用,不能作为表达式被调用调用( (即不能把子过程赋值给某个变量即不能把子过程赋值给某个变量) )。可以用下。可以用下列两种方法调用子过程:列两种方法调用子过程: Call Call 子过程名子过程名( ( 实际参数列表实际参数列表 ) )或或 子过程名子过程名 实际参数列表实际参数列表 以上两种调用方法功能完全一致。留意,当使用以上两种调用方法功能完全一致。留意,当使用 Call Call 语法时,参数必须在括号内。语法时,参数必须在括号内。 Call sub1Call sub12 2,3 3)或或 sub1 2sub1 2,3 3 6.1.2 通用子过

8、程 7End 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 1Call Call 子程序名(子程序名( 实际参数实际参数1 1,实际参数,实际参数2 2,)(2 2子程序名子程序名 实际参数实际参数1 1,实际参数,实际参数2 2,Function函数FunctionFunction函数的语法如下:函数的语法如下:Function Function 函数名(函数名( 形式参数形式参数1 1,形式参

10、数,形式参数2 2,)End FunctionEnd Function调用函数调用函数变量变量= Function = Function 函数名参数函数名参数1 1,参数,参数2 2,)函数可以向变量一样引用和参与运算函数可以向变量一样引用和参与运算6.2 定义Function过程定义定义Function过程说明:过程说明:1Function过程以过程以Function语句开头,以语句开头,以End Function结束;中间代码部分为函数体;结束;中间代码部分为函数体;2函数名有返回值,其值类型由函数名有返回值,其值类型由As 数据类型指定;数据类型指定;3函数体内一般都会至少为函数名赋值一

11、次;如果函数体内一般都会至少为函数名赋值一次;如果不赋值,函数返回值默认为不赋值,函数返回值默认为0或空;或空;4函数中途可以利用函数中途可以利用Exit Function退出。退出。Function函数返回值的方式与与SubSub过程不同的是,过程不同的是,FunctionFunction函数通过函数名返回函数通过函数名返回一个值,这个值是在过程的语句中赋给函数名的。一个值,这个值是在过程的语句中赋给函数名的。Function mySquare(intA,intB)Function mySquare(intA,intB) intA intA和和intBintB是形式参数是形式参数Dim ln

12、gSumDim lngSumlngSum=intA2+intB2 lngSum=intA2+intB2 mySquare=lngSummySquare=lngSumEnd FunctionEnd Function函数可以作为表达式来调用。格式为:函数可以作为表达式来调用。格式为:函数名函数名 (实际参数列表)(实际参数列表) 如果函数要直接作为语句来使用,则必须按照如果函数要直接作为语句来使用,则必须按照子过程的方式来调用,当然此时也就不能利用函数的子过程的方式来调用,当然此时也就不能利用函数的返回值了。返回值了。例如下列三条语句都可以调用前面定义的函数例如下列三条语句都可以调用前面定义的函数

13、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 函数的调用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的最大公约数的最大公约数Pri

14、vate Function gcd%(ByVal m%,ByVal n%) Dim r%,t%If mn Then Call Change(m, n) r = m Mod nDo While r0m = nn = rr = m Mod nLoopgcd = nEnd FunctionPrivate Sub Change(x1%, x2%)Dim Temp As IntegerTemp = x1x1 = x2x2 = TempEnd Sub过程和函数需注意的几点过程和函数需注意的几点过程的定义不可以嵌套过程的定义不可以嵌套函数和过程必须先定义才能使用函数和过程必须先定义才能使用使用自定义过程的两

15、个步骤:使用自定义过程的两个步骤:定义过程和调用过程定义过程和调用过程函数和过程的相互转换函数和过程的相互转换写函数首先要确定函数的输入和输出写函数首先要确定函数的输入和输出Private Sub Command1_Click()Print sum(5, 3)End SubFunction sum(x, y)s = x + ysum = sEnd Function定义函数定义函数调用函数调用函数函数和过程的相互转换函数和过程的相互转换Private Sub Command1_Click()Call sum(5, 3, s)Print sEnd SubSub sum(x, y, s)s = x

16、+ 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例题编写一个求任意三角形面积的子过程编写一个求任意三角形面积的子过程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过程判断手机号码格式是否

17、正确并调用它过程判断手机号码格式是否正确并调用它 Sub IsTel ()if len()=11 and IsNumeric() thenPrint 手机号码格式正确手机号码格式正确elsePrint 格式不正确,请重新输入格式不正确,请重新输入end ifend SubCall IsTel调用调用Sub过程过程 函数的实例函数的实例限制标题显示的内容长度的函数限制标题显示的内容长度的函数 ,如果输入的字符串如果输入的字符串tit长度大于指定的长长度大于指定的长度度n),则返回按指定的长度截取前面部分并加省略号的字符串,如果长度),则返回按指定的长度截取前面部分并加省

18、略号的字符串,如果长度小于等于指定长度,则返回原字符串。小于等于指定长度,则返回原字符串。 function title(tit,n)if len(tit)n thentitle=left(tit,n)& 返回函数值返回函数值elsetitle=tit 返回函数值返回函数值end ifend function5.7 参数传递参数传递5.7.1 形参与实参 形参:置于过程定义时,参数列表中的变形参:置于过程定义时,参数列表中的变量或数组;在过程被调用前,系统不对其量或数组;在过程被调用前,系统不对其分配空间;分配空间; 实参:当程序中想调用某过程时,所提供实参:当程序中想调用某过程时,所

19、提供的实际值;的实际值; 当实参和形参结合的时候,形参才被分配当实参和形参结合的时候,形参才被分配空间,接收由实参传递过来的值;空间,接收由实参传递过来的值; 形参、实参个数、类型、位置要一致。形参、实参个数、类型、位置要一致。6.4.1 形参与实参 常见的错误 Private Sub F1(a%,b%) . End Sub Private Sub Command1_Click()Dim x!,y!x = 3.14:y = 123Call F1(x,y) Call F1(x) End Sub5.7.2 参数传递方式 传值传值ByVal) 传址传址ByRef或省略默认)或省略默认) 区别区别1:

20、形参定义前面放的关键字不一样;:形参定义前面放的关键字不一样; 区别区别2:形参接收到的值不一样;:形参接收到的值不一样; 区别区别3:形参对实参的影响不一样:形参对实参的影响不一样6.4.23 参数传递方式 例如:(两个数的交换) Private Sub Exchange(ByVal a%, ByVal b%) Dim t% t = a a = b b = t Print a,b End SubPrivate Sub Command1_Click()Dim x%,y%x = 12y = 21Call Exchange(x,y)Print “主过程中:“;x,yEnd Sub6.4.23 参数

21、传递方式 阐明:阐明: 形参前加形参前加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 & z End sub Private sub Form_Click()dim a as integer, b as integer, c as integera=3:b=

22、2:c=1add a, b, c 或者写成或者写成Call add(a,b,c)print “外部过程中外部过程中” & a & b & c End sub1.1.参数传递方式参数传递方式 过程的参数有两种传递方式:过程的参数有两种传递方式:传值传值ByValByVal)传地址传地址ByRefByRef)(默认方式)。)(默认方式)。 按值传递参数按值传递参数: :在形式参数前加上关键字在形式参数前加上关键字ByValByVal表示指定按值传递参数。调用时实际参数仅将值表示指定按值传递参数。调用时实际参数仅将值传递给形式参数,形式参数的任何改变不会影响传递给形式参数,形

23、式参数的任何改变不会影响实际参数。实际参数。 6.3 子过程与函数的参数传递按地址传递参数按地址传递参数: :在形式参数前加上关键字在形式参数前加上关键字ByRefByRef表示指定按地址传递参表示指定按地址传递参数。数。调用时如果实际参数是表达式,则传递方式与按值传递调用时如果实际参数是表达式,则传递方式与按值传递效果相同;如果实际参数是变量,则将实际参数的内存效果相同;如果实际参数是变量,则将实际参数的内存地址传递给形式参数,形式参数与实际参数指向同一个地址传递给形式参数,形式参数与实际参数指向同一个内存地址,形式参数的改变也就是实际参数的改变。内存地址,形式参数的改变也就是实际参数的改变

24、。 6.3 子过程与函数的参数传递【例6-4】下列程序运行后,每次单击窗体就会显示“a=3”,“b=8”。 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.可选参数可选参数 在形式参数前加上关键字在形式参数前加上关键字Option

25、alOptional可以指定该形式参数为可选参可以指定该形式参数为可选参数。可选参数在过程调用时可以不提供与可选参数对应的实际参数。数。可选参数在过程调用时可以不提供与可选参数对应的实际参数。可选参数可以指定默认的缺省值。可选参数可以指定默认的缺省值。3.3.命名参数命名参数 实际参数使用实际参数使用“形式参数名形式参数名:= := 实际参数的格式即为命名参数。实际参数的格式即为命名参数。命名参数出现的位置可以与定义时的顺序无关。但需注意非命名参数命名参数出现的位置可以与定义时的顺序无关。但需注意非命名参数仍需按定义时的位置出现,所以非命名参数在定义时应排在第一个命仍需按定义时的位置出现,所以

26、非命名参数在定义时应排在第一个命名参数之前。名参数之前。4.4.数组作为参数和返回值数组作为参数和返回值 数组可以作为实际参数传递到过程中。此时形式参数应为数组可以作为实际参数传递到过程中。此时形式参数应为VariantVariant类型或与实际参数类型完全相同的数组类型。作为形式参数类型或与实际参数类型完全相同的数组类型。作为形式参数的数组应为可变数组,用数组名跟空的圆括号表示。函数的返回值也的数组应为可变数组,用数组名跟空的圆括号表示。函数的返回值也可以是数组,此时类型说明为可以是数组,此时类型说明为VariantVariant类型或类型或“As As 类型()类型()”。6.3 子过程与

27、函数的参数传递【例【例6-76-7】下列程序运行后,单击窗体时显示】下列程序运行后,单击窗体时显示“9”9”、 “ “8”8”、“7”7”。 Option ExplicitOption Explicit Function f(a() As Long) As Long() Function f(a() As Long) As Long() f = a f = a End Function End Function Sub Form_Click() Sub Form_Click() Dim b() As Long Dim b() As Long Dim c(2) As Long Dim c(2)

28、As Long c(0) = 9 c(0) = 9 c(1) = 8 c(1) = 8 c(2) = 7 c(2) = 7 b = f(c) b = f(c) print b(0) print b(0) b()=f(c() b()=f(c() print b(1) print b(1) Print f(c)(2) Print f(c)(2) 函数表达式直接带数组下标代函数表达式直接带数组下标代表数组元素表数组元素 End SubEnd Sub6.3 子过程与函数的参数传递5.5.可变个数参数可变个数参数 将最后一个形式参数声明为将最后一个形式参数声明为VariantVariant类型的数组,同

29、时在前面加上类型的数组,同时在前面加上ParamArrayParamArray关键字,就变成可变个数的参数;调用过程时可输入任意个关键字,就变成可变个数的参数;调用过程时可输入任意个数的参数,输入的参数转变为数组的元素;也可以省略该参数。数的参数,输入的参数转变为数组的元素;也可以省略该参数。ParamArray ParamArray 关键字不能与关键字不能与 ByValByVal或或ByRefByRef一起使用,也不能在参数列表一起使用,也不能在参数列表中出现中出现OptionalOptional。【例【例6-86-8】下列程序运行后,每次单击窗体就会显示】下列程序运行后,每次单击窗体就会显

30、示“6”6”。 Option ExplicitOption Explicit Function f(a, ParamArray b() Function f(a, ParamArray b() f = a + b(0) + b(1) f = a + b(0) + b(1) End Function End Function Sub Form_Click() Sub Form_Click() Print f(1, 2, 3) Print f(1, 2, 3) End Sub End Sub 留意:在用可变个数参数时,实参个数不能少于使用的形参个数。留意:在用可变个数参数时,实参个数不能少于使用的

31、形参个数。6.3 子过程与函数的参数传递6.4 变量、过程的作用域 1.1.过程的作用域过程的作用域 定义过程时在过程名前加关键字定义过程时在过程名前加关键字PrivatePrivate,则该过程为私有过程,仅,则该过程为私有过程,仅在定义该过程的模块内有效,其他模块的过程不能调用该过程。如果没有在定义该过程的模块内有效,其他模块的过程不能调用该过程。如果没有加关键字加关键字PrivatePrivate或加了关键字或加了关键字PublicPublic,则该过程为公共过程,在整个工,则该过程为公共过程,在整个工程内有效,其他模块内的过程可以调用该过程。程内有效,其他模块内的过程可以调用该过程。

32、调用当前过程所在模块定义的过程可以直接使用过程名。调用其他窗调用当前过程所在模块定义的过程可以直接使用过程名。调用其他窗体模块或其他标准模块定义的过程,运用体模块或其他标准模块定义的过程,运用“模块名模块名. .过程名的格式。过程名的格式。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 变量、过程的作用域 运行结果如图所示。 过程如果直接或间接地调用了自身,这就是过程如果直接或间接地调用

33、了自身,这就是递归过程。递归过程。例【例【6-126-12】求】求n!n!的递归函数。的递归函数。Public Function FN(n As Integer) As Public Function FN(n As Integer) As IntegerIntegerif n=1 Thenif n=1 ThenFN=1FN=1ElseElseFN=nFN=n* *FN(n-1)FN(n-1)End ifEnd ifEnd FunctionEnd Function可见递归是一个不断自己调用自己的过程可见递归是一个不断自己调用自己的过程6.5 递归【例6-13】一只猴子一天从山上摘来一袋桃子,从

34、这天开始,它每天都要把袋中的桃子平分为二堆,吃掉其中的一堆,然后再从剩下的桃中拿出一个解谗,等到第10天,它发现袋中只有一只桃可吃,问猴子总共摘了多少桃。程序如下运行结果如下图):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) +

35、2 End IfEnd Function6.5 递归6.6 常用算法举例 程序设计不仅仅需要具备程序设计语言的语法知识,更重要的是要掌握基本的算法并能灵活的加以应用。下面给出一些常用算法的应用实例 。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, By

36、Val b As Long) As LongFunction gcd(ByVal a As Long, ByVal b As Long) As Long 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.数制转换数制转换【例【例6-186-18】将任意进制正整数形式的字符串转换为数值】将任意进制正整数形式的字符串转换为数值( (十进制十进制) ),实现,实现函数如下:函数如下: Function str2n(ByVal a As String, Optional ByVal b As Long) Function str2n(ByVal a As St

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论