收藏 分销(赏)

VB第六章.ppt

上传人:w****g 文档编号:13350505 上传时间:2026-03-06 格式:PPT 页数:47 大小:1.14MB 下载积分:8 金币
下载 相关 举报
VB第六章.ppt_第1页
第1页 / 共47页
VB第六章.ppt_第2页
第2页 / 共47页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Visual Basic,程序设计,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第六章 过 程,6.1,函数过程的定义与调用,6.2,子过程的定义与调用,6.3,参数传递,6.4,递归,6.5,变量、过程的作用域,6.6,综合应用,6.7,重点和难点,1,6.1,函数过程的定义,6.1.1,引例,已知多边形的各条边的长度,计算多边形的面积。,计算多边形面积,可将多边形分解成若干个三角形。,计算三角形面积的公式如下:,x,y,z,定义函数过程,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(),输入若干个三角形边长,S=area(a,b,c)+area(c,d,e)+area(e,f,g),Print S,End Sub,2,6.1.2,函数过程的定义,1.,自定义函数过程有两种方法,(1),利用“工具”菜单下的“添加过程”命令定义,生成一个函数的框架。,(2),利用代码窗口直接定义。,2.,函数过程形式,Private|Public Static Function,函数过程名,(,参数列表,)As,类型,局部变量或常数定义,语句块,1,函数名,=,返回值,Exit Function,语句块,2,函数名,=,返回值,End Function,函数过程体,3,3.,说明,(,1,),Static,、,Private,、,Public,:意义与过程的作用域有关。,(,2,)函数过程名:命名规则同变量名。,(,3,)参数列表形式,:ByVal|ByRef,形参名,()As,类型,称为形参或哑元,只能是变量或数组名,不能是常量、数组元素或表达式。形参仅表示参数的个数、类型,无值。,ByVal,表示当过程被调用时,参数按值传递,缺省或,ByRef,表示当过程被调用时,参数按地址传递。无参数时函数过程名后的括号不能省略,这是函数过程的标志。,(,4,),AS,类型:函数返回值的类型。若省略,则返回变体类型。,(,5,)函数名,=,返回值:在函数体内,函数名可以当变量使用,函数的返回值就是对函数名的赋值语句实现的,在函数体内至少对函数名赋值一次。,(,6,),Exit Function,或,End Function,:表示退出函数过程。,总之,函数过程名有值,有类型,在过程体内至少被赋值一次。,例,6.2,编一求最大公约数的函数过程。,4,6.1.3,函数过程的调用,1.,调用形式:函数过程名,(,参数列表,),参数列表,(,称为实参或实元,),:传递给过程的变量或表达式。,Sub Form_Click,Dim x%,y%,z%,x=124:y=24,z=gcd(x,y),MsgBox(,最大公约数是,&z),End Sub,2.,程序运行流程,Function gcd(m%,n%)As Integer,r=m Mod n,Do While(r 0),m=n:n=r:r=m Mod n,Loop,gcd=n,End Function,5,3.,函数过程调用时应注意的问题,(,1,)参数列表称为实参,它必须与形参保持个数相同,位置与类型一一对应(也允许形参与实参个数不同),实参可以是同类型的常量、变量、数组元素或表达式。,(,2,)因为函数名要返回一个值,所以函数调用不是一条独立的语句,不能独立存在。,(,3,)调用时把实参的值传递给形参称为参数传递。值传递时实参的值不随形参的变化而变化,而地址传递时实参随形参的值一起改变。,(,4,)当参数是数组时,形参与实参声明时应省略其维数和大小,但括号不能省略。,6,例,6.3,编一函数,统计字符串中汉字的个数。,分析:在,VB,中,字符以,Unicode,码存放,每个汉字和英文是一个字符、占有两个字节,区别是汉字的机内码最高位为,1,,若利用,Asc,函数求其码值为小于,0,(以补码表示),而西文字符的最高位为,0,,,Asc,函数求其码值为大于,0,。,7,大家应该也有点累了,稍作休息,大家有疑问的,可以询问和交流,8,6.2,子过程的定义与调用,6.2.1,引例,以下情况使用函数过程存在不足:,不是为了获得某个函数值,而是为了某种功能的处理。,要获得多个结果。,VB,中提供了使用更灵活的子过程。,例,6.4,编一过程,对,Label1,控件进行移动,通过参数,Tag,的值(,1,或,-1,)决定移动方向。,该过程不是为了计算获得某个结果,而是进行对控件移动的处理。,9,6.2.2,子过程定义,Private|Public,Static,Sub,子过程名,(,参数列表,),局部变量或常数定义,语句块,1,Exit Sub,语句块,2,End Sub,说明:(,1,)子过程名、形参同函数过程中对应项的规定。,(,2,)子过程名无值、无类型,子过程中不能给过程名赋值。,6.2.3,子过程的调用,子过程名,参数列表,或,Call,子过程名,(,参数列表,),说明:,(,1,)若使用,Call,则实参列表要用括号括起来,若无,Call,则括号可有可无。,(,2,)若实参要获得子过程的返回值,则实参只能是变量,不能是常量或表达式,也不能是控件名。,(,3,)过程调用是一条独立的语句。,10,6.2.4,子过程与函数过程区别,(1),函数过程名有值,有类型,在函数体内至少赋值一次;,子过程名无值,无类型,在子过程体内不能对子过程名赋值。,(2),调用时,子过程调用是一句独立的语句;,函数过程不能作为单独的语句加以调用,必须参与表达式运算。,(3),一般当过程有一个返回值,使用函数过程较直观;反之若过程无返回值,或有多个返回值,使用子过程较直观。把某功能定义成函数或是过程,没有严格的规定。但只要能用函数定义的,就肯定能用过程定义,反之不一定。,6.2.5,形参个数的确定,(1),形参是过程与主程序交互的接口,从主程序获得初值,或将计算结果返回给主调程序。不要将过程中所有使用过的变量均作为形参。若只在过程内部使用,则声明为局部变量。,(2),形参没有具体的值,只代表了参数的个数、位置、类型;只能是简单变量、数组名,不能是常量、数组元素、表达式。,11,例,6.5,分别编一统计字符串,S,中定冠词,the,出现个数的子过程和函数过程,并分别调用。,处理方法:利用,InStr,函数反复在字符串,S,找,the,子串。,Function FuncThe%(ByVal s$),Dim Count%,i%,Count=0,s=Trim(s),i=InStr(s,“the),Do While i 0,Count=Count+1,s=Mid(s,i+3),i=InStr(s,“the),Loop,FuncThe=Count,End Function,Sub ProcThe(ByVal s$,ByRef Count%),Dim i%,Count=0,s=Trim(s),i=InStr(s,“the),Do While i 0,Count=Count+1,s=Mid(s,i+3),i=InStr(s,“the),Loop,End Sub,函数的调用:,Label3=FuncThe(Text1),过程的调用:,Dim n%,Call ProcThe(Text1,n),Label4=n,可以看出:对同一问题定义两种过程时,只要抓住函数过程和子过程的区别,即函数名有一个值、子过程名无值的特点。当定义好函数过程后,要改为子过程,只要将函数过程的返回结果作为子过程的形参,即在子过程中增加一个参数;反之也然。,12,6.3,参数传递,6.3.1,形参与实参,在参数传递中,一般是按位置传送,也可以按名传送。,按位置传送是最常用的参数传递方法,按实参的位置、次序、类型与形参的位置、次序、类型一一对应传送,与参数名没有关系。,如在调用标准函数时,用户根本不知道形参名,只要关心形参的个数、类型、位置,例如,Mid,函数形式:,Mid,(,字符串,$,,起始位,%,,取几位,%),调用语句:,s=Mid(This is VB,,,9,,,2),则,s,中的结果为“,VB”,。,13,6.3.2,传址与传值,实参与形参的结合有传址,(ByRef),和传值,(ByVal),两种方法。,传址方式参数结合过程,当调用一个过程时,它将实参的地址传递给形参。因此在被调过程体中对形参的任何操作都变成了对相应实参的操作,实参的值就会随过程体内对形参的改变而,改变,。,2.,传值方式参数结合过程,当调用一个过程时,系统将实参的值复制给形参,实参与形参断开了联系。在过程体内对形参的任何操作不会影响到实参。,14,Sub Swap2(x%,y%),Dim t%,t=x:x=y:y=t,End Sub,例,6.6,两个变量的交换。,Sub Swap1(ByVal x%,ByVal y%),Dim t%,t=x:x=y:y=t,End Sub,Private Sub Command1_Click(),Dim a%,b%,a=10:b=20,Swap1 a,b,Print A1=;a,B1=;b,a=10:b=20,Swap2 a,b,Print A2=;a,B2=;b,End Sub,15,3.,传址与传值的选择,选用传值还是传地址一般进行如下考虑:,(,1,)要将被调过程中的结果返回给主调程序,则形参必须是传址方式。这时实参必须是同类型的变量名,(,包括简单变量、数组名、结构类型等,),,不能是常量、数组元素、表达式。,(,2,)不希望过程修改实参的值,则应选用传值方式,减少各过程间的关联。因为在过程体内对形参的改变不会影响实参。,(,3,)形参是数组及自定义类型时都是地址传递。,16,例,6.7,如下,sum,子过程求数组,a,各元素和、并改变数组各元素值:,Function sum%(x()As Integer),Dim i%,sum=0,For i=0 To UBound(x),sum=sum+x(i),x(i)=2*x(i),Next i,End Function,6.3.3,数组参数的传递,当参数是数组时,通过传址方式进行传递。注意:,(,1,)在实参和形参中写数组名,忽略维数的定义,但圆括号不能省。,(,2,)被调过程可通过,Lbound,和,Ubound,函数确定实参数组的下、上界。,Private Sub Command1_Click(),Dim b(),s%,b=Array(1,3,5,7,9),s=sum(b(),Print,数组,b,的各元素和为:,;s,Print,数组,b,的各元素值为:,For i=0 To UBound(b),Print b(i);,Next,End Sub,17,Sub f1(x),x=f2(xx)*3,End Sub,Sub Command1_Click(),Call f1(y),End Sub,Function f2(x),f2=f3(x)+3,End Function,Function f3(x),f3=x*x,End Function,Sub f1(x),Call f1(y),End Sub,6.4.1,过程的嵌套调用,Sub Command1_Click(),Call f1(y),End Sub,6.4.2,过程的递归调用,6.4,过程的嵌套与递归调用,18,1.,递归的概念,用自身的结构来描述自身就称为“递归”。例对阶乘的定义:,2.,递归过程,过程在自身定义的内部调用自己。,例,6.8,编,fac,(n)=n,!,的递归函数,Sub Command1_Click(),Print“fac(4)=”,;,fac(4),End Sub,结果:,fac(4)=24,Function fac(n As Integer)As Integer,If n=1 Then,fac=1,Else,fac=n*fac(n-1),End If,End Function,19,递推,回归,在递归处理中,用栈来实现。栈中存放形参、局部变量、返回地址。,递推过程:每调用自身,当前参数压栈,直到达到递归结束条件。,回归过程:不断从栈中弹出当前的参数,直到栈空。,递归算法设计简单,但消耗的机时和占据的内存空间比非递归大。,思考:,若上述,fac,函数中,少了,:,If n=1 Then fac=1,即仅有语句:,fac=n*fac(n-1),或,n 1)Then ,当没有到底层,递归调用,u1=(x1+x2)/2 ,三条边的中点,u2=(x2+x3)/2,v1=(y1+y2)/2,Call triangle(u1,x2,u2,v1,y2,k-1),递归调用,Call triangle(x1,u1,x2,y1,v1,k-1),Call triangle(x2,u2,x3,y1,v1,k-1),Else,picture1.Line(x1,y1)-(x3,y1),到达递归底层画三角形,picture1.Line(x1,y1)-(x2,y2),picture1.Line(x2,y2)-(x3,y1),End If,End Sub,23,6.5,过程与变量的作用域,作用域:,过程、变量随所处的位置不同,可被访问的范围称为过程或变量的作用域。,VB,工程的组成:,应用程序(,.vbp,文件),至少一个或若干个窗体模块文件(,.frm,),可有一个或若干个标准模块文件(,.bas,),事件过程(,Sub,),自定义过程(,Sub,),自定义函数(,Function,),自定义过程(,Sub,),自定义函数(,Function,),类模块,(.cls),24,6.5.1,过程的作用域,窗体,/,模块级:加,Private,关键字的过程,只能被定义的窗体或模块中的过程调用。,全局级:加,Public,关键字(缺省)的过程,可供该应用程序的所有窗体和所有标准模块中的过程调用。,25,6.5.2,变量的作用域,局部变量:在一个过程内用,Dim,或,Static,语句声明的变量,只能在本过程中使用。,模块级变量:在窗体或模块的通用声明段用,Dim,、,Private,语句声明的变量,可被本模块的任何过程访问。,全局变量:在模块级用,Public,语句声明的变量,可被应用程序的任何过程或函数访问。,26,例,6.11,在下面一个标准模块文件中不同级的变量声明:,标准模块内:,Public pa As integer,Private mb As string*10,Sub F1(),Dim fa As integer,End Sub,Sub F2(),Dim fb As Single,End Sub,窗体内:,Public fa as integer,Dim fb as integer,Private Sub Form_Load(),Dim i as integer,End Sub,Private Sub Command1_Click(),Dim i as integer,End Sub,请说明哪些是全局级、模块级、局部变量?如何使用?,27,注意:若在不同级声明相同的变量名,系统按局部、窗体,/,模块、全局次序访问。例如,:,Public Temp As integer,全局变量,Sub Form_Load,(),Dim Temp As Integer,局部变量,Temp=10,访问局部变量,Form1.Temp=20 ,访问全局变量必须加窗体名,Print Form1.Temp,Temp,显示,20 10,End Sub,一般来说,在同一模块中定义了不同级而名字相同的变量时,系统优先访问作用域小的变量名。若想访问全局变量,则必须在全局变量名前加模块名。为了避免混淆,不要定义不同级别但名字相同的变量。,28,6.5.3,静态变量,在局部变量声明时:,Dim,声明,随过程的调用而分配存贮单元,每次调用都对变量,初始化;过程体结束,变量的内容自动消失,存储单元释放。,Static,声明,每次调用过程,变量保持原来的值。,声明形式:,Static,变量名,AS,类型,Static Function,函数过程名,(,参数列表,)As,类型,Static Sub,子过程名,(,参数列表,),过程名前加,Static,,表示该过程内的局部变量都是静态变量。,例,6.12,编一程序,利用局部变量,count,统计单击窗体的次数。,Private Sub Form_Click(),Dim count%,count=count+1,Print count;“,次”,End Sub,Static,29,1.,数制转换,例,6.13,将一个十进制整数,m,转换成,r,(216),进制字符串,并对八、十六进制数调用内部函数加以验证。,方法:将,m,不断除,r,取余数,直到商为零,以反序得到结果。,6.6,综合应用,30,Function TD(ByVal m%,ByVal r%),TD=,Do While m 0,c=m Mod r,If c 9 Then,超过,9,转换成对应的,A,Z,十六进制表示形式,TD=Chr(c-10+65)&TD,Else,TD=c&TD,End If,m=m r,Loop,End Function,31,Private Sub Command1_Click(),Dim m0%,r0%,m0=Val(Text1),输入十进制正整数,r0=Val(Text2),输入,r,进制,If r0 16 Then MsgBox(,数制超出范围,):End,Text3=TD(m0,r0),调用转换函数,显示转换结果,End Sub,Private,Sub Command2_Click(),Text4=Oct(Val(Text1),调用,Oct,函数转换成八进制数,End Sub,Private,Sub Command3_Click(),Text5=Hex(Val(Text1),调用,Hex,函数转换成十六进制数,End Sub,32,R,进制转换为十进制:,Function ct(s$,r%)As Long,Dim i%,c As String*1,p&,p=0,For i=1 To Len(s),c=Mid(s,i,1),Select Case UCase(c),Case 0 To 9,p=p*r+Val(c),Case A To“F,p=p*r+Asc(c)-Asc(A)+10,End Select,Next i,ct=p,End Function,33,2.,加密和解密,简单加密的思想是:将每个字母,C,加一序数,K,,式子,c=chr(Asc(c)+k),例如序数,k,为,5,,这时,“,A”,“F”,,“,a”,“f”,,“,B”,“G”,当加序数后的字母超过“,Z”,或“,z”,则,c=chr(Asc(c)+k-26),。,解密为加密的逆过程。,例,6.14,编一加密和解密的程序。,34,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 ,大写字母加序数,Key,加密,iAsc=Asc(c)+Key,If iAsc Asc(Z)Then iAsc=iAsc-26 ,加密后字母超过,Z,Code=Code+Chr(iAsc),Case a To z,iAsc=Asc(c)+Key ,小写字母加序数,Key,加密,If iAsc Asc(z)Then iAsc=iAsc-26,Code=Code+Chr(iAsc),Case Else ,当第,i,个字符不加密时,与加密字符串的前,i-1,个字符连接,Code=Code+c,End Select,Next i,End Function,Private Sub Command1_Click(),加密事件,Text2=Code(Text1,2),调用,End Sub,35,Function ReCode(ByVal s$,ByVal Key%),Dim c As String*1,iAsc%,ReCode=,For i=1 To Len(s),c=Mid$(s,i,1)取第i个字符,Select Case c,Case A To Z 大写字母加序数Key加密,iAsc=Asc(c)-Key,If iAsc Asc(A)Then iAsc=iAsc+26 加密后字母超过Z,ReCode=ReCode+Chr(iAsc),Case a To z,iAsc=Asc(c)-Key 小写字母加序数Key加密,If iAsc Asc(a)Then iAsc=iAsc+26,ReCode=ReCode+Chr(iAsc),Case Else 当第i个字符不加密时,与前i-1个字符连接,ReCode=ReCode+c,End Select,Next i,End Function,36,3.,查找,(1),顺序查找,例,6.15,。,顺序查找根据查找的关键值与数组中的元素逐一比较,(,数组可无序,),Public Sub Search(a()As Variant,ByVal key,index%),Dim i%,For i=LBound(a)To UBound(a),If key=a(i)Then ,找到,元素的下标在,index,中,结束查找,index=i,Exit Sub,End If,Next i,index=-1,End Sub,Private Sub Form_Click(),Dim b()As Variant,b=Array(1,3,5,7,9,2,4),k=Val(InputBox(,指定数据,1-5,7,9),Call Search(b,k,n%),If n=-1 Then Print,没找到!,Else Print n,End Sub,37,Keya(mid),则,low=mid+1 查找区域缩小一半,继续,直到找到或查找区,域中无元素,。,本例可以用递归实现,也可以用循环实现。,Sub birsearch(a(),low%,high%,key ,index%),(2),二分法查找,要查找的数组必须有序。,思想:要查找的关键值,Key,同数组的中间,mid,项元素比较,:,12,34,56,78,111,222,333,444,555,666,777,888,Low,high,mid,444,Key,38,递归过程:,Sub birsearch(a(),ByVal low%,ByVal high%,ByVal key,index%),Dim mid As Integer,mid=(low+high)2 ,取查找区间的中点,If a(mid)=key Then,index=mid ,查找到,返回查找到的下标,Exit Sub,ElseIf low high Then ,二分法查找区间无元素,查找不到,index=-1,Exit Sub,End If,If key a(mid)Then ,查找区间在上半部,high=mid-1,Else,low=mid+1 ,查找区间在下半部,End If,Call birsearch(a,low,high,key,index),递归调用查找函数,End Sub,39,非递归过程:,Sub search(a(),ByVal low%,ByVal high%,ByVal key,index%),Dim mid As Integer,index=-1,Do While low high,mid=(low+high)2 ,取查找区间的中点,If a(mid)=key Then,index=mid ,查找到,返回查找到的下标,Exit Sub,ElseIf key a(mid)Then,high=mid 1,Else,low=mid+1,End if,Loop,End Sub,Private Sub Command1_Click(),Dim b()As Variant,b=Array(5,13,19,21,37,56,64,75,80,88,92),Call birsearch(b,LBound(b),UBound(b),21,n%),Print n,End Sub,40,4.,例,6.16,高次方程求根,有,牛顿迭代法、二分法、弦截法等,(,1,)牛顿迭代法,迭代公式:,思想:,对方程给定一个初值,x,0,作为方程的,近似根,利用迭代公式,求得,x,1,当,x,1,为求得的近似根,否则,x,1,作为,x,0,再迭代。,41,Public Sub newton(ByVal x0#,x#,ByVal eps#),Dim fx#,f1x#,Do,fx=3*x0*x0*x0-4*x0*x0-5*x0+13,f1x=9*x0*x0-8*x0-5,x=x0-fx/f1x,if Abs(x-x0)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=c,End Function,43,5.,字符串处理,例,6.,17,编写一个英文打字训练的程序,.,要求如下:,(1),在文本框内随机产生,30,个字母的范文;,(2),当焦点进入文本框时开始计时,并显示当时时间;,(3),在键入文本框按产生的范文输入相应的字母;,(4),当键入满了,30,个字母后结束计时,禁止向文本框输入内容,与范文逐一比较,显示打字的速度和正确率。,44,Dim t As Date,per%,Private Sub Command1_Click(),产生,30,个字母的范文,Randomize,For i=1 To 30,a=Chr$(Int(Rnd*26)+65),随机产生大写字母,Text1=text1+a ,产生的字母连入范文框,Next i,Text2.Locked=False,End Sub,Private Sub Command2_Click(),End,End Sub,Private Sub Text2_GotFocus(),t=Time ,键入文本框获得焦点,开始计时,Text3=Time,End Sub,Private Sub Command3_Click(),Text1=“:Text2=“:Text3=“:Text4=,ProgressBar1.Value=0,per=0,End Sub,45,Private Sub Text2_KeyPress(KeyAscii As Integer),per=per+1,If per=30 Then ProgressBar1.Value=Int(per/30*100),If Len(Text2)=30 Then ,键入满,30,个字符,t2=DateDiff(“s”,t,Time),计算时间,Text3=,30 t2&字/秒,显示速度,Text2.Locked=True ,不允许再修改,y=0:n=0,For i=1 To 30 ,比较正确率,If Mid(Text1,i,1)=Mid(Text2,i,1)Then,y=y+1,Else,n=n+1,End If,Next i,y=y/(y+n)*100,Text4=Format(y,0.00)&%,显示正确率,End If,End Sub,46,6.7,重点和难点,1,.,确定自定义的过程是子过程还是函数过程,函数过程名有值,子过程名无值。,若过程有一个返回值,则使用函数过程;,若返回多个值或无返回值,一般使用子过程,。,2,过程中形参的个数和传递方式的确定,过程中参数的作用是实现过程与调用者的数据通信。,(1),从主调程序获得初值,值传递。,(2),将结果返回给主调程序,地址传递。,(3),数组、记录类型、对象只能是地址传递。,3.,实参与形参结合时对应问题,个数、类型、位置、次序一一对应。,形参是值传递,对应实参可以是表达式、常量、数组元素。,形参是地址传递,对应实参只能是简单变量。,47,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服