中原工学院教案VisualBasic语言1第7章过程“过程”体现了“自顶向下、逐步细化”的结构化程序设计思想,是实现结构化程序设计思想的重要方法。使用过程编程的优点:(1)可以将一个大的程序分解为若干个模块,每个模块只完成一个功能,便于程序的调试。(2)便于多人协作共同开发一个程序(3)模块具有一定的通用性,可以当前程序或其他程序调用。在VB中具有两种类型的过程:Sub(子程序)过程和Function(函数)过程。7.1Sub过程Sub过程分为:事件过程和通用过程。7.1.1事件过程与通用过程一、事件过程事件过程由VB自行声明,是附属于窗体和控件的。用户不能增加或删除事件过程。二、通用过程通用过程由用户建立,它不与任何特定的事件相联系,只能由别的过程来调用。通用过程存储在窗体的通用段或标准模块中。7.1.2通用过程的创建建立通用过程有两种方法。一、在“代码”编辑窗口中输入1.建立Sub过程在“代码”编辑窗口现有过程的外面,按如下格式输入:[Private|Public][Static]Sub过程名([形参表])系统将自动添加过程尾代码:EndSub2.Sub过程的格式:[Private|Public][Static]Sub过程名([形参表])[语句列][ExitSub]中原工学院教案VisualBasic语言2[语句列]EndSub说明:(1)通用过程可放入标准模块和窗体模块中。缺省时所有模块中的子过程为Public。当选用Private参数时,只有该过程所在模块中的过程才能调用。(2)如果使用Static关键字,则该过程中所有局部变量的值在整个程序运行期间都存在。(后面介绍)在过程内部,Static类型的变量存在且可见;在过程外部,Static类型的变量存在但不可见。(3)过程名:与变量名的命名规则相同。(4)语句列:过程中的程序段。可以用一个或多个ExitSub语句从过程中退出。(5)形参表:指明从调用过程传递给被调用过程的变量个数和类型(各变量名之间用逗号分隔)。“形参表”中形参的语法为:(后面介绍)[ByVal|ByRef]]变量名[()][As类型]其中:ByVal——表示该参数按值传递。ByRef——表示该参数按地址传递(缺省选项)。变量名——代表参数的变量名称或数组名称(后面加上一对小括号)。类型——传递给过程的变量或数组的数据类型。(6)“形参表”中出现的参数称为形式参数,简称为形参。调用过程时形式参数被实际参数(实参)代替。(7)在过程内部,不能再定义过程。(举例说明以上内容)二、使用“添加过程”对话框使用“添加过程”对话框建立过程的方法:(屏幕演示)(1)打开要添加过程的代码编辑窗口。(2)执行“工具”菜单中的“添加过程”……7.1.3通用过程的调用调用Sub过程有两种方法:使用Call语句:Call过程名([实参表])。直接使用过程名:过程名[实参表]。说明:(1)实参表:实际参数列表,参数之间用逗号分隔。实际参数可以是常量、变量、表达式等。中原工学院教案VisualBasic语言3(2)使用Call语句时,参数必须放在括号内。(3)不使用Call时,不能加括号,参数放在过程名之后。例如:Stars40CallStars(40)前面的作业6.3,可以改为:Dima(1To5,1To6)AsIntegerPrivateSubCerateA()a(1,1)=86:a(1,2)=87:a(1,3)=80:a(1,4)=96:a(1,5)=84a(2,1)=63:a(2,2)=67:a(2,3)=76:a(2,4)=96:a(2,5)=65a(3,1)=64:a(3,2)=77:a(3,3)=73:a(3,4)=56:a(3,5)=66a(4,1)=65:a(4,2)=87:a(4,3)=72:a(4,4)=66:a(4,5)=67a(5,1)=66:a(5,2)=97:a(5,3)=71:a(5,4)=86:a(5,5)=69EndSubPrivateSubCommand1_Click()CallCerateAMax=0:k=0Fori=1To5Forj=1To5a(i,6)=a(i,6)+a(i,j)Ifa(i,6)MaxThenMax=a(i,6)k=iEndIfNextjNextiPrintk,Max/5EndSub【例7.1】建立一个计算阶乘的通用过程。设该过程的过程名为fact,代码如下:Subfact(mAsInteger,totalAsLong)DimiAsIntegertotal=1Fori=1Tom中原工学院教案VisualBasic语言4total=total*iNextiEndSub【例7.2】调用【例7.1】建立的通用过程,计算5!+6!+8!。代码:命令按钮组的Click事件代码为:PrivateSubCommand1_Click()DimaAsInteger,bAsInteger,cAsIntegerDimsAsLong,totAsLong,pAsStringa=5:b=6:c=8Callfact(a,tot)s=totCallfact(b,tot)s=s+totCallfact(c,tot)s=s+totp=a&!+&b&!+&c&!=&sMsgBoxp,vbOKOnly,计算结果EndSub【例7.2】调用【例7.1】建立的通用过程,计算)!(!!nmnmC代码如下:PrivateSubCommand1_Click()DimmAsInteger,nAsInteger,tAsLongm=Text1.Textn=Text2.TextCallfact(m,t):a=tCallfact(m-n,t):b=tCallfact(n,t):c=ts=a/(b*c)p=从&m&个元素中取出&n&个的组合数=&sMsgBoxp,0,计算结果EndSub7.2Function过程当一个过程在执行后需要返回一个结果时,使用函数比较方便。除了系统内部函数,用户还可以编写和使用自己定义的Function函数。中原工学院教案VisualBasic语言5Function函数可以像系统的内部函数一样使用。7.2.1Function过程的定义Function过程的语法是:[Private|Public][Static]Function函数名([形参表])[As类型][语句列][函数名=表达式][ExitFunction][语句列][函数名=表达式]EndFunction说明:(1)函数名:Function过程的名字。(2)As类型:指定Function过程返回值的数据类型。没有As子句时,缺省类型为Variant。(3)表达式:其值是函数返回的结果。如果在Function过程中没有“函数名=表达式”,则该过程返回一个默认值(例如,数值函数返回0,字符串函数返回空字符串)。(4)语句列:程序段。(5)ExitFunction语句:从函数中退出。【例7.3】计算任意整数阶乘的Function过程fact:Functionfact(xAsInteger)AsLongDimpAsLong,iAsIntegerp=1Fori=1Toxp=p*INextIfact=pEndFunction7.2.2Function过程的调用可以像使用VB内部函数一样来调用Function过程。【例7.4】利用【例7.3】建立的函数计算5!+6!+8!。代码如下:PrivateSubCommand1_Click()DimaAsInteger,bAsInteger,cAsIntegerDimsAsLong,pAsString中原工学院教案VisualBasic语言6a=5:b=6:c=8s=fact(a)+fact(b)+fact(c)p=a&!+&b&!+&c&!=&sMsgBoxp,vbOKOnly,计算结果EndSub【例7.5】利用【例7.3】建立的函数计算)!(!!nmnmC代码如下:PrivateSubCommand1_Click()DimaAsInteger,bAsIntegera=Text1.Textb=Text2.Texts=fact(a)/(fact(b)*fact(a-b))p=从&a&个元素中取出&b&个的组合数=&sMsgBoxp,0,计算结果EndSub【例7.5】编写一个计算素数的过程,利用此过程计算100~1000之间的素数。代码如下:PrivateFunctionprime(xAsInteger)AsBooleanprime=TrueFori=2Tox-1IfxModi=0Thenprime=False:ExitFunctionNextiEndFunctionPrivateSubCommand1_Click()DimiAsIntegerFori=100To1000Ifprime(i)ThenList1.AddItemiNextiEndSub调用Function过程的补充说明:除了像使用函数那样调用Function过程,还可以像调用Sub过程那样调用Function过程,例如:MaximumCallMaximum(3,6)Maximum3,6注意:用这种方法调用函数,VB将放弃返回值。中原工学院教案VisualBasic语言7作业:7.4,7.67.3调用过程时的参数传递过程与调用程序之间的数据通讯方式:1.通过非局部变量。2.通过参数(本节涉及的内容)。调用过程时的数据传递可以使单向(按值传递)的,也可以使双向(按地址传递)的。7.3.1形式参数与实际参数一、形式参数形式参数是指在定义通用过程时,出现在Sub或Function语句中的变量名或数组名。二、实际参数实际参数是指在调用Sub或Function过程时,传送给Sub或Function过程的常量、变量、表达式以及数组等。在调用一个过程时,先把实际参数传送给形式参数,然后按实际参数执行被调用的过程。“实参表”和“形参表”中对应的变量名不必相同,但是变量的个数必须相等,而且各实际参数的类型必须与相应形式参数的类型相符。例如:PrivateSubstar(xAsInteger)'改为ByRef|ByValxAsIntegerFori=1ToxPrint*;NextiPrintEndSubPrivateSubcommand1_click()Fori=1To8PrintTab(21-i);Callstar(2*i-1)NextiEndSub中原工学院教案VisualBasic语言87.3.2按值传递与按地址传递一、按地址传递参数按地址传递参数时,形式参数与实际参数使用相同的内存地址单元,因此,实际参数必须是变量。按地址传递参数时,过程中对变量的改变将带回调用程序。定义过程时用ByRef关键字指出参数是按地址传递的。(确省设置)二、按值传递参数按值传递参数时,传递的是数据本身,即使子程序与主程序使用了的相同的变量名,在内存中占有不同的单元地址。按值传递时的实际参数可以时常量、变量、表达式等。按值传递参数时,过程中对变量的改变不会影响到调用程序。定义过程时用ByVal关键字指出参数是按值传递的。例如:PrivateSubexample1(ByRefxAsInteger,ByValyAsInteger)x=x+1y=y+1PrintBysubexample1:,x;yEndSubPrivateSubcommand1_click()DimaAsInteger,bAsIntegera=10:b=20PrintBeforeinmain:,a;bCallexample1(a,b)PrintAfterinmain:,a;bEndSub【例7.6】使用传值调用求最大公约数的函数Hcf,求两个正整数的最大公约数和最小公倍数。(以14和4为例)分析:(1)利用“辗转相除”编写一个求两数最大公约数的Function过程Hcf,然后在主程序中调用。(2)由数学知识可知:最大公约数最小公倍数mn。代码如下:PrivateFunctionHcf(mAsLong