1过程的引入:使同类的操作不重复编写,写一次多次用把一项复杂的工作分成简单的功能块,分而治之过程:完成一段独立功能,可供其他过程使用(调用)。调用过程:调用其他过程的过程调用过程:调用Sprg1调用Sprg1调用Sprg2子过程:Sprg1子过程:Sprg22引例6.1已知多边形各条边的长度,计算多边形的面积。计算多边形面积,可将多边形分解成若干个三角形。计算三角形面积的公式如下:abdefgS1cS2S3)(21))()((zyxczcycxccarea本章目录可将需重复计算三角形面积的功能自定义为一个过程,供事件过程多次调用。3常用过程分类:Sub过程Function过程事件过程自定义子过程内部函数(标准函数)自定义函数过程1)过程是一段程序代码,是相对独立的逻辑模块。2)一个完整的VB应用程序由若干过程和模块组成。本节主要介绍用户自定义的Sub子过程:完成一定的操作和功能,无返回值。Function函数过程:完成一定的操作和功能,并且可将数据处理的结果返回。4有两种方法:(1)利用“工具”菜单的“添加过程”命令定义生成一个函数的框架。(2)利用代码窗口直接定义。函数过程形式为:[Public|Private]Function函数过程名([形参列表])[As类型]局部变量或常数定义语句块1函数名=表达式函数过程体[ExitFunction]语句块2函数名=表达式EndFunction6.1函数过程的定义和调用1.函数过程的定义5其中:(a)函数过程名:与变量命名规则相同。(b)As类型:函数返回值的类型。(c)形参列表形式为:[ByVal]变量名[()][As类型][,[ByVal]变量名[()][As类型]…]形参只能是变量或数组名,ByVal表示当过程被调用时此参数是值传递,否则是地址传递。函数过程无参数时,过程名后的括号不能省略。(d)在函数体内至少对函数名赋值一次。6定义函数过程areaFunctionarea(x!,y!,z!)AsSingleDimc!c=1/2*(x+y+z)area=Sqrt(c*(c-x)*(c-y)*(c-z))EndFunction例如,定义计算三角形面积的函数过程。72.函数过程的调用函数过程的调用与使用标准函数相同,形式如下:函数过程名([参数列表])如:s1=area(a,b,c)(见P126)因函数过程名返回一个值,故函数过程不能作为单独的语句调用,必须作为表达式或表达式的一部分来构成语句。8函数过程的调用例6.3编一函数,统计字符串中汉字的个数。分析:在VB中,字符以Unicode码存放,每个汉字和英文是一个字符、占有两个字节,区别是汉字的机内码最高位为1,若利用Asc函数求其码值为小于0(以补码表示),而西文字符的最高位为0,Asc函数求其码值为大于0本章目录96.2子过程的定义与调用6.2.1引例以下情况使用函数过程存在不便:不是为了获得某个函数值,而是为了某种功能的处理。要获得多个结果。VB中提供了使用更灵活的子过程。例6.4编一过程,对Label1控件进行移动,通过参数Tag的值(1或-1)决定移动方向。该过程不是为了计算获得某个结果,而是进行对控件移动的处理。本章目录106.2.2子过程的定义子过程定义的方法同函数过程,形式如下:[Public|Private]Sub子过程名[(形参列表)]局部变量或常数定义语句[ExitSub]语句EndSub子过程名、形参同函数过程中对应项的规定,当无形参时不要括号。本章目录11子过程与函数过程的区别把某功能定义为函数过程还是子过程,没有严格的规定。一般若程序有一个返回值时,函数过程直观;当有多个返回值时,习惯用子过程。函数过程必须有返回值,函数名有类型。子过程名没有值,过程名没有类型,不能在子过程体内对子过程名赋值。本章目录12子过程的调用是一句独立的调用语句,有两种形式:Call子过程名[(实参列表)]子过程名([实参列表])用Call关键字时,若有实参,则实参必须用圆括号括起,无实参圆括号省略。注意:若实参要获得子过程的返回值,则实参只能是变量(与形参同类型的简单变量、数组名、结构类型),不能是常量、表达式,也不能是控件名。6.2.3子过程调用本章目录13例6.5分别编一统计字符串S中定冠词The出现个数的子过程和函数过程,并分别调用。处理方法:利用InStr函数反复在字符串S找The子串。分析:对同一问题定义两种过程时,只要抓住函数过程和子过程的区别,即函数名有一个值、子过程名无值的特点。当定义好函数过程后,要改为子过程,只要将函数过程的返回结果作为子过程的形参,即在子过程中增加一个参数;反之也然。本章目录146.3参数传递6.3.1形参与实参在参数传递中,一般是按位置传送,按实参的位置次序与形参的位置次序对应传送,与参数名没有关系。按位置传送是最常用的参数传递方法,如在调用标准函数时,用户根本不知道形参名,只要关心形参的个数、类型、位置,例如Mid函数形式:Mid(字符串$,起始位%,取几位%)调用语句:s=Mid(ThisisVB,9,2)则s中的结果为“VB”。本章目录156.3.2传址与传值实参与形参的结合有传址(ByRef)和传值(ByVal)两种方法。传址方式参数结合过程当调用一个过程时,它将实参的地址传递给形参。因此在被调过程体中对形参的任何操作都变成了对相应实参的操作,实参的值就会随过程体内对形参的改变而改变。传值方式参数结合过程当调用一个过程时,系统将实参的值复制给形参,实参与形参断开了联系。在过程体内对形参的任何操作不会影响到实参。本章目录16例6.6传址与传值a的地址101010aaxx形参实参ByVal传值传地址本章目录形参获得实参的值形参获得实参的地址17传址与传值选用传值还是传地址一般进行如下考虑:要将被调过程中的结果返回给主调程序,则形参必须是传址方式。这时实参必须是同类型的变量名(包括简单变量、数组名、结构类型等),不能是常量、表达式。不希望过程修改实参的值,则应选用传值方式,减少各过程间的关联。因为在过程体内对形参的改变不会影响实参。形参是数组都是地址传递(可表示值传递或地址传递)。本章目录18例6.7如下sum子过程求数组a各元素和、并改变数组各元素值:Functionsum%(ByValx()AsInteger)Dimi%sum=0Fori=0ToUBound(x)sum+=x(i):x(i)=2*x(i)NextiEndFunction6.3.3数组参数的传递本章目录19形参是数组要以数组名加圆括号表示,不要给出维数上界;多维数组,每维以逗号分隔。在过程中通过Ubound函数确定每维的上界。实参是数组要给出数组名(不需要圆括号)。当数组作为参数传递时,系统将实参数组的起始地址传给过程,使形参数组也具有与实参数组相同的起始地址。数组参数的传递13579形参数组实参数组本章目录206.3.4变量的作用域过程级变量在一个过程内用Dim或Static语句声明的变量,只能在本过程中使用模块级变量在模块内、任何过程外用Dim、Private语句声明的变量,可被本模块的任何过程访问全局变量在模块级用Public语句声明的变量,可被应用程序的任何过程或函数访问本章目录21变量的作用域例如在下面一个标准模块文件中不同级的变量声明:PublicPaAsinteger'全局变量PrivateMbAsstring*10'窗体/模块级变量SubF1()DimFaAsinteger‘过程级变量…EndSubSubF2()DimFbAsSingle‘过程级变量EndSub本章目录226.3.5静态变量静态变量程序运行过程中可保留变量的值声明形式:Static变量名[AS类型]用Dim声明的变量,每次调用过程时重新初始化例6.12比较Dim和Static两者的区别。编一程序,利用局部变量Count统计单击窗体的次数。本章目录23递归过程在自身定义的内部调用自己。例6.12编fac(n)=n!的递归函数Functionfac(nAsInteger)AsIntegerIfn=1Thenfac=1Elsefac=n*fac(n-1)EndIfEndFunction1)1fac(*11)fac(nnnnn6.4递归用自身的结构来描述自身就称为递归。最典型的例子是阶乘运算,作如下的定义:)!2()1()!1()!1(!nnnnnn本章目录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)本章目录递归结构256.5综合应用1数制转换不同进制数之间的转换,可通过编程来实现;也可通过VB提供的内部函数:十进制转换为八进制函数(Oct)、转换为十六进制函数(Hex)来实现。例6.13编一函数,实现一个十进制整数转换成二至十六任意进制的字符。分析:十进制正整数m转换成r进制数,将m不断除r取余数(若余数超过9,还要进行相应的转换,例如10变成A,11变成B等),直到商为零,以反序得到结果,即最后得到的余数在最高位。本章目录动画演示26综合应用-加密2.加密和解密信息加密是信息安全性的措施之一。信息加密有各种方法,最简单的加密方法是将每个字母平移一个位置(称为密钥)。例如,后移5个位置,这时,A→F,B→G…Y→D,Z→E,a→f;解密是加密的逆操作。例6.14编一加密和解密的程序,即将输入的一行字符串中的所有字母加密,加密后还可再进行解密。本章目录27WelcomestudWC87IAsc=Asc(C)92+5IAsc90IAsc=IAsc-26B对取得的一个字符”W”放入变量C中,加密的过程如左C=Chr(IAsc)28综合应用-查找3.查找什么是查找:查找是在线性表(在此为数组)中,根据指定的关键值,找出与其值相同的元素。查找方法:一般有顺序查找和二分法查找。顺序查找根据查找的关键值与数组的元素逐一比较,若相同,查找成功,若找不到,则查找失败。例6.15实现顺序查找。29综合应用-字符处理4.字符处理应用例6.16编写一个英文打字训练的程序,要求如下(1)在标签框内随机产生30个字母的范文;(2)当焦点进入输入文本框时开始计时,并显示当时的时间;(3)当输入了30个字母时结束计时,禁止向文本框输入内容,显示打字的速度和正确率。此题关键是:对输入的字符串与随机产生的字符串,一一对应比较,判断输入正确与否。本章目录30思考题1.为什么是要使用过程?2.简述子过程和函数过程的异同点?3.什么是形参?什么是实参?实参与形参之间怎样传值?4.按变量声明的位置可分为哪几种变量?5.什么是静态变量?如何声明静态变量?本章目录