第6章-过程课件_第1页
第6章-过程课件_第2页
第6章-过程课件_第3页
第6章-过程课件_第4页
第6章-过程课件_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

第6章过程第6过程过程概述将程序分割成较小的逻辑部件就可以简化程序设计任务。称这些部件为过程。过程可用于压缩重复任务,例如,压缩频繁的计算。例如:求1!+2!+…+n!求1!+2!+3!+…+N!DimiAsIntegerDimjAsIntegersum=0n=InputBox(请输入一个数N)Fori=1Tonk=1Forj=1Toik=k*jNextjsum=sum+kNextiPrint"1!+2!+3!+..."&n&"!"&"="&sum一般的方法PublickAsLongPublicSubfact(ByRefnAsInteger)k=1Forj=1Tonk=k*iNextEndSub求阶乘的过程n=InputBox("请输入一个数n")sum=0Fori=1TonCallfact(i)sum=sum+kNextPrint"1!+2!+3!+..."&n&"!"&"="&sum调用过程求1!+2!+…n!DimnAsIntegerDimsumAsLongDimiAsInteger1/1!+2/2!+…N/N!PrivateSubCommand2_Click()n=Val(InputBox("请输入一个数n"))sum=0Fori=1TonCallfact(i)sum=sum+i/kNext

Print"1/1!+2/2!+..."&n&"/"&n&"!"&"="&sumEndSub用过程编程有两大好处:1:过程可使程序划分成离散的逻辑单元,每个单元都比无过程的整个程序容易调试。2:一个程序中的过程,往往不必修改或只需稍作改动,便可以成为另一个程序的构件。VB中有两类过程,一类是事件过程,另—类是通用过程。事件过程是由系统提供的、不需要用户创建。通用过程是由用户根据自己的需要定义和编写的、可供事件过程多次调用的程序段。通用过程又可分为:Sub子过程Function过程(函数过程)6.2SUB子过程的定义与调用Sub子过程格式:[Private|Public][Static]Sub过程名[(参数表)]语句组[ExitSub]语句组EndSub其创建方法有两种:一是在代码窗口中直接按规定的格式编写;二是利用VB的过程添加工具生成过程框架,然后编写过程体。可以将子过程放入标准模块、类模块和窗体模块中。按照缺省规定,所有模块中的子过程为Public(公用的),这意味着在应用程序中可随处调用它们。2:使用《添加过程》对话框创建过程:打开代码窗口工具菜单添加过程事例:编写求N的累加和的SUB过程PrivateSubCommand2_Click()Text1.Text=""Text2.Text=""Text1.SetFocusEndSubPublicsAsIntegerPublicSubsumzr(nAsInteger)DimiAsIntegers=0Fori=1Tons=s+iNextEndSubPrivateSubCommand1_Click()Callsumzr(Val(Text1.Text))Text2.Text=sEndSubPublicSubsumzr(nAsInteger,sAsInteger)DimiAsIntegers=0Fori=1Tons=s+iNextEndSubPrivateSubCommand1_Click()DimnAsInteger,sAsIntegerCallsumzr(Val(Text1.Text),s)Text2.Text=sEndSub3:过程的调用使用Call语句格式:CALL<过程名>(实际参数)直接使用过程名格式:<过程名>[实际参数]

过程编写事例:

该过程的功能是让计算机发出”梆梆梆”的声音,发声次数由调用过程时传递的参数控制.该过程带有一个形式参数.Subbeepsound(nAsInteger)DimiAsIntegerDimjAsDoubleFori=1TonBeepForj=1To100000NextjNextiEndSub分析该过程的作用范围?注意过程创建的方法、创建的位置、参数的使用调用beepsound过程PrivateSubCommand1_Click()Callbeepsound(Val(Text1.Text))EndSub注意调用格式PrivateSubCommand1_Click()beepsoundVal(Text1.Text)EndSub例6.4SubMyMove(ByValTag%)Label1.Left=Label1.Left+Tag*100Label1.Top=Label1.Top+Tag*100EndSub

'事件过程调用MyMove:PrivateSubCommand1_Click()Dimk%IfRnd>0.5Thenk=1Elsek=-1MyMove(k)EndSub事例:编写求N!的SUB过程PublicSubfact(nAsInteger,sAsLong)DimiAsIntegers=1Fori=1Tons=s*iNextEndSub事例:编程计算1!+2!+…+n!PrivateSubCommand1_Click()DimiAsInteger,sAsLong,sumAsLongFori=1ToVal(Text1.Text)Callfact(i,s)sum=sum+sNextText2.Text=sumEndSubVisualBasic包含内部的函数,如Sqr、Cos或Chr。此外,还可用Function语句编写自己的Function过程。1:函数过程的语法是[Public|Private][Static]Function函数名([形参表])[As数据类型]语句组[函数名=表达式][ExitFunction]语句组 [函数名=表达式]EndFunction与Sub过程一样,Function过程也是一个独立的过程,可读取参数、执行一系列语句并改变其参数的值。与子过程不同,Function过程可返回一个值到调用的过程。6.1Function过程事例:编写求N!的FUNCTION过程PublicKAsLongFunctionFACT(NAsInteger)AsLongK=1ForI=1ToNK=K*INextIFACT=KEndFunctionPrivateSubCommand1_Click()DimNAsIntegerDimSAsLongN=Val(Text1.Text)S=FACT(N)Text2.Text=SEndSub2Function过程的调用格式:变量名=Function过程名([参数列表])PrivateSubCommand1_Click()DimPRAsBoolean,MAsLongM=Val(Text1.Text)PR=Prime(M)IfPR=TrueThenPicture1.PrintStr(M)+"是素数"IfPR=FalseThenPicture1.PrintStr(M)+"不是素数"EndSubOptionExplicitPrivateFunctionPrime(MAsLong)AsBooleanDimiAsIntegerPrime=True'向函数名赋值IfM>2ThenFori=2ToSqr(M)IfMModi=0ThenPrime=False:ExitForNextEndIfEndFunction注意调用格式,分析函数返回值的传递例编写求1+2+3+…..+N的函数过程PublicmAsLongFunctionfuncsum(nAsInteger)AsLongm=0Fori=1Tonm=m+iNextfuncsum=mEndFunctionPrivateSubCommand2_Click()DimnAsIntegerDimsumAsLongn=Val(Text1.Text)sum=funcsum(n)Text2.Text=sumEndSub分别用SUB过程和FUNCTION过程计算

S=1!+2!+…+N!PrivateSubForm_Load()Label1.Caption="输入一个数N"Label2.Caption="1!+2!+...+N!="Text1.Text=""Text2.Text=""Command1.Caption="计算"EndSubOptionExplicitPublicSubFACT(nAsInteger,sAsLong)DimiAsIntegers=1Fori=1Tons=s*iNextEndSub该过程可以放在标准模块中PrivateSubCommand1_Click()DimnAsInteger,sAsLongDimiAsInteger,sumAsLongn=Val(Text1.Text)Fori=1TonCallFACT(i,s)sum=sum+sNextText2.Text=sumEndSub调用过程计算阶乘累加和分别用SUB过程和FUNCTION过程计算

S=1!+2!+…+N!PublicFunctionfact1(nAsInteger)AsLongDimiAsInteger,sAsLongs=1Fori=1Tons=s*iNextfact1=sEndFunction注意函数过程如何才能实现返回值到调用过程PrivateSubCommand1_Click()DimnAsInteger,iAsIntegerDimxAsLongDimsumAsLongn=Val(Text1.Text)Fori=1Tonx=fact1(i)sum=sum+xNextText2.Text=sumEndSubFunctionArea(x!,y!,z!)AsSingleDimc!c=(x+y+z)/2Area=Sqrt(c*(c-x)*(c-y)*(c-z))EndFunction例6.1'在事件过程中输入数据,分别调用计算三角形面积的函数过程,然后显示总面积SubForm_Click()Dima!,b!,c!,d!,e!,f!,g!,s1!,s2!,s3!a=InputBox("输入a"):b=InputBox("输入b"):c=InputBox("输入c")d=InputBox("输入d"):e=InputBox("输入e"):f=InputBox("输入f")g=InputBox("输入g")s1=Area(a,b,c)s2=Area(c,d,e)s3=Area(e,f,g)MsgBox("多边形面积="&s1+s2+s3)EndSub

Functiongcd%(ByValm%,ByValn%)Ifm<nThent=m:m=n:n=tr=mModnDoWhile(r<>0)m=n:n=r:r=mModnLoopgcd=nEndFunction例6.2辗转相除法是利用以下性质来确定两个正整数a和b的最大公因子的:1.a÷b,令r为所得余数(0≤r<b)。若r=0,算法结束;b即为答案。2.互换:置a←b,b←r,并返回第一步。传递参数的方式有两种:6.3参数的传递按地址传递参数按值传递参数形式参数与实际参数sub过程和function函数过程中的参数称为形式参数(简称形参)在程序中调用sub过程和function函数过程时的参数称为实际参数(简称实参)

1.按位置传送

按位置传送就是实参的次序与形参的次序应匹配,位置次序一一对应。2.传值与传址ByVal:可选项。表示该参数按值传递。此时实参的值不随形参值的变化而变化。

ByRef:可选项。表示该参数按地址传递。此时实参的值随形参值的变化而变化,ByRef是VisualBasic的默认选项。

CallArea(50,20)SubArea(Length,Width)按地址传递参数是把实参变量的内存地址传递给形参变量。在定义过程时,用ByRef说明的形参,或缺省传递方式说明,都是按地址传递。PublicFunctionf1(ByRefxAsInteger)AsIntegerx=x*xf1=xEndFunctionPrivateSubCommand1_Click()DimnAsIntegerDimsAsIntegern=Val(Text1.Text)s=f1(n)Print"s=";sPrint"n=";nEndSub由于参数按地址传递,过程中对形式参数的改变将改变实际参数的值,?程序的输出结果是????例如,编写一个交换两变量值的函数过程Swap:PrivateFunctionSwap(xAsInteger,yAsInteger)DimtmpAsIntegertmp=x:x=y:y=tmpEndFunction‘编写窗体的Click事件过程,调用该函数过程:PrivateSubForm_Click()DimaAsInteger,bAsIntegera=10:b=15Print"调用交换函数过程前:a=";a,"b=";bSwapa,bPrint"调用交换函数过程后:a=";a,"b=";bEndSub分析参数传递方式对实际参数的影响按值传递参数按值传递参数是把实参变量的值传递给形参变量,实参变量的值在过程调用前后保持不变。定义过程时用ByVal关键字指出参数是按值来传递的。例如:SubFun(ByValxasInteger)……EndSubPublicFunctionf2(ByValx)x=x*xf2=xEndFunctionPrivateSubCommand1_Click()DimnAsIntegerDimsAsIntegern=Val(Text1.Text)s=f2(n)Print"s=";sPrint"n=";nEndSub由于参数按值传递,过程中对形式参数的改变不会改变实际参数的值,?程序的输出结果是????例如,把上面调用交换变量值的函数过程Swap修改为按值传递参数:PrivateFunctionSwap(ByValxAsInteger,ByValyAsInteger)DimtmpAsIntegertmp=x:x=y:y=tmpEndFunctionPrivateSubForm_Click()DimaAsInteger,bAsIntegera=10:b=15Print"调用交换函数过程前:a=";a,"b=";bSwapa,b'按值传递参数Print"调用交换函数过程后:a=";a,"b=";bEndSub分析参数传值方式对实际参数的影响???显示按值传递参数没有能实现两变量值的交换。本章作业分析1PublicSubmysub4(xAsInteger)x=3*x-1Ifx<5Thenx=x+9PrintxEndSubPrivateSubForm_Click()x=1mysub43+XPrintxEndSub注意调用过程是把3+X的值4传递给形式参数X,而非将实际参数X传递个形式参数X,请分析输出结果将调用过程改为:PrivateSubForm_Click()DimxAsIntegerx=1

mysub4xPrintxEndSub分析结果???PrivateSubForm_Click()DimbAsInteger,yAsIntegerCallMy

温馨提示

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

评论

0/150

提交评论