《新编Visual-Basic程序设计教程》第9章.pptx





《《新编Visual-Basic程序设计教程》第9章.pptx》由会员分享,可在线阅读,更多相关《《新编Visual-Basic程序设计教程》第9章.pptx(51页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第9 9章章 过程过程子程序过程子程序过程函数过程函数过程参数传递参数传递可选参数与可变参数可选参数与可变参数对象作参数对象作参数9.1 9.1 子程序过程子程序过程子程序过程由SubEndSub定义,也称为Sub过程。9.1.1 Sub9.1.1 Sub9.1.1 Sub9.1.1 Sub过程的定义过程的定义过程的定义过程的定义定义Sub过程的一般格式如下:用上面的格式定义一个Sub过程如下:StaticPublicPrivateSub过程名(参数列表)局部变量或常量定义语句块ExitSub语句块EndSubPrivateSubTest()PrintThisisaSubexampleEnd
2、SubSub过程以Sub开头,以EndSub结束,在它们之间是描述该过程操作的语句块,称为过程体或子程序体。上面定义格式中各选项的含义如下:Static:指定过程中的局部变量都是静态变量,即在每次调用该过程时,局部变量的值保持不变。Public:表示该Sub过程是公有过程,即可以在程序的任何地方调用它。Private:表示该Sub过程是私有过程,即只能被本模块中的其他过程访问,不能被其他模块中的过程访问。过程名:过程名:是一个长度不超过255个字符的变量名,在同一个模块中,不允许变量名与过程名同名。参数列表:参数列表:指明了在调用该过程时传送给过程的参数的类型和个数,这些参数称为“形式参数”,
3、简称“形参”。各参数之间以逗号分隔,每个参数的定义格式为:其中,ByVal是可选的,如果有ByVal,表示该参数是“传值参数”,不加ByVal的参数称为“引用参数”。ByVal变量名()As数据类型Sub过程不能嵌套,也就是说,在Sub过程内不能再定义Sub过程或函数过程。不能用GoTo语句进入或跳出一个Sub过程,只能通过调用执行Sub过程,Sub过程的调用可以嵌套。下面再看一个Sub过程的例子:该Sub过程有两个形参,其中第二个形参前面有ByVal,表示该参数是一个传值参数。SubTry(xAsInteger,ByValyAsInteger)x=x+100y=y*5Printx,yEndS
4、ub再看一个无参的Sub过程:SubTest()DoResponse$=InputBox$(Continue(YorN)?)IfResponse$=NOrResponse$=nThenEndIfResponse$=YOrResponse$=yThenExitDoLoopEndSub9.1.2 Sub9.1.2 Sub9.1.2 Sub9.1.2 Sub过程的建立过程的建立过程的建立过程的建立前面我们已学会如何建立事件过程,Sub过程不属于任何一个事件过程,因此不能放在事件过程中。Sub过程是一个通用过程,可以在标准模块中建立,也可以在窗体模块中建立。在标准模块中建立通用过程的步骤如下:(1)选
5、择“工程”菜单中的“添加模块”命令,打开“添加模块”对话框,在该对话框中选择“新建”选项卡,然后双击“模块”图标,打开模块代码窗口。(2)选择“工具”菜单中的“添加过程”命令,打开“添加过程”对话框,如右图所示。在“名称”框内输入要建立的过程的名字,在“类型”框内选择要建立的过程的类型:子程序过程或函数过程,在“范围”框内选择过程的适用范围。(3)单击“确定”按钮,回到模块代码窗口,此时可以在Sub和EndSub之间键入程序代码。“添加过程”对话框9.1.3 Sub9.1.3 Sub9.1.3 Sub9.1.3 Sub过程的调用过程的调用过程的调用过程的调用可以把Sub过程的调用当作是一句独立
6、的调用语句,可以有两种调用形式:或前者用Call关键字,若有实参,必须用小括号括起来,无实参时小括号可省略;而后者去掉了关键字Call,并且实参不需要用小括号括起来。实参也称实际参数,是在过程被调用时写在过程名后面括号中的参数。且实参的数据类型必须与定义过程时的形式参数一致。它的作用是把需要实际运算的数据传递给形式参数。如调用前面定义的Sub过程Try时,可用:或Call过程名(实参表列)过程名实参表列CallTry(a,b)Trya,b例例9.1编写一个计算矩形面积的Sub过程,然后调用该过程求一个矩形的面积。程序代码如下:SubArea(x,y)DimSS=x*yMsgBoxAreais&
7、SEndSubSubForm_Click()DimA,BA=InputBox(Inputthelength:)A=Val(A)B=InputBox(InputtheWidth:)B=Val(B)CallArea(A,B)或:AreaA,BEndSub程序运行时,单击窗体,首先出现一个输入对话框,要求输入矩形的长,假设输入30,确定后又出现一个输入对话框,要求输入矩形的宽,假设输入20,确定后出现运行结果如下图所示。调用Sub过程求矩形的面积9.2 9.2 函数过程函数过程函数过程由FunctionEndFunction定义,也称为Function过程。与Sub过程相比,Sub过程不直接返回值,
8、作为独立的基本语句调用,而Function过程要返回一个值,通常在一个表达式中被调用。9.2.1 Function9.2.1 Function9.2.1 Function9.2.1 Function过程的定义过程的定义过程的定义过程的定义Function过程的定义格式如下:其中:As类型可选项是Function过程返回的值的数据类型,可以是Integer、Long、Single、Double、Currency或String。如果省略,默认为Variant类型。其他各选项与Sub过程相同。StaticPublicPrivateFunction过程名(参数列表)As类型局部变量或常量定义语句块过程
9、名表达式ExitFunction语句块EndFunction把某功能定义为Sub过程还是Function过程,没有严格的规定,但Function过程有返回值。定义Function过程时,要定义返回值的数据类型,同时在Function过程体内可以对Function过程名赋值,该值就是这个函数的返回值。如果在Function过程体内省略:则该Function过程返回一个默认值(0或空字符串)。例如,要编写用辗转相除法求最大公约数的函数,程序如下:过程名表达式Functiongcd(ByValxAsInteger,ByValyAsInteger)AsIntegerDoWhiley0r=xModyx=
10、yy=rLoopgcd=xEndFunction9.2.2 Function9.2.2 Function9.2.2 Function9.2.2 Function过程的调用过程的调用过程的调用过程的调用由于Function过程能返回一个值,因此完全可以把Function过程当做内部函数调用,只不过内部函数由系统提供,而Function过程由用户自己定义。例如,上面的Function过程gcd,可以在下面的事件过程中调用。例例9.2调用后,例9.2程序的运行结果如下图所示。SubForm_Click()DimaAsInteger,bAsIntegera=64:b=48f=gcd(a,b)Print
11、最大公约数为:;fEndSub调用Function过程例例9.3分别编写一个计算下列级数和的子过程和函数过程,并分别调用。1xx2/2!xn/n!精确到xn/n!=eps)s=s+tt=t*x/nn=n+1LoopEndSub函数过程如下:Functionsum2(x!,eps#)AsDoubleDimn%,s#,t#n=1:s=0:t=1DoWhile(Abs(t)=eps)s=s+tt=t*x/nn=n+1Loopsum2=sEndFunction用下面的事件过程调用:PrivateSubCommand1_Click()Dimf1#,f2#Callsum1(f1,2#,0.000001)f
12、2=sum2(2#,0.000001)Printf1=;f1,f2=;f2EndSub在窗体中添加一个命令按钮Command1,程序运行时单击该命令按钮,则运行结果如下图所示。其中f1是调用子过程sum1求得的级数和,f2是调用函数过程sum2求得的级数和。子过程和函数过程的比较9.3 9.3 参数传递参数传递在调用一个过程时,一般主调过程与被调过程之间有数据传递,也就是要把主调过程的实参传递给被调过程的形参,完成实参与形参的结合,然后执行被调过程体。在VB中,实参与形参的结合有两种方法:传值(ByVal)和传址(ByDef)。9.3.1 9.3.1 9.3.1 9.3.1 传值和传址传值和传
13、址传值和传址传值和传址传址又称为引用,是默认的参数传递方法。区分两种传递方法是看形参前有无“ByVal”关键字。传址的结合过程是:当调用一个过程时,将实参的内存地址传递给形参。因此在被调过程体中对形参的操作实际是对相应实参的操作,实参的值就会随过程体内对形参的值的改变而改变。传址习惯上也称为“引用”。传值的结合过程是:当调用一个过程时,系统将实参的值复制给形参,实参与形参各自占用不同的内存单元,过程调用结束时,形参所占的内存单元也同时被释放。因此,在过程体内对形参的操作不会影响到实参。例例9.4传址与传值的比较。有如下过程:SubTry(xAsInteger,ByDefyAsInteger)第
14、二个参数中的ByDef关键字可以省略DimtempAsIntegertemp=xx=yy=tempForm1.Printx=;x,y=;yEndSub在下面的事件过程中调用上述过程:运行程序,单击窗体,输出结果如下图所示。由此可以看到,在过程Try中交换了两个形参的值,调用结束返回事件过程后,两个实参的值也被改变了。SubForm_Click()DimaAsInteger,bAsIntegera=10:b=20Printa=;a,b=;bTrya,bPrinta=;a,b=;bEndSub传址调用如果不想改变实参的值,可将过程Try修改如下:仍旧用上面的Form_Click()事件过程去调用,
15、则窗体上的输出结果如下图所示。可以看到形参的值的改变没有影响实参。SubTry(ByValxAsInteger,ByValyAsInteger)DimtempAsIntegertemp=xx=yy=tempForm1.Printx=;x,y=;yEndSub传值调用我们已经知道,用Function过程可以通过过程名返回值,但一个Function过程只能返回一个值。Sub过程不能通过过程名返回值,但可以通过传址结合的参数返回值,并且可以返回多个值,请看下面的例子。例例9.5通过传址调用Sub过程,返回多个值。程序如下:SubS(ByValxAsInteger,ByValyAsInteger,mA
16、sInteger,nAsInteger)m=x+yn=x*yEndSubPrivateSubForm_Click()DimSumAsInteger,MulAsIntegerS10,20,Sum,MulPrintSum,MulEndSubSub过程S有4个参数,前两个参数用关键字ByVal指明是传值调用,后两个参数m和n前面没有关键字,则是默认的传址方式。在Form_Click()事件过程中调用Sub过程S的语句为:则将10和20分别传值给形参x和y,将实参Sum和Mul的地址传递给形参m和n,即m与Sum占用同一段内存,n与Mul占用同一段内存,因此在过程S中将x+y、x*y的值分别赋给m、n
17、,也就是将这两个值分别存入了Sum和Mul所占的内存单元中。于是调用完过程S返回Form_Click()事件过程中输出Sum和Mul的值时,将输出:S10,20,Sum,Mul302009.3.2 9.3.2 9.3.2 9.3.2 数组作参数传递数组作参数传递数组作参数传递数组作参数传递在VB中允许把数组作为实参传递给一个过程。这时,应将数组名分别放入实参表和形参表中,并略去数组的上下界,但数组名后的小括号不能省,以免与普通变量混淆。数组只能通过传址方式进行传递,也就是说,用数组作过程参数时,可以将实参数组的全部元素传送给一个过程,而形参数组中各元素的改变将被带回到实参数组。例例9.6编写一
18、个Function过程,求数组的最大值。PrivateFunctionFindMax(a()AsInteger)DimStartAsInteger,FinishAsInteger,iAsIntegerStart=LBound(a)Finish=UBound(a)Max=a(Start)Fori=StartToFinishIfa(i)MaxThenMax=a(i)NextiFindMax=MaxEndFunctionSubForm_Click()ReDimb(10)AsIntegerFori=1To10t=InputBox(inputInteger:)b(i)=tNextic=FindMax(b
19、()PrintcEndSub程序中定义了一个函数过程FindMax,它有一个形参,即数组a。当在Form_Click()事件过程中调用函数过程FindMax时,将实参数组b作参数传递给形参数组a,于是,形参数组a与实参数组b共占同一段内存空间。而且因为两个数组类型相同,因此a(i)就是b(i)的值。接下来在函数过程FindMax中用LBound和Ubound函数分别求得数组a的下界和上界,然后对数组中元素进行比较,找到数组a的最大值,其实也就是数组b中所有元素的最大值,通过函数过程FindMax,将此最大值返回给Form_Click()事件过程并输出。有时不需要把整个数组传送给通用过程,可以只
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 新编Visual-Basic程序设计教程 新编 Visual Basic 程序设计 教程

限制150内