《Visual Basic NET程序设计》课件第6章 过程_第1页
《Visual Basic NET程序设计》课件第6章 过程_第2页
《Visual Basic NET程序设计》课件第6章 过程_第3页
《Visual Basic NET程序设计》课件第6章 过程_第4页
《Visual Basic NET程序设计》课件第6章 过程_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能,这些模块就叫做过程。VisualBasic有两类过程:1、内部函数过程和事件过程;2、用户自定义的可被多次调用的通用过程。Sub过程(子程序过程)Function过程(函数过程)6.1建立通用过程通用过程不与用户界面中的对象联系。当不同的事件过程或同一事件过程多次要执行同一动作时,为了不必重复编写代码,可以采用通用过程来实现,由事件过程调用通用过程。6.1.1过程的定义定义Sub过程的一般格式如下:[Private|Public][Static]Sub子过程名[(形式参数列表)]语句块[ExitSub]语句块EndSubFunction函数过程的定义:[Private|Public][Static]Function函数过程名([形式参数列表])[As类型]语句块函数过程名=表达式[ExitFunction]语句块[Return表达式]EndFunction6.1.2过程的建立通用过程不属于任何一个事件过程,可以通过事件过程调用它,创建通用过程的方法如下:①打开“代码编辑器”窗口,选择“对象列表框”中的“常规”选项。②在代码编辑区的空白行处输入通用过程代码。6.2通用过程的调用6.2.1调用Sub过程Sub过程的调用有两种方式1.用Call语句调用Sub过程格式:Call子过程名[(实际参数列表)]CallTestSub("你好")2.直接使用过程名(1)去掉关键字Call;例如:TestSub("你好“)6.2.2调用Function过程Function过程调用形式如下:变量名=函数过程名([实际参数列表])例如上面的计算矩形面积的Function过程可以被调用如下:c=RecArea(20,30.1)调用Sub和Function的不同点?6.3参数传递在调用一个过程时,必须把实际参数传递给过程,完成形式参数与实际参数的结合,然后用实际参数执行调用的过程。实际参数?形式参数?值传递?ByVal地址传递?ByRef例6.1编写交换两个数的过程,过程Swap1使用按值传递,Swap2过程使用按地址传递。程序运行结果如图6-1所示,从中可以看出只有Swap2才能成功交换两个数。在调用的过程中,实参与形参的关系如图6-2所示。PublicSubSwap1(ByValx%,ByValy%)Dimt%t=x:x=y:y=tEndSubPublicSubSwap2(ByRefx%,ByRefy%)Dimt%t=x:x=y:y=tEndSubPrivateSubForm1_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.ClickDimaAsInteger,bAsIntegera=3:b=5label1.text="调用过程前:"&"a="&a&"b="&b&vbcrlfSwap1(a,b)label1.text&="按值传递参数后:"&"a="&a&"b="&b&vbcrlfa=3:b=5Swap2(a,b)label1.text&="按地址传递参数后:"&"a="&a&"b="&b&vbcrlfEndSub传值a传地址bbxy3b的地址实参

形参53例6.2计算5!+4!+3!+2!+1!。先按地址传递方法给出代码。PrivateFunctionM(ByRefn%)AsIntegerM=1DoWhilen>0M=M*nn=n-1LoopEndFunction

PrivateSubForm1_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.ClickDimsumAsInteger,iAsIntegerFori=5To1Step-1sum=sum+M(i)NextiDebug.WriteLine("Sum="&sum)EndSub程序分析运行结果:Sum=120本例的运行结果是120,而不是153,是因为本程序只计算了5!。在本例中n是按地址传递的,在第一次调用M函数后n的值为0,由于实参于形参共享地址单元,实参i的值也是0。当执行Fori=5To1Step-1时就退出了For循环,For循环就执行了一次,求出了5!的值。解决办法有两种:①将地址传递改为值传递PrivateFunctionM(ByValn%)AsInteger②将实参i改为表达式,因为表达式是按值传递的。把变量改为表达式最简单的方法是用()将变量括起来,调用语句改为:sum=sum+M((i))3.数组参数的传递在VisualBasic的6.0版本后,支持数组作为参数在过程的调用中使用。数组传递是按地址传递,实际传递的是数组首元素的地址。在传递数组时,形参只写数组名,与之所对应的实参须写上所要传递的数组的名称和一对圆括号。在子程序中不可再用Dim语句来定义所要的传递的数组。例6.3编写排序子过程,将存有随机数的数组作为参数传递给排序子过程sort。PublicSubsort(ByValA()AsInteger)'冒泡法排序DimiAsInteger,jAsInteger,tAsIntegerFori=1To9Forj=1To10-iIfA(j)>A(j+1)Thent=A(j):A(j)=A(j+1):A(j+1)=tNextjNextiEndSubPrivateSubForm1_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.ClickDimArr(10)AsIntegerDimiAsIntegerLabel1.text=""Fori=1To10'随机产生10个1~100的自然数Arr(i)=Int(Rnd*99)+1Label1.text&=Arr(i)&""NextiLabel1.text&=vbcrlfCallsort(Arr)'调用排序过程Fori=1To10Label1.text&=Arr(i)&""NextiLabel1.text&=vbcrlfEndSubPublicSubsort2(A()AsInteger) '冒泡法排序DimiAsInteger,jAsInteger,tAsIntegerDimheadAsInteger,tailAsInteger '下标头(下界)和下标尾(上界)head=LBound(A)tail=UBound(A)Fori=headTotail-1

Forj=headTotail-i

IfA(j)>A(j+1)Thent=A(j):A(j)=A(j+1):A(j+1)=t

NextjNextiEndSub4.对象参数的传递VisualBasic还允许使用对象,即窗体或者控件作为通用过程的参数。用对象作为参数与用其他数据类型作为参数的过程在格式上是相同的,惟一的区别是对象参数的数据类型是Control,不能够使用值传递,而只能使用地址传递方式。例6.4使用窗体对象参数。用鼠标右击“解决方案资源管理器”菜单中的“项目名称”,在弹出的快捷菜单上选择“添加”选项中的“Windows窗体”命令,建立三个窗体,分别是Form1、Form2和Form3。希望在程序中设置各窗体的大小和位置,可以通过下面的代码来实现:可以在应用中编写一个通用程序,以窗体作为参数,用来对窗体的大小和位置进行设置。PublicSubSetForm(FormNameAsForm,xAsDouble,yAsDouble,lAsDouble,wAsDouble)FormName.Left=xFormName.Top=yFormName.Width=lFormName.Height=wEndSubPrivateSubForm1_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.ClickSetForm(Me,100,20,300,300)SetForm(Form2,100,200,500,300)SetForm(Form3,100,120,800,300)Form2.Show()Form3.Show()

EndSub例6.5使用控件对象参数PublicSubfrmtrans(ByReflAsLabel,ByReftAsString)l.Text=tl.Visible=TrueEndSub

PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickCallfrmtrans(Label1,Me.Text)EndSub程序运行时,单击button1按钮,将窗体的标题传递给标签Label1。6.4变量的作用域变量可被访问的范围称为变量的作用域。在VisualBasic中,可以在过程或模块中声明变量,根据声明变量的位置,变量分为两类:过程级变量和模块级变量。它们的作用范围分别在过程级和模块级。过程级变量也就是局部变量。6.4.1过程级变量过程级变量是指在过程内用Dim或Static关键字声明的变量、或不加声明而直接使用的变量,它只能在本过程中使用,其他的过程不可访问。过程级变量随过程的调用而分配内存单元,并进行变量的初始化,在此过程体内进行数据的存取,一旦该过程体结束,变量的内容自动消失,占用的内存单元释放。不同的过程中可有相同名称的变量,彼此互不相干。6.4.2模块级变量模块级变量指在一个模块的任何过程外面,即在“通用”声明段中声明的变量。模块级变量分为私有和公有。例6.6不同作用域变量的定义位置。PublicaAsInteger '全局变量PrivatebAsSingle '私有的模块级变量Subp1()DimcAsDouble '局部变量...EndSub6.4.3变量的生存期变量的生存期是指,假设过程内部有一个变量,当程序运行进入该过程时,要为该变量分配一定的内存单元,一旦退出该过程,该变量占有的内存单元是释放还是保留决定了该变量的生命周期。根据变量在程序运行期间的生存期,把变量分为静态变量和动态变量。例6.7分析下面程序运行的结果。PublicClassForm1PublicFunctionsum1(ByValnAsInteger)Dims%s=s+nsum1=sEndFunctionPublicFunctionsum2(ByValnAsInteger)Statics%s=s+nsum2=sEndFunctionPrivateSubForm1_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.ClickDimsumAsInteger,iAsIntegerLabel1.Text=""Fori=1To5sum=sum1(i)Label1.Text&=sum&","NextiLabel1.Text&=vbCrLfFori=1To5sum=sum2(i)Label1.Text&=sum&","NextiLabel1.Text&=vbCrLfEndSubEndClass程序运行结果为:1,2,3,4,5, 1,3,6,10,15,6.5递归简单地说,递归就是一个过程调用过程本身。例如:PrivateFunctionFNC(xAsInteger)DimyAsInteger,zAsSingle…Z=FNC(yAsInteger)…EndFunction例6.8用递归的方法计算n!,即5!=4!*5,4!=3!*4,……等。PublicClassForm1PrivateFunctionMuln(ByValnAsInteger)AsIntegerIfn=0Orn=1Then'结束条件n=0或n=1Muln=1ElseMuln=Muln(n-1)*nEndIfEndFunction

PrivateSubForm1_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.ClickDimmAsInteger,IAsIntegerI=InputBox("请输入一个正整数")m=Muln(I)Debug.WriteLine("M="&m)EndSubEndClass例6.9用递归的方法求斐波那契Fibonacci)数列第n个数的值,斐波那契数列各元素如下:1,1,2,3,5,8,13,21,……递推公式如下:F1=1F2=1Fn=Fn-1+Fn-2

己知Fn=Fn-1+Fn-2,可以推出:F(n-1)=F(n-2)+F(n-3)F(n-2)=F(n-3)+F(n-4)……程序代码如下PublicClassForm1PrivateFunctionFib(ByValgAsInteger)'计算斐波那契(Fibonacci)数列Ifg=1Org=2ThenFib=1ElseFib=Fib(g-1)+Fib(g-2)EndIfEndFunction

PrivateSubForm1_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.ClickDimkAsLongDimnAsIntegern=InputBox("请输入计算的数列的个数")k=Fib(n)Debug.WriteLine("Fibonacci数列第"&n&"个数是"&k)EndSub

EndClass6.6综合应用例6.10输入一个十进制正整数,将其转换成二进制、八进制或十六进制数。数制转换的算法如下:将十进制数除以进制(2、8或16),得出余数和商,将商循环地除以进制,直到商为0。将每次相除产生的余数逆序排列,就是转换的结果。例如,将45转换成二进制数,结果为:101101。程序代码如下:PublicClassForm1DimnumberAsInteger,nAsIntegerPrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Loadn=2EndSub

PrivateSubcmbSelect_SelectedValueChanged(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlescmbSelect.SelectedValueChangedn=CInt(cmbSelect.SelectedItem)EndSubPrivateSubTxtInput_LostFocus(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesTxtInput.LostFocusDimResponseAsIntegerIfIsNumeric(Val(TxtInput.Text))=TrueThennumber=Val(TxtInput.Text)ElseResponse=MsgBox("输入数据错误")TxtInput.Focus()EndIfEndSub

PrivateSubTrans(ByRefArry()AsString,ByVals()AsString)'数制转换DimrAsInteger,kAsIntegerk=0number=Val(TxtInput.Text)DoUntilnumber=0r=numberModnk=k+1ReDimPreserveArry(k)Arry(k)=s(r)number=Int(number/n)LoopEndSub

PrivateSubCmdStart_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesCmdStart.ClickDimiAsIntegerDimmyChar(15)AsString,ChAsStringDimBin()AsStringCh=""Fori=0To9myChar(i)=Str(i)'将字符0-9赋值给数组myCharNextiFori=0To5myChar(10+i)=Chr(Asc("A")+i)'将字符A-F赋值给数组myCharNextiCallTrans(Bin,myChar)Fori=UBound(Bin)To1Step-1Ch=Ch&Bin(i)NextiTxtResult.Text=ChEndSub

PrivateSubCmdClose_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesCmdClose.ClickMe.Close()EndSubEndClass程序分析:①数组myChar有16个元素,分别存放0-9和A-F字符,通过Chr函数得出字符。Asc函数得出字符的ASCIl码值。Trans的形参是数组按地址传递,因此在被调函数中改变数组Arry的值,在主调过程cmdStart_Click中Bin数组值同时改变。②函数Trans用于数制转换,模块级变量Number为要转换的十进制数,n为数制。将余数放置在数组Arry中,使用动态数组Arry,在循环中重新定义数组的大小,并使用Preserve重新定义数组大小后原来的数据保留。例6.11输入某一天的年、月和日,计算出这一天是该年的第几天。窗体界面设计:窗体中有两个文本框、两个命令按钮、一个组合框、一个列表框和六个标签。采用组合框选择月份,列表框选择日期,文本框输入年份。PublicClassForm1DimMyYearAsInteger,MyMonthAsInteger,MyDayAsIntegerDimDayTab(12)AsInteger'该数组用于存放每月天数

PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadDimiAsIntegerDayTab(0)=31:DayTab(1)=28:DayTab(2)=31:DayTab(3)=30DayTab(4)=31:DayTab(5)=30:DayTab(6)=31:DayTab(7)=31DayTab(8)=30:DayTab(9)=31:DayTab(10)=30:DayTab(11)=31MyMonth=1MyDay=1Fori=1To31ListBox1.Items.Add(i)'往列表框中添加1-31日期选项NextiFori=1To12ComboBox1.Items.Add(i)'往组合框中添加1-12月份NextiEndSubPrivateSubTextBox1_LostFocus(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesTextBox1.LostFocusIfVal(TextBox1.Text)>0AndIsNumeric(TextBox1.Text)ThenMyYear=Val(TextBox1.Text)ElseMsgBox("年份出错!",,"输入年份")TextBox1.Focus()EndIf

EndSub

PrivateSubComboBox1_SelectedIndexChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesComboBox1.SelectedIndexChangedMyMonth=Val(ComboBox1.SelectedItem)EndSubPrivateSubListBox1_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesListBox1.ClickMyDay=Val(ListBox1.SelectedItem)EndSub

PrivateFunctionSumDay(ByValmonthAsInteger,ByValdayAsInteger)'计算总天数,将每月的天数累加DimiAsIntegerFori=0Tomonth-2day=day+DayTab(i)NextiSumDay=dayEndFunctionPrivateFunctionLeap(ByValyearAsInteger)'判断年份是否是闰年DimLAsIntegerL=(yearMod4=0)And(yearMod100<>0)Or(yearMod400=0)'如果是闰年为True,由于L是整型,进行类型转换后,函数返回值为-1Leap=LEndFunctionPrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimDaysAsInteger

温馨提示

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

评论

0/150

提交评论