《第六章过程.ppt》由会员分享,可在线阅读,更多相关《第六章过程.ppt(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第六章第六章 过程过程第六章第六章 过程过程6.1 6.1 函数过程的定义和调用函数过程的定义和调用6.2 6.2 子过程的定义和调用子过程的定义和调用6.3 6.3 参数传递参数传递6.4 6.4 过程的嵌套和递归调用过程的嵌套和递归调用6.5 6.5 变量的作用域变量的作用域6.6 6.6 综合应用综合应用6.1 函数过程的定义和调用函数过程的定义和调用 P125vVB的两类过程:的两类过程:系统系统提供的内部函数过程和事件过程提供的内部函数过程和事件过程用户自定义用户自定义过程过程以以“SUB”保留字开始的为保留字开始的为子过程子过程以以“Function”保留字开始的为保留字开始的为函
2、数过函数过程程以以“Property”保留字开始的为属性过保留字开始的为属性过程程以以“Event”保留字开始的为事件过程保留字开始的为事件过程6.1 函数过程的定义和调用函数过程的定义和调用 P125一、引例一、引例v例例6.16.1已知多边形的各条边的长度,要计算已知多边形的各条边的长度,要计算多边形的面积。多边形的面积。v分析:计算多边形面积,可将多边形分解分析:计算多边形面积,可将多边形分解成若干个三角形。成若干个三角形。v计算三角形面积的公式如下:计算三角形面积的公式如下:xyz6.1 函数过程的定义和调用函数过程的定义和调用 P125一、引例一、引例(例例6.16.1)v计算三角形
3、面积的公式如下:计算三角形面积的公式如下:xyz定义函数过程定义函数过程area:Public Function area(x!,y!,z!)As Single Dim c!c=1/2*(x+y+z)area=Sqr(c*(c-x)*(c-y)*(c-z)End Function调用函数过程:调用函数过程:Sub command1_click()输入若干个三角形边长输入若干个三角形边长 S1=area(a,b,c):S2=area(c,d,e)S3=area(e,f,g)Print S1+S2+S3End Sub二、函数过程的定义二、函数过程的定义 P126v自定义函数过程的形式如下:自定义函
4、数过程的形式如下:StaticPublic|Private Function 函数过程函数过程名名(参数列表参数列表)As 类型类型 局部变量或常数定义局部变量或常数定义 语句块语句块1 函数名函数名=表达式表达式 Exit Function 语句块语句块2 函数名函数名=表达式表达式End Function函数过程体函数过程体形参名形参名1 As 类型类型,形参名形参名2 As 类型类型,二、函数过程的定义二、函数过程的定义 P126v说明:说明:Public表示函数是全局的、公有的,可被程序中表示函数是全局的、公有的,可被程序中任何模块调用任何模块调用(缺省缺省);Private表示函数是
5、局部表示函数是局部的、私有的,仅供本模块中其他过程调用的、私有的,仅供本模块中其他过程调用函数过程名命名规则与变量名规则同函数过程名命名规则与变量名规则同As类型:函数返回值的类型,若类型说明缺省,类型:函数返回值的类型,若类型说明缺省,则返回则返回变体类型变体类型值值在函数体内在函数体内至少对函数名赋值一次至少对函数名赋值一次形参列表形式:形参列表形式:形参名形参名1 As 类型类型,形参名形参名2 As 类型类型,形参或称哑元,在定义时没有值形参或称哑元,在定义时没有值Exit Function:表示退出函数过程:表示退出函数过程二、函数过程的定义二、函数过程的定义 P126v例例6.2
6、编写一个求最大公约数的函数过程编写一个求最大公约数的函数过程Function gcd%(ByVal m%,ByVal n%)If mn Then t=m:m=n:n=t r=m mod n Do While(r0)m=n:n=r:r=m mod n Loop gcd=nEnd Function三、函数过程的调用三、函数过程的调用 P1271.1.函数过程的调用形式函数过程的调用形式v函数过程可由函数过程名返回一个值,不能作函数过程可由函数过程名返回一个值,不能作为单独的语句加以调用,必须作为为单独的语句加以调用,必须作为表达式表达式或表或表达式中的一部分达式中的一部分v在在赋值语句赋值语句中调
7、用函数过程,形式为:中调用函数过程,形式为:变量名变量名=函数过程名函数过程名(实参列表实参列表)v实参实参(实际参数实际参数)是传递给过程的变量或表达式是传递给过程的变量或表达式v它必须与形参个数相同,位置与类型一一对应。它必须与形参个数相同,位置与类型一一对应。可以是同类型的常量、变量、表达式可以是同类型的常量、变量、表达式v由于由于VB是事件驱动的运行机制,所以对自定是事件驱动的运行机制,所以对自定义过程的调用一般是由事件调用的义过程的调用一般是由事件调用的三、函数过程的调用三、函数过程的调用 P1271.1.函数过程的调用形式函数过程的调用形式v调用例调用例6.2中求最大公约数的函数过
8、程中求最大公约数的函数过程Sub Form_Click()Dim x%,y%,z%x=124:y=24 z=gcd(x,y)Print“最大公约数是最大公约数是”;zEnd Sub三、函数过程的调用三、函数过程的调用 P1282.2.调用过程时的执行流程调用过程时的执行流程Sub Form_Click()Dim x%,y%,z%x=124:y=24 z=gcd(x,y)Print“最大公约数是最大公约数是”;zEnd SubFunction gcd%(ByVal m%,ByVal n%)If mn Then t=m:m=n:n=t r=m mod n Do While(r0)m=n:n=r:r
9、=m mod n Loop gcd=nEnd Functionxm,ynzgcd6.2 子过程的定义和调用子过程的定义和调用 P129一、引例一、引例v函数过程的不足:函数过程的不足:不是为了获得某个函数值,而是不是为了获得某个函数值,而是为了某种功能的处理为了某种功能的处理要获得多个结果的情况要获得多个结果的情况6.2 子过程的定义和调用子过程的定义和调用 P130二、子过程的定义二、子过程的定义v自定义子过程的形式如下:自定义子过程的形式如下:StaticPublic|Private Sub 子过程名子过程名(形参列表形参列表)局部变量或常数定义局部变量或常数定义 语句块语句块1 Exit
10、 Sub 语句块语句块2End Sub子过程体子过程体三、子过程的调用三、子过程的调用 P130v子过程利用一条子过程利用一条独立语句独立语句加以调用,形式:加以调用,形式:子过程名子过程名 实参列表实参列表或或 Call 子过程名子过程名(实参列表实参列表)v注意:注意:用用Call语句调用过程时,实参必须在括号内,语句调用过程时,实参必须在括号内,若没有参数则括号可省;用子过程名调用时若没有参数则括号可省;用子过程名调用时括号可省可加括号可省可加若实参要获得子过程的返回值,则实参只能若实参要获得子过程的返回值,则实参只能是变量是变量(与形参同类型的简单变量、数组名、与形参同类型的简单变量、
11、数组名、自定义类型变量自定义类型变量),不能是常量、表达式和控,不能是常量、表达式和控件名件名三、子过程的调用三、子过程的调用 P130v子过程与函数过程区别:子过程与函数过程区别:函数过程名有值,有类型,在函数体内至函数过程名有值,有类型,在函数体内至少赋值一次;子过程名无值,无类型,在少赋值一次;子过程名无值,无类型,在子过程体内不能对子过程名赋值;子过程体内不能对子过程名赋值;调用时,子过程调用是一句独立的语句。调用时,子过程调用是一句独立的语句。函数过程不能作为单独的语句加以调用,函数过程不能作为单独的语句加以调用,必须参与表达式运算必须参与表达式运算一般当过程有一个函数值,使用函数过
12、程一般当过程有一个函数值,使用函数过程较直观;反之若过程无返回值,或有多个较直观;反之若过程无返回值,或有多个返回值,使用子过程较直观返回值,使用子过程较直观三、子过程的调用三、子过程的调用 P130v注意事项:注意事项:形参个数的确定。形参是过程与主调形参个数的确定。形参是过程与主调程序交互的接口,从主调程序获得初程序交互的接口,从主调程序获得初值,或将计算结果返回给主调程序。值,或将计算结果返回给主调程序。不要将过程中所有变量均作为形参不要将过程中所有变量均作为形参形参没有具体的值,只代表参数的个形参没有具体的值,只代表参数的个数、位置和类型数、位置和类型例例6.4分别编一计算某级数部分和
13、的子过程和函数过程,并调用。分别编一计算某级数部分和的子过程和函数过程,并调用。级数为:级数为:精度为:精度为:函数过程实现求部分级数和函数过程实现求部分级数和 Function jishu1(x!,eps#)As Double Dim n%,s#,t#n=1:s=0:t=1Do While(Abs(t)=eps)s=s+t t=t*x/n n=n+1Loop jishu1=sEnd Function子过程实现求部分级数和子过程实现求部分级数和 Sub jishu2(s#,x!,eps#)Dim n%,t#n=1:s=0:t=1Do While(Abs(t)=eps)s=s+t t=t*x/n
14、 n=n+1LoopEnd Subf1=jishu1(2#,0.000001)调用函数过程调用函数过程Call jishu2(f2,2#,0.000001)调用子过程调用子过程或或 jishu2 f2,2#,0.00001 程序运行流程:程序运行流程:Private Sub Command1_Click()Dim f1#,f2#f1=jishu1(2#,0.000001)Call jishu2(f2,2#,0.000001)Print f1=;f1,f2=;f2 End SubSub jishu2(s#,x!,eps#)s=表达式表达式End Sub找子过程名调用找子过程名调用jishu2Fu
15、nction jishu1(x!,eps#)As Doubl jishu1=表达式表达式End Function找函数名调用找函数名调用jishu1jishu1函数名带了值返回函数名带了值返回函数过程函数过程子过程:子过程:只需将只需将函数过程的返回结果作为子函数过程的返回结果作为子过程的形参即可过程的形参即可例例6.5分别编写统计字符串中分别编写统计字符串中“the”出现次数的子过程出现次数的子过程和函数过程,并分别调用。和函数过程,并分别调用。函数过程实现函数过程实现Function FuncThe%(ByVal s$)Dim Count%,i%,st$Count=0:st=Trim(s)
16、i=InStr(st,the)Do While i 0 Count=Count+1 st=Mid(st,i+1)i=InStr(st,the)Loop FuncThe=CountEnd Function子过程实现子过程实现Sub ProcThe(ByVal s$,ByRef Count%)Dim i%,st$Count=0:st=Trim(s)i=InStr(st,the)Do While i 0 Count=Count+1 st=Mid(st,i+1)i=InStr(st,the)LoopEnd SubLabel3.Caption=FuncThe(Text1)调用函数过程调用函数过程Call
17、 ProcThe(Text1,n)调用子过程调用子过程或或 ProcThe Text1,nP52 InStr(C1,C2):在:在C1中查找中查找C2是否存在,存在是否存在,存在则返回第一次出现的位置,不存在返回则返回第一次出现的位置,不存在返回0 程序运行流程:程序运行流程:Private Sub Command1_Click()Label3=FuncThe(Text1)End Sub Private Sub Command2_Click()Call ProcThe(Text1,n)End SubSub ProcThe(ByVal s$,ByRef Count%)Count=表达式表达式En
18、d Sub找子过程名调用找子过程名调用ProcTheFunction FuncThe%(ByVal s$)FuncThe=表达式表达式End Function找函数名调用找函数名调用FuncTheFuncThe函数名带了值返回函数名带了值返回函数过程函数过程子过程:子过程:只需将只需将函数过程的返回结果作为子函数过程的返回结果作为子过程的形参即可过程的形参即可6.3 参数传递参数传递 P132v将主调过程的实参传递给被调的过程,完将主调过程的实参传递给被调的过程,完成实参与形参的结合成实参与形参的结合一、形参和实参一、形参和实参v形式参数形式参数(形参形参)是在用户自定义函数过程是在用户自定义
19、函数过程Function、子过程、子过程Sub过程名后圆括号中出过程名后圆括号中出现的变量名,多个形参用逗号分隔现的变量名,多个形参用逗号分隔v实际参数实际参数(实参实参)是在调用过程时,在过程是在调用过程时,在过程名后的参数,其作用是将它们的数据名后的参数,其作用是将它们的数据(值或值或地址地址)传送给被调用过程对应的形参变量传送给被调用过程对应的形参变量一、形参和实参一、形参和实参 P132v按按位置位置传送:实参的位置、次序、类型与传送:实参的位置、次序、类型与形参的位置、次序、类型一一对应,与参形参的位置、次序、类型一一对应,与参数名没有关系数名没有关系v形参可以是:变量,带有一对括号
20、的数组形参可以是:变量,带有一对括号的数组名名v实参可以是:同类型的常数、变量、数组实参可以是:同类型的常数、变量、数组元素、表达式、数组名元素、表达式、数组名(带有一对括号带有一对括号)Sub ProcThe(ByVal s$,ByRef Count%)End SubCall ProcThe(Text1.Text,n)二、传地址与传值二、传地址与传值 P133v实参与形参的结合有两种方法:实参与形参的结合有两种方法:传地址传地址(ByRef)和传值和传值(ByVal)v传地址传地址又称为又称为引用引用,是默认的方法,是默认的方法1.1.传值方式传值方式v在形参前加关键字在形参前加关键字ByV
21、alv例:例:Private Sub f(ByVal a%)v按传值方式传递参数时,系统将实参的值传按传值方式传递参数时,系统将实参的值传递给对应的形参后,实参与形参断开了联系递给对应的形参后,实参与形参断开了联系v即使在过程体中改变了形参的值,也不会影即使在过程体中改变了形参的值,也不会影响到实参响到实参二、传地址与传值二、传地址与传值 P1332.2.传地址方式传地址方式v在形参前加关键字在形参前加关键字ByRef或或缺省关键字缺省关键字v例:例:Private Sub f(ByRef x!,y%)v按传地址方式传递参数时,要求实参必须是变按传地址方式传递参数时,要求实参必须是变量名量名(
22、不能为常量和表达式不能为常量和表达式),此时实参与形参,此时实参与形参变量共用同一个存储单元变量共用同一个存储单元v如果在过程中改变了形参的值,对应的实参也如果在过程中改变了形参的值,对应的实参也将发生改变将发生改变v例例6.6 编写交换两个数的过程,编写交换两个数的过程,Swap1用传值传用传值传递,递,Swap2用传址传递,哪个过程能真正实现用传址传递,哪个过程能真正实现两个数的交换?为什么?执行的结果如何?两个数的交换?为什么?执行的结果如何?二、传地址与传值二、传地址与传值 P1332.2.传地址方式传地址方式例例6.6 编写交换两个数的过程编写交换两个数的过程Sub Swap1(By
23、Val x%,ByVal y%)t%=x:x=y:y=tEnd SubPrivate Sub Command1_Click()a%=5:b%=8:Swap1 a,b 传值传值 Print A1=;a,B1=;b a=5:b=8:Swap2 a,b 传址传址 Print A2=;a,B2=;bEnd Suba2A025b2C168x40125y46108 58二、传地址与传值二、传地址与传值 P1332.2.传地址方式传地址方式例例6.6 编写交换两个数的过程编写交换两个数的过程Sub Swap2(x%,y%)t%=x:x=y:y=tEnd SubPrivate Sub Command1_Cli
24、ck()a%=5:b%=8:Swap1 a,b 传值传值 Print A1=;a,B1=;b a=5:b=8:Swap2 a,b 传址传址 Print A2=;a,B2=;bEnd Suba2A025b2C168xy85二、传地址与传值二、传地址与传值 P1343.3.传值和传地址的选用规则传值和传地址的选用规则v若要将被调用过程中的结果返回给主调程序,若要将被调用过程中的结果返回给主调程序,则形参必须是传地址方式。这时实参必须是则形参必须是传地址方式。这时实参必须是同类型的变量名同类型的变量名(包括简单变量、数组名、包括简单变量、数组名、结构类型等结构类型等),不能是常量和表达式,不能是常量
25、和表达式v若不希望过程改变实参的值,则应选用传值若不希望过程改变实参的值,则应选用传值的方式,这样可增加程序的可靠性和便于调的方式,这样可增加程序的可靠性和便于调试,减少过程间的关联试,减少过程间的关联v形参是数组、自定义类型时,只能是传地址形参是数组、自定义类型时,只能是传地址方式方式三、数组参数的传递三、数组参数的传递 P134v在在VB中允许参数是数组,一般数组通过中允许参数是数组,一般数组通过传址方式传址方式进行传递进行传递v注意:注意:形参是数组,只需以形参是数组,只需以数组名和圆括号数组名和圆括号表示,表示,忽略维数和大小的定义忽略维数和大小的定义在过程中可用在过程中可用LBoun
26、d和和UBound函数确定函数确定实参数组的下界和上界实参数组的下界和上界对应的实参也只要以数组名和圆括号对应的实参也只要以数组名和圆括号(可省可省)表示表示例例6.7 sum过程求数组过程求数组a各元素和,并改变数组各元素和,并改变数组各元素值各元素值 Function sum%(x()Dim i%sum=0 For i=LBound(x)To UBound(x)sum=sum+x(i)x(i)=2*x(i)Next iEnd Function调用:调用:Sub Command1_Click()Dim b(),s%b=Array(1,3,5,7,9)s=sum(b()End Sub使用过程注
27、意事项:使用过程注意事项:1.确定自定义的过程是子过程还是函数过程确定自定义的过程是子过程还是函数过程 函数过程名有值,子过程名无值。函数过程名有值,子过程名无值。2.过程中形参的个数和传递方式的确定过程中形参的个数和传递方式的确定 过程中参数的作用是实现过程与调用者的数据通信。过程中参数的作用是实现过程与调用者的数据通信。(1)从主调程序获得初值,值传递。从主调程序获得初值,值传递。(2)将结果返回给主调程序,地址传递。将结果返回给主调程序,地址传递。3.实参与形参结合时对应问题实参与形参结合时对应问题 个数、类型、位置、次序一一对应。个数、类型、位置、次序一一对应。形参是值传递,对应实参可
28、以是表达式、常量、数组元形参是值传递,对应实参可以是表达式、常量、数组元素。素。形参是地址传递,对应实参只能是简单变量。形参是地址传递,对应实参只能是简单变量。数组、记录类型、对象只能是地址传递。数组、记录类型、对象只能是地址传递。Sub f1(x)x=f2(xx)*3End SubSub Command1_Click()Call f1(y)End SubFunction f2(x)f2=x*xEnd FunctionSub f1(x)Call f1(y)End SubSub Command1_Click()Call f1(y)End Sub过程的嵌套调用的特殊情况过程的嵌套调用的特殊情况过程
29、的嵌套调用过程的嵌套调用二、过程的递归调用二、过程的递归调用1.1.递归的概念递归的概念v用自身的结构来描述自身就称为用自身的结构来描述自身就称为“递归递归”v例对阶乘的定义:例对阶乘的定义:2.2.过程的递归调用过程的递归调用v过程的递归调用就是在过程中过程的递归调用就是在过程中“自己调用自己调用自己自己”vVB允许一个子过程或函数在自身定义的内允许一个子过程或函数在自身定义的内部调用自己,这样的子过程或函数称为递部调用自己,这样的子过程或函数称为递归子过程或递归函数归子过程或递归函数6.4 过程的嵌套和递归调用过程的嵌套和递归调用 P136v例例6.8 编编fac(n)=n!的递归函数的递
30、归函数Function fac(n As Integer)As Integer If n=1 Then fac=1 Else fac=n*fac(n-1)End IfEnd FunctionSub Command1_Click()Print“fac(4)=”;fac(4)End Sub结果:结果:fac(4)=24递推递推回归回归fac(2)=2*fac(1)fac(1)=1fac(4)=4*6fac(3)=3*2fac(2)=2*1fac(3)=3*fac(2)fac(4)=4*fac(3)二、过程的递归调用二、过程的递归调用 P1372.2.过程的递归调用过程的递归调用v在递归处理中,用在
31、递归处理中,用栈栈来实现。栈中存放形参、来实现。栈中存放形参、局部变量、返回地址局部变量、返回地址v递推过程:每调用自身,当前参数压栈,直递推过程:每调用自身,当前参数压栈,直到达到递归结束条件到达到递归结束条件v回归过程:不断从栈中弹出当前的参数,直回归过程:不断从栈中弹出当前的参数,直到栈空到栈空v构成递归的条件如下:构成递归的条件如下:递归结束条件及结束时的值递归结束条件及结束时的值能用递归形式表示,并且递归向终止条件发展能用递归形式表示,并且递归向终止条件发展例例6.9利用递归求最大公约数利用递归求最大公约数Public Function gcd(m As Integer,n As I
32、nteger)As Integer If(m Mod n)=0 Then gcd=n Else gcd=gcd(n,m Mod n)End IfEnd FunctionPrivate Sub Form_Click()Print gcd(10,4)End Sub例例6.10 打印分形图打印分形图二、过程的递归调用二、过程的递归调用 P1392.2.过程的递归调用过程的递归调用v注意:注意:递归算法设计简单,但消耗的机时和占据的递归算法设计简单,但消耗的机时和占据的内存空间比非递归大内存空间比非递归大设计一个正确的递归子过程或函数过程必须设计一个正确的递归子过程或函数过程必须注意两点要素:其一具备
33、递归条件;其二是注意两点要素:其一具备递归条件;其二是具备递归结束的条件具备递归结束的条件一般,递归函数过程对于求阶乘、级数、指一般,递归函数过程对于求阶乘、级数、指数运算有特殊效果数运算有特殊效果vVB应用程序由若干个过程组成,这些过应用程序由若干个过程组成,这些过程一般保存在窗体文件程一般保存在窗体文件.Frm或标准模块或标准模块文件文件.Bas中中v变量在过程中是必不可少的,它可以在变量在过程中是必不可少的,它可以在不同模块、过程中声明,还可以用不同不同模块、过程中声明,还可以用不同的关键字声明的关键字声明v作用域作用域:变量变量、过程随所处的位置不同,、过程随所处的位置不同,声明关键字
34、不同,可被访问的范围声明关键字不同,可被访问的范围6.5 变量的作用域变量的作用域 P139一、过程的作用域一、过程的作用域 P140v窗体窗体/模块级模块级:加:加Private关键字的过程,只关键字的过程,只能被定义的窗体或标准模块中的过程调用能被定义的窗体或标准模块中的过程调用v全局级全局级:加:加Public关键字关键字(缺省缺省)的过程,可的过程,可供该应用程序的所有窗体和所有标准模块中供该应用程序的所有窗体和所有标准模块中的过程调用的过程调用二、变量的作用域二、变量的作用域 P140v变量的作用域决定了哪些子过程和函数过程可变量的作用域决定了哪些子过程和函数过程可访问该变量访问该变
35、量v局部变量局部变量:在过程内用:在过程内用Dim或或Static语句声明的语句声明的变量,只能在变量,只能在本过程本过程中使用中使用(缺省缺省)v窗体窗体/模块级变量模块级变量:用:用Private、Dim关键字,在关键字,在窗体模块窗体模块Form的通用声明段或标准模块声明的的通用声明段或标准模块声明的变量。可被所声明的变量。可被所声明的模块模块中任何过程访问中任何过程访问v全局变量全局变量:也称公有的模块级变量,是用:也称公有的模块级变量,是用Public关键字声明的变量。全局变量的作用域关键字声明的变量。全局变量的作用域是是整个应用程序整个应用程序二、变量的作用域二、变量的作用域 P1
36、41例如在标准模块文件和例如在标准模块文件和Form1窗体中定义不同级窗体中定义不同级的变量声明:的变量声明:Public Pa As Integer Private Mb As string*10Sub F1()Dim x As Integer Dim y As IntegerEnd SubSub F2()Dim m As SingleEnd SubPublic Fa As Integer Dim Fb As IntegerSub Form_Load()Dim i As IntegerEnd SubSub Command1_Click()Dim i As IntegerEnd Sub二、变量
37、的作用域二、变量的作用域 P141若在不同级声明相同的变量名,系统按局部、若在不同级声明相同的变量名,系统按局部、窗体窗体/模块、全局次序访问如模块、全局次序访问如:Public Temp As Integer 全局变量全局变量 Sub Form_Click()Dim Temp As Integer 局部变量局部变量 Temp=10 访问局部变量访问局部变量 Form1.Temp=20 访问全局变量必须加窗访问全局变量必须加窗体名或体名或Me关键字关键字 Print Form1.Temp,Temp 显示显示 20 10 End Sub三、静态变量三、静态变量 P142v局部变量声明的方法:局部
38、变量声明的方法:Dim 声明,随过程的调用而分配存储单元,声明,随过程的调用而分配存储单元,每次调用都对变量初始化每次调用都对变量初始化;过程体结束,;过程体结束,变量的内容自动消失,存储单元释放变量的内容自动消失,存储单元释放Static 声明声明,每次调用过程,变量保持原,每次调用过程,变量保持原来的值来的值v形式为:形式为:Static 变量名变量名 AS 类型类型Static Function 函数过程名函数过程名(参数列表参数列表)As 类型类型Static Sub 子过程名子过程名(参数列表参数列表)三、静态变量三、静态变量 P142例例6.12 利用局部变量利用局部变量Count
39、统计单击窗体次数统计单击窗体次数Private Sub Form_Click()Dim Count%Count=Count+1 Print 已单击窗体已单击窗体;Count;次次End SubStatic思考:用户也可以将思考:用户也可以将Count声明为模块级变量。声明为模块级变量。试思考用试思考用Static声明的局部变量与声明为声明的局部变量与声明为模块级的共同点和区别?模块级的共同点和区别?6.6 综合应用综合应用 P143一、数制转换一、数制转换例例6.13 将一个十进制整数将一个十进制整数m转换成转换成 r(216)进进制字符串。制字符串。方法:将方法:将m不断除不断除 r 取余数
40、,直到商为零,以取余数,直到商为零,以反序得到结果反序得到结果例例6.14编写加密和解密的函数过程并调用。编写加密和解密的函数过程并调用。简单加密的思想是:简单加密的思想是:将每个字母将每个字母c加一序数加一序数key,例如序数,例如序数key为为2,这时这时“A”C”,”a”c”,”B”D”v如何在字符串中提取每一个字符?如何在字符串中提取每一个字符?v如何判断输入的字符是否为字母?如何判断输入的字符是否为字母?v如何实现字符型的字母与数值型序数之间的如何实现字符型的字母与数值型序数之间的运算运算?v当加序数后的字母超过当加序数后的字母超过“Z”或或“z”,如何,如何处理?处理?6.6 综合
41、应用综合应用P145Mid(C,N1,N2)c=chr(Asc(c)+key)c=chr(Asc(c)+key-26)Public Function Code(ByVal s$,ByVal Key%)加密加密 Dim c As String*1,iAsc%Code=For i=1 To Len(s)c=Mid$(s,i,1)取第取第i个字符个字符 Select Case c Case A To Z 大写字母加序数加密大写字母加序数加密 iAsc=Asc(c)+Key If iAsc Asc(Z)Then iAsc=iAsc-26 加密后字母超过加密后字母超过Z Code=Code+Chr$(i
42、Asc)Case a To z iAsc=Asc(c)+Key 小写字母加序数加密小写字母加序数加密 If iAsc Asc(z)Then iAsc=iAsc-26 Code=Code+Chr$(iAsc)Case Else 当第当第i个字符为其它字符时不加密个字符为其它字符时不加密,与加密字符串的前与加密字符串的前i-1个字符连接个字符连接 Code=Code+c End Select Next iEnd FunctionPrivate Command1_Click()Text2=Code(Text1,2)End SubPublic Function Recode(ByVal s$,ByVa
43、l Key%)解密与加密正好逆处理解密与加密正好逆处理 Dim c As String*1,iAsc%Recode=For i=1 To Len(s)c=Mid$(s,i,1)If(c=A And c=Z)Then iAsc=Asc(c)-Key If iAsc=a And c=z)Then iAsc=Asc(c)-Key If iAsc=0 Then MsgBox(找到的位置为找到的位置为&n)Else MsgBox(找不到找不到)End SubKeya(mid)low=mid+1 查找区域缩小一半查找区域缩小一半,继续继续直到找到或查找区直到找到或查找区域中无元素域中无元素.本例用递归实现
44、本例用递归实现6.16 Sub birsearch(a(),low%,high%,key ,index%)(2)二分法查找二分法查找要查找的数组要查找的数组必须有序必须有序。思想:要查找的关键值思想:要查找的关键值Key同数组的中间同数组的中间mid项元素比较项元素比较:12345678111222333444555666777888Lowhighmid444Key四、排序四、排序 P113选择、冒泡、插入法排序等。选择、冒泡、插入法排序等。前两种排序欲排序的数据全部输入后,再进行排序;前两种排序欲排序的数据全部输入后,再进行排序;插入法排序每输入一项,马上插入到数组应在的位置,插入法排序每输
45、入一项,马上插入到数组应在的位置,数组始终有序。数组始终有序。例例6.17 实现的步骤:实现的步骤:(1)输入欲排序的数据项输入欲排序的数据项x;在数组在数组a中找中找x应所处的应所处的位置位置j;(2)从数组的最后一个元素开始到下标从数组的最后一个元素开始到下标j依次往后移,依次往后移,使使j位置空出;位置空出;(3)将将x放入位置放入位置j处,一个数据插入完成;处,一个数据插入完成;(4)有若干个数重复有若干个数重复(1)(3)。五、高次方程求根五、高次方程求根 P116 有牛顿迭代法、二分法、弦截法等有牛顿迭代法、二分法、弦截法等(1)牛顿迭代法)牛顿迭代法例例6.18迭代公式:迭代公式
46、:思想:思想:对方程给定一个初值对方程给定一个初值x0作为方程的作为方程的 近似根,利用迭代公式,求得近似根,利用迭代公式,求得x1,当当 x1为求得的近似根,否则为求得的近似根,否则x1作为作为x0再迭代。再迭代。(2)二分法求根二分法求根 思想:思想:已知求根区间已知求根区间a,b有一根,每次把求根区间缩小一半,直到找到解有一根,每次把求根区间缩小一半,直到找到解或求根区间足够小。或求根区间足够小。方法:求方法:求a,b的中点的中点c,判断:判断:f(c)=0,,c为求得的根为求得的根,结束,结束;f(a)与与f(c)同号,同号,则则a,c无根,代替无根,代替a;否则否则c,b无根,无根,
47、c代替代替b;使求根区间缩小一半,重复上述步骤,直到区间小于精度。使求根区间缩小一半,重复上述步骤,直到区间小于精度。Public Function halfRoot(ByVal a!,ByVal b!)Dim c!Do While Abs(b-a)0.00001 c=(a+b)/2 If f(c)=0 Then Exit Do ElseIf f(a)*f(c)0 Then a=c Else b=c End If Loop halfRoot=cEnd Function6.例例6.19数值积分数值积分有矩形法、梯形法、抛物线法(又称辛卜生法)等。有矩形法、梯形法、抛物线法(又称辛卜生法)等。梯形
48、法积分的思想是:梯形法积分的思想是:将积分区间将积分区间a,bn等分,小区间的长度为,等分,小区间的长度为,第第i块小矩形的近似面积为:块小矩形的近似面积为:整个积分的结果为这整个积分的结果为这n块小面积的累加,即块小面积的累加,即:Public Function trapez(ByVal a!,ByVal b!,ByVal n%)As Single Dim sum!,h!,x!h=(b-a)/n sum=(f(a)+f(b)/2 For i=1 To n-1 x=a+i*h sum=sum+f(x)Next itrapez=sum*hEnd Function七、字符串处理七、字符串处理 P1
49、18例例6.20 编写一个英文打字训练的程序编写一个英文打字训练的程序.要求如下:要求如下:(1)在标签框内随机产生在标签框内随机产生30个字母的范文;个字母的范文;(2)当焦点进入文本框时开始计时,并显示当时时间;当焦点进入文本框时开始计时,并显示当时时间;(3)在键入文本框按产生的范文输入相应的字母;在键入文本框按产生的范文输入相应的字母;(4)当键入满了当键入满了30个字母后结束计时,禁止向文本框输入个字母后结束计时,禁止向文本框输入内容内容,与范文逐一比较,显示打字的速度和正确率。,与范文逐一比较,显示打字的速度和正确率。重点与作业重点与作业重点重点 掌握函数过程和子过程的定义和掌握函数过程和子过程的定义和调用方法及区别调用方法及区别 掌握参数的两种传递方式掌握参数的两种传递方式 熟悉变量作用域及静态变量的含熟悉变量作用域及静态变量的含义义课后思考题课后思考题 P150 3、4、6