Visual Basic.NET程序设计教程(第2版):第4章 过程_第1页
Visual Basic.NET程序设计教程(第2版):第4章 过程_第2页
Visual Basic.NET程序设计教程(第2版):第4章 过程_第3页
Visual Basic.NET程序设计教程(第2版):第4章 过程_第4页
Visual Basic.NET程序设计教程(第2版):第4章 过程_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章过程4.44.5Sub过程Function过程参数的传递递归过程综合应用4.1Sub过程Sub过程可以在标准模块和窗体模块中定义,定义Sub过程的一般格式如下:语法:[Private|Public]Sub过程名([参数列表])

[局部变量和常数声明]

语句块

[ExitSub]

语句块EndSub4.1Sub过程形参列表中的各参数的定义如表4.1所示。部分描述ByVal表示该参数按值传递。ByRef表示该参数按地址传递(默认)。变量名代表参数的变量的名称。数据类型用于说明传递给该过程的参数的数据类型,默认为Object。可以是Byte、Integer、Long、Short、Boolean、Single、Double、String、Decimal、Date、Object或用户自定义的类型。表4.1形式参数表4.1.1事件过程1.窗体事件过程窗体事件过程由窗体名(Name属性)、下划线和事件名组成,其定义格式为“窗体名_事件名”,语法如下:语法:PrivateSub窗体名_事件名([参数列表])

[局部变量和常数声明]

语句块EndSub例如,在下面例子中单击窗体(Form1)的事件是将本窗体隐藏而显示窗体frmHello,代码如下:PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_

HandlesMyBase.Load '定义单击窗体事件过程 frmHello.Show '显示frmHello窗体 Hide '隐藏本窗体EndSub4.1.1事件过程2.控件事件过程控件事件过程由控件名(Name属性)、下划线和事件名组成,其定义格式为“控件名_事件名”。语法:PrivateSub控件名_事件名([参数列表])

[局部变量和常数声明]

语句块EndSub例如,在【例1.1】中单击“运行”(Button1)按钮的事件在文本框TextBox1中显示“欢迎使用学生成绩管理系统!”,代码如下:PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_

HandlesButton1.Click '单击按钮 TextBox1.Text="欢迎使用学生成绩管理系统!"EndSub4.1.1事件过程3.建立事件过程在代码编辑器窗口建立事件过程,代码窗口会自动显示VB.NET的保留字,这样可以看出哪些是自己的编码。打开代码编辑器窗口有以下几种方法:(1)在设计的窗体上双击窗体或控件,就打开了“代码编辑器”窗口,并会出现该窗体或控件的默认过程代码,例如双击窗体(Form1)会出现窗体的默认过程名代码:PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_

HandlesMyBase.LoadEndSub(2)单击“视图”菜单中的“代码”菜单项,再从“对象列表框”中选择一个对象,从“事件过程列表框”中选择一个过程。(3)可以自己编写事件过程,在代码编辑器窗口中直接编写事件过程,例如,在代码编辑器窗口中写上述“Form1_Load”代码。在代码窗口中不要随意改变事件或对象的名称,如果想改变对象名称,则应该通过属性窗口来改变。4.1.2通用过程1.通用过程的定义定义通用过程的语法如下:语法:[Private|Public][Static]Sub过程名([参数列表])

[局部变量和常数声明]

语句块

[ExitSub]

语句块EndSub形参列表中的各参数的定义如表4.1所示。例如,在程序代码中添加一个通用过程,可在代码编辑器输入如图4.1所示语句:PublicSubWarning()

TextBox1.Text="警告!"EndSub全局过程过程名语句块结束Sub过程4.1.2通用过程2.通用过程的建立通用过程不属于任何一个事件过程,不能用事件过程定义它。创建通用过程的方法如下:(1)打开“代码编辑器”窗口,选择“对象列表框”中的“常规”选项。(2)在代码编辑区的空白行处输入“PublicSubWarning()”。(3)按回车键,自动出现“EndSub”语句,在该语句之前即可输入实现功能的代码。于是就在代码编辑器窗口中一个名为Warning的过程代码,如图4.2所示:PublicSubWarning()EndSub4.1.3调用过程1.调用事件过程调用

Sub事件过程是一个独立的语句,Sub事件过程可以由事件自动调用或者在同一模块中的其他过程中使用调用语句来调用。调用Sub过程有两种方式:使用Call语句,直接用Sub过程名。语法:Call过程名[(参数列表)]或者:过程名[参数列表]【例4.1】在事件过程中检查输入的数据是否是数值。界面设计:在文本框(txtInput)中输入数据,在文本框(txtInput_LostFocus)失去焦点的事件中检查是否为数值,在按钮“检查数据”(btnCheck)的单击事件中也检查。程序代码。4.1.3调用过程运行界面如图4.3所示。4.1.3调用过程2.调用通用过程调用

Sub通用过程的语法与调用

Sub事件过程的相同。不同的是,通用过程只有被调用时才起作用,否则不会被执行。【例4.2】通过调用通用过程来检查输入的数据是否是数值。在通用过程Warning编写检查输入数据。单击“检查数据”按钮和文本框失去焦点的事件都调用Warning通用过程程序代码。4.2Function过程4.2.1定义Function过程Function过程是包含在Function语句和EndFunction语句之间的一系列语句。每次调用过程时都会执行过程中的语句,即从Function语句后的第一个可执行语句开始,直到遇到第一个EndFunction、ExitFunction或Return语句结束。Function过程的重要特点是执行操作且返回值,同时也能带参数。定义Function过程的一般格式如下:语法:[Private|Public][Static]Function函数名([参数列表])

[As数据类型]

[局部变量和常数声明]

语句块

[函数名

=表达式] [ExitFunction]

语句块

[Return表达式]EndFunction4.2.1定义Function过程例如,下面是计算直角三角形第三边(斜边)的函数,函数名为Hypotenuse,函数值的数据类型为Integer,函数的形参为直角三角形两直角边A和B,返回值为斜边的值,Function过程代码如图4.4所示:4.2.2调用Function过程调用Function函数过程的方法和调用

VB.NET内部函数方法一样(例如

Sin(x)),在语句中直接使用函数名,Function过程可返回一个值到调用的过程。语法:Function函数名([参数列表])另外,采用调用

Sub过程的语法也能调用Function过程。当用这种方法调用过程时,放弃Function过程的返回值。语法:Call过程名([参数列表])或者:过程名[参数列表]例如,下面的语句都是调用计算三角形斜边的函数Hypotenuse。Debug.Write(10*Hypotenuse(3,4)) '在窗体显示函数值运算结果X=Hypotenuse(3,4) '将函数值赋值给变量XIfHypotenuse(3,4)=10ThenDebug.Write("Error!") '判断函数值是否=10X=Abs(Hypotenuse(3,4)) '函数值作为Abs函数的参数4.2.2调用Function过程【例4.3】编写用函数调用求两个自然数的最大公约数,采用辗转除法。辗转除法的算法如下:(1)输入两个自然数M,N。(2)计算M除以N的余数R,R=MModN。(3)用N替换M,M=N;用R替换N,N=R。(4)若R<>0则重复上述步骤(2)(3)(4)。

程序代码如下:在Form1_Click事件中输入两个自然数M和N并调用Divisor函数,M和N传递给Divisor函数。

PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_

HandlesMyBase.Load DimmAsInteger,nAsInteger,gAsInteger n=InputBox("请输入N") m=InputBox("请输入M") g=Divisor(n,m) '调用函数Divisor Debug.Write(n&"和"&m&"的最大公约数是:"&g)EndSub4.2.2调用Function过程Divisor函数计算最大公约数的值,Divisor函数计算的结果返回给Form1_Load过程。PrivateFunctionDivisor(ByValxAsInteger,ByValyAsInteger)'函数Divisor计算最大公约数 DimrAsInteger r=xMody DoWhiler<>0 x=y y=r r=xMody Loop Divisor=yEndFunction4.3参数的传递4.3.1形参和实参1.形参在被调过程中的参数称为形参,它是出现在Sub过程和Function过程中的变量名。在过程被调用之前,形参并未被分配内存,只是说明形参的类型和在过程中的作用。形参列表中的各参数之间用逗号“,”分隔,形参可以是变量名和数组名,定长字符串变量除外。2.实参实参是在调用Sub过程或Function过程时传递给被调用过程的参数,在过程调用时实参将数据传递给形参。实参可以是常数、变量、表达式、数组或对象。形参列表和实参列表中的对应变量名可以不同,但实参和形参的个数、顺序以及数据类型必须相同。因为“形实结合”是按照位置结合,即第一个实参与第一个形参结合,第二个实参与第二个形参结合,依此类推。4.3.1形参和实参例如,在求最大公约数的【例4.3】中被调用函数和调用过程如下:PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_

HandlesMyBase.Load g=Divisor(n,m) …EndSub

PrivateFunctionDivisor(ByValxAsInteger,ByValyAsInteger) …EndSub4.3.1形参和实参例如,下面实例由于传递的参数个数不匹配而出错。PrivateFunctionDivisor(ByValxAsString,ByValyAsInteger)'函数Divisor计算最大公约数 …EndFunctionDivisor有两个参数,而调用语句中形参个数只有一个,代码如下:PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_ HandlesMyBase.Load DimmAsInteger,nAsInteger,gAsInteger n=InputBox("请输入N") m=InputBox("请输入M") g=Divisor(n) '未提供m参数 Debug.Write(n&"和"&m&"的最大公约数是:"&g)EndSub4.3.1形参和实参运行程序时,则会显示出错信息,如图4.5所示。4.3.1形参和实参3.形参的数据类型在创建过程时,如果没有声明形参的数据类型,则默认为Object型。例如,将【例4.3】函数过程中的x声明为Object型,y为Integer型,代码如下:PrivateFunctionDivisor(ByValx,ByValyAsInteger) ……EndFunction4.3.1形参和实参例如,将【例4.3】函数的实参n的数据类型改为Single型,主调函数过程如下:PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_

HandlesMyBase.Load DimnAsSingle,mAsInteger,gAsInteger n=InputBox("请输入N") m=InputBox("请输入M") g=Divisor(n,m) Debug.Write(n&"和"&m&"的最大公约数是:"&g)EndSub

被调函数过程如下:PrivateFunctionDivisor(ByValxAsInteger,ByValyAsInteger) ……EndSub4.3.1形参和实参运行上述程序,当从InputBox输入框中输入n为44.5,m为25。当执行“g=Divisor(n,m)”语句时,先将Single型的n转换成44(Integer),然后将44→x,25→y。如图4.6所示。1g4.3.2按值传递和按址传递1.按值传递参数按值传递使用

ByVal关键字,在默认情况下,VB.NET使用的是按值传递方式。当在集成环境下的代码窗口中输入通用过程时,如果不指定参数的传送方式,则VB.NET自动给参数加上ByVal关键字。【例4.4】用函数过程编写求a、b两数中最大数。Max函数为求最大数,在cmdStart_Click事件中调用Max函数,程序代码。4.3.2按值传递和按址传递当在文本框txtA和txtB中输入变量a为7,b为8时,数据的传递过程如下:4.3.2按值传递和按址传递通过函数调用,给形参分配临时内存单元x和y,将实参a和b的数据传递给形参,内存单元值的存储过程如图4.7所示。4.3.2按值传递和按址传递运行结果界面如图4.8所示,被调函数Max中的x和y已经交换过了,分别为8和7,而主调函数中的a和b仍为7和8。

4.3.2按值传递和按址传递2.按地址传递参数在定义过程时,使用ByRef关键字指定按地址传递参数。将【例4.4】求两数中最大数的程序按值传递改为按地址传递,程序代码如下,被调函数过程不变:PrivateFunctionMax(ByRefxAsInteger,ByRefyAsInteger) ….EndFunction在按钮单击事件中的主调过程程序如下:PrivateSubcmdStart_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_

HandlescmdStart.Click DimaAsInteger,bAsInteger a=Val(txtA.Text) b=Val(txtB.Text) txtMax.Text=Max(a,b) '显示最大值 txtResultA.Text=a txtResultB.Text=bEndSub4.3.2按值传递和按址传递当输入变量a为7,变量b为8时,形参与实参的数据传递如图4.9所示。4.3.2按值传递和按址传递运行结果如图4.10所示,a和b的数据也交换了。4.3.2按值传递和按址传递【例4.5】计算5!+4!+3!+2!+1!,按照按地址参数传递的方法编写程序,代码如下:PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_

HandlesMyBase.Load DimSumAsInteger,iAsInteger Fori=5To1Step-1 Sum=Sum+Multiply(i) Next Debug.WriteLine("Sum="&Sum)EndSub

PrivateFunctionMultiply(ByRefnAsInteger)AsInteger Multiply=1 DoWhilen>0 Multiply=Multiply*n n=n-1 LoopEndFunction4.3.2按值传递和按址传递运行结果:Sum=120结果是120而不是希望的153,这是因为本程序只计算了5!=120。形参的传递过程如图4.11所示。4.3.3数组参数的传递VB.NET允许把数组作为实参传递到过程中。在定义过程时,数组可以作为形参出现在过程的形参列表中,声明数组参数的语法如下:语法:形参数组名()[As数据类型]形参数组对应的实参必须也是数组,数据类型与形参一致,实参列表中的数组不能带括号“()”。传递数组只能按地址传递,形参与实参共有同一段内存单元。【例4.6】用同一个函数“Average”求一班的学生和二班的学生的平均成绩。运行结果的界面如图4.12所示。程序代码。4.3.3数组参数的传递【例4.7】在【例4.6】中,通过Redim语句改变数组参数的维界,计算一班学生中前3人的平均成绩。程序代码。程序运行界面如图4.13所示。4.3.4对象参数的传递【例4.8】传递窗体对象和标签对象参数应用举例。在窗体Form1中创建了一个按钮(btnStu),按钮的Text属性值为“查询成绩”,单击按钮后,通过传递对象参数在窗体上的标签(Label1)中显示“成绩管理”文字,同时将窗体Form1的标题改为“传递对象”。窗体中的控件属性如表4.2所示:对象控件名属性名属性值FormForm1Text成绩管理ButtonbtnStuText查询成绩LabelLabel1Text空表4.2对象属性4.3.4对象参数的传递在设计的程序中,窗体Form1的标题和标签内容是通过过程参数传递的,如图4.14(a)是启动运行时的窗体,图4.14(b)是当单击按钮“查询成绩”时的窗体显示情况。

4.3.4对象参数的传递程序代码如下:PrivateSubbtnStu_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_

HandlesbtnStu.Click'单击按钮 '将按钮的文本传递给窗体中的Label1 CallfrmTrans(ActiveForm,Label1,Me.Text)EndSubPrivateSubfrmTrans(FAsForm,LAsLabel,btnTextAsString)'显示窗体标题和标签文本,形参为窗体参数 F.Text="传递对象" L.Text=btnText L.Visible=TrueEndSub4.4递归过程简单地说,递归就是一个过程调用过程本身。例如:PrivateFunctionFNC(xAsInteger) DimyAsInteger,zAsSingle … z=FNC(yAsInteger) '递归调用FNC函数 …EndFunction【例4.9】用递归的方法计算n!,即5!=4!*5,4!=3!*4,…。根据阶乘得出表达式:n!=1*2*3…*(n-1)*n,但这不是递归的形式,因此需要对它进行改造如下:n!=n*(n-1)!(n-1)!=(n-1)*(n-2)!…n=1时,n!=1于是得出下面的递归公式:递归的结束条件为:n=1时,n!=1。4.4递归过程程序代码如下,Muln函数过程就是递归求解函数:PrivateFunctionMuln(nAsInteger)AsInteger Ifn=0Orn=1Then '结束条件n=0或n=1 Muln=1 Else

Muln=Muln(n-1)*n EndIfEndFunction

PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_

HandlesMyBase.Load DimMAsInteger,iAsInteger i=InputBox("请输入一个正整数") M=Muln((i)) Debug.WriteLine("M="&M)EndSub4.4递归过程当输入n=5时,计算输出的结果为120,两个阶段过程如图4.15所示。4.4递归过程【例4.10】用递归的方法求Fibonacci数列第n个数的值,Fibonacci数列各元素如下:F1=1F2=1Fn=Fn-1+Fn-2已知Fn=Fn-1+Fn-2,因此可以推出:Fib(n-1)=Fib(n-2)+Fib(n-3)Fib(n-2)=Fib(n-3)+Fib(n-4)…得出下面的递归关系和终止条件:递归的终止条件为:g=1或

g=2时,Fib=1。4.4递归过程程序代码如下:PrivateFunctionFib(gAsInteger)'计算Fibonacci数列 Ifg=1Org=2Then Fib=1 Else

Fib=Fib(g–1)+Fib(g–2) EndIfEndFunct

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论