VB教程第7章教案.ppt_第1页
VB教程第7章教案.ppt_第2页
VB教程第7章教案.ppt_第3页
VB教程第7章教案.ppt_第4页
VB教程第7章教案.ppt_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第7章,过程,本章主要内容,第7章过程,退出,前面已经使用了很多过程,例如按钮事件过程、窗体装载事件过程等。过程是完成某种特殊功能的一组独立的程序代码。VB应用程序是由过程组成的。两大类过程:事件过程Sub过程通用过程Function过程事件过程是VB应用程序的主体通用过程是独立于事件过程之外,可供其他过程调用的程序段,PrivateSubCommand1_Click()EndSub,PrivateSubForm_Load()EndSub,过程有两个重要作用:一是把一个复杂的任务分解为若干个小任务,可以用过程来表达,从而使任务更易理解,更易实现,将来更易维护;二是代码重用,使同一段代码多次复用。,过程的作用,过程调用示例把相同的任务编成相对独立的“子过程”当事件过程需要执行这个任务时,可使用调用语句(如Call)实行调用。子过程执行完后,会返回事件过程中调用语句Call的后续语句继续执行通用过程又分为Sub(子程序)过程和Function(函数)过程,7.1通用过程,例7.1使用Sub过程的示例1PrivateSubForm_Load()ShowCallmysub1(30)Callmysub2Callmysub2Callmysub2Callmysub1(30)EndSub程序运行结果,PrivateSubmysub1(n)PrintString(n,*)EndSubPrivateSubmysub2()Print*;Tab(30);*EndSub,7.1.1Sub过程,例7.1,1.Sub过程定义格式:PrivatePublicStaticSub过程名(参数表)语句块ExitSubEndSub2.调用Sub过程有以下两种方法:(1)使用Call语句。格式:Call过程名(实参表)(2)直接使用过程名,格式:过程名实参表例如,调用名为mysub1的过程:Callmysub1(30)mysub130,Sub过程的定义和调用,因为计算5!和10!都要用到阶乘n!(n!123n)所以把计算n!编成Sub过程采用Print直接在窗体上输出结果,程序代码:PrivateSubForm_Load()ShowDimyAsLong,sAsLongCallJc(5,y)s=yCallJc(10,y)s=s+yPrint5!+10!=;sEndSub程序运行结果:5!+10!3628920,PrivateSubJc(nAsInteger,tAsLong)DimiAsIntegert=1Fori=1Tont=t*iNextiEndSub注意参数n及t的调用情况,例7.2计算5!+10!,例7.2,1.Function过程定义格式:Private|Public|StaticFunction函数名(参数表)As数据类型语句块函数名表达式ExitFunctionEndFunction2.Function过程的调用方法:一般采用直接调用的方法像使用VB内部函数一样,只需写出函数名和相应的参数即可例如:s=Max(a,b)PrintMax(s,c),7.1.2Function过程能从过程中直接返回一个值,Functionmax(m,n)AsSingleEndFunction,Function过程,返回值,把求两个数中的大数编成Function过程,过程名为Max本例采用InputBox函数输入三个数,判断出最大数后采用Print直接输出在窗体上。PrivateSubForm_Load()ShowDimaAsSingle,bAsSingle,cAsSingleDimsAsSinglea=Val(InputBox(输入第一个数)b=Val(InputBox(输入第二个数)c=Val(InputBox(输入第三个数)s=max(a,b)Print最大数是:;max(s,c)EndSub,Functionmax(m,n)AsSingleIfmnThenmax=mElsemax=nEndIfEndFunction,例7.3输入三个数,求出它们的最大数,例7.3,调用,调用,通用过程(Sub/Function)过程可以保存在两种模块中:窗体模块(.frm)和标准模块(.bas)(1)在窗体模块中创建通用过程:可以在代码窗口中直接键入来创建Sub过程选择“工具”菜单中的“添加过程”命令(2)在标准模块中创建通用过程:选择“工程”菜单中的“添加模块”命令保存为一个独立的“.bas”文件举例:把例7.3的函数max(m,n)存放在模块文件中,创建通用过程的方法,PrivateSubForm_Load()Showp=1:m=5CallSub1(p)CallSub1(m)EndSubPrivateSubSub1(x)Ifx1Thenx=x-1x=x*4Printx;EndSubA.415B.416C.44D.420,请回答问题:下列程序段的输出结果?,想一想,思考题,答案:B,在窗体上已经建立了一个文本框Txt1和一个命令按钮Comd1,运行程序后单击命令按钮,则在文本框Txt1中显示的内容是DimaAsInteger模块级变量PrivateSubComd1_Click()DimbAsInteger,cAsIntegera=1:b=10CallMySub(b,c)Txt1.Text=a+b+cEndSubSubMySub(x,y)y=xMod7+aa=3EndSubA.16B.17C.15D.9,请回答问题,想一想,思考题,答案:B,参数传递可以实现调用过程和被调过程之间的信息交换两种方式:按值传递和按地址传递7.2.1形参与实参形式参数(简称形参)在被调过程中的参数。出现在Sub过程和Function过程中形式参数可以是变量名和数组名实际参数(简称实参)在调用过程中的参数。过程调用时实参数据会传递给形参形参表和实参表中的对应变量名可以不同,但实参和形参的个数、顺序以及数据类型必须相同,7.2参数传递,定义过程和调用过程的示例:调用过程:CallMysub(100,计算机,1.5)定义过程:SubMysub(tAsInteger,sAsString,yAsSingle)“形实结合”是按照位置结合的,即第一个实参值(100)传送给第一个形参t,第二个实参值(“计算机”)传送给第二个形参s,第三个实参值(1.5)传送给第三个形参y。数组可以作为形参出现在过程的形参表中,1.按地址传递:关键字ByRef(或缺省)。形参与实参使用相同的内存地址单元,这样通过过程就可以改变变量本身的值2.按值传递:按值传递(关键字ByVal)。传递参数值而不是传递它的地址,在通用过程中对形参的任何操作都不会影响实参,7.2.2按地址传递和按值传递,按地址传递t=10示例Calltest2(t)Printt(t值为5)t与s是Subtest2(sAsInteger)同一个变量s=s-5EndSub,调用时,t值传给s,返回时,s值传给t双向传值,按值传递x=10示例Calltest1(x)Printx(x值为10)y与x是Subtest1(ByValyAsInteger)不同变量y=y+5EndSub,调用时,x值传给y,返回时,y值不传给x单向传值,设置两个通用过程Test1和Test2,分别按值传递和按地址传递PrivateSubForm_Load()DimxAsIntegerShowx=5Print执行test1前,x=;xCalltest1(x)Print执行test1后,test2前,x=;xCalltest2(x)Print执行test2后,x=;xEndSub,Subtest1(ByValtAsInteger)t=t+5EndSubSubtest2(sAsInteger)s=s-5EndSub,运行结果执行Test1前,x=5执行Test1后,Test2前,x=5执行Test2后,x=0,例7.4参数传递方式示例,例7.4,按值传递,按地址传递,7.3.1过程的嵌套调用在一个过程(Sub过程和Function过程)中调用另外一个过程例7.5输入两个数n、m,求组合数Cnm的值Cnm=,n!m!(n-m)!,7.3过程的嵌套调用与递归调用,例7.5,PrivateSubForm_Load()Showm=Val(InputBox(输入m的值)n=Val(InputBox(输入n的值)IfmnThenMsgBox输入数据错误,0,检查错误EndEndIfPrint组合数是:;Calcomb(n,m)EndSubPrivateFunctionCalcomb(n,m)Calcomb=Jc(n)/(Jc(m)*Jc(n-m)EndFunctionPrivateFunctionJc(x)t=1Fori=1Toxt=t*iNextiJc=tEndFunction,程序中,采用了过程的嵌套调用方式。在事件过程Form_Load()中调用了Calcomb过程,而在Calcomb过程中调用了三次jc过程。,调用,调用,过程的嵌套调用,a=Calcomb(n,m),b=Jc(n),事件过程Form_Load,Function过程Calcomb(n,m),Function过程Jc(x),一个过程调用过程本身,就称为过程的递归调用采用递归方法来解决问题时,必须符合以下两个条件:(1)可以把要解的问题转化为一个新的问题,而这个新的问题的解法仍与原来的解法相同;(2)有一个明确的结束递归的条件(终止条件),否则过程将永远“递归”下去,7.3.2过程的递归调用,可用下列的递归公式1n=1n(n-1)!n1本递归中,终止条件是n=1,n!=,例7.6采用递归方法求n!(n0),例7.6,PrivateSubForm_Load()DimnAsInteger,mAsDoubleShown=Val(InputBox(输入115之间的整数)Ifn15ThenMsgBox错误数据,0,检查数据EndEndIfm=fac(n)Printn;!=;mEndSubPrivateFunctionfac(n)AsDoubleIfn1Thenfac=n*fac(n-1)递归调用Elsefac=1n=1时,结束递归EndIfEndFunction,说明:当n1时,在Fac过程中调用Fac过程,然后n减1,再次调用Fac过程,这种操作一直持续到n=1为止。例如,当n=3时,求Fac(3)变成求3Fac(2),求Fac(2)变成求2Fac(1),而Fac(1)为1,递归结束。以后再逐层返回,递推出Fac(2)及Fac(3)的值注意,在某次调用Fac过程时并不是立即得到Fac(n)的值,而是一次又一次地进行递归调用,到Fac(1)时才有确定的值,然后通用过程逐层返回中依次算出Fac(2)、Fac(3)的值,递归调用过程(n=3),求两个正整数n和m的最大公约数,解题方法见例5.8也可采用递归调用方法来求解,递归终止条件是余数为0PrivateSubForm_Load()Showm=Val(InputBox(输入m的值)n=Val(InputBox(输入n的值)Printm;和;n;的最大公约数是:;gys(n,m)EndSubPrivateFunctiongys(n,m)p=nModmIfp=0Then终止条件gys=mElsegys=gys(m,p)mn,pm,再调用EndIfEndFunction,例7.7用递归方法求两个正整数n和m的最大公约数,例7.7,变量的作用域(空间)和生存期(时间)7.4.1代码模块的概念应用程序包括窗体文件(.frm)、模块文件(.bas)和类模块(.cls),7.4变量的作用范围,局部变量、模块级变量和全局变量1.局部变量在一个过程内部用Dim或Static声明的变量称为局部变量。只能在本过程中有效。在一个窗体中,不同过程中定义的局部变量可以同名。例如,在一个窗体中定义PrivateSubCommand1_Click()DimSumAsIntegerSum=1.EndSubPrivateSubCommand2_Click()DimSumAsSingleSum=1.5.EndSub,这两个同名变量Sum没有任何联系,7.4.2变量的作用域,它们互不相识,模块级变量可以在一个窗体的不同过程中使用在窗体模块的声明部分中声明该变量DimnAsIntegerPrivateSubCommand1_Click()n=1EndSubPrivateSubCommand2_Click()n=n+1EndSub如果用Private或Dim来声明,则该变量只能在本窗体(或本模块)中有效,在其他窗体或模块中不能引用该变量。以Public声明的变量,允许在其他窗体和模块中引用,2.模块级变量,全局变量可以被应用程序中任何一个窗体和模块直接访问。全局变量要在标准模块文件(.bas)中的声明部分用Global或Public语句来声明。格式:Global变量名As数据类型Public变量名As数据类型,3.全局变量,生存期,即变量能够保持其值的时间动态变量和静态变量(见书P157)1.动态变量程序运行进入变量所在的过程时,才为变量分配内存单元,退出过程时,该变量占用的内存单元自动释放,其值消失。当再次进入该过程时,所有的动态变量将重新初始化。使用Dim关键字在过程中声明的局部变量属于动态变量2.静态变量退出该过程时变量值被保留,即变量所占的内存单元没有释放。当以后再次进入该过程时,原来的变量值可以继续使用使用Static关键字在过程中声明的局部变量属于静态变量,7.4.3变量的生存期,PrivateSubDimaAsIntegera是动态变量StaticbAsIntegerb是静态变量x=a+1每次进入过程时,a值为0y=b+1每次进入过程时,b保持上次的值EndSub,7.5.1多窗体处理在多窗体程序中,每个窗体可以有自己的界面和程序代码,完成不同的操作1.添加窗体通过“工程”菜单中的“添加窗体”命令来实现2.删除窗体选择“工程”菜单中的“移除”命令3.保存窗体选择“文件”菜单中的“保存”或“另存为”命令4.设置启动窗体在“工程属性”对话框中设置,7.5多窗体与SubMain过程,Load语句:把一个窗体装入内存UnLoad语句:清除内存中指定的窗体Show方法:显示一个窗体Hide方法:隐藏窗体。即不在屏幕上显示,但仍在内存中,因此它与UnLoad的作用是不一样的例如:LoadForm1Form1.Show注意:语句和方法的使用格式不同。调用对象的方法:对象名.方法名,5.有关语句和方法,创建3个窗体和1个标准模块(1)主窗体(Form1)本窗体上建立了“输入数据”(Command11)、“计算”(Command12)和“结束”(Command13)三个命令按钮设置为启动窗体,例7.9多窗体应用示例计算两数之和及积,例7.9,PrivateSubCommand11_Click()主窗体“输入数据”按钮单击后进入“输入数据”窗体Form1.Hide隐藏主窗体Form2.Show显示“输入数据”窗体EndSubPrivateSubCommand12_Click()主窗体“计算”按钮单击后进入“计算”窗体Form1.Hide隐藏主窗体Form3.Show显示“计算”窗体EndSubPrivateSubCommand13_Click()主窗体“结束”按钮UnloadForm1UnloadForm2UnloadForm3EndEndSub,先卸载所有已打开的窗体,(2)“输入数据”窗体(Form2)这是在主窗体上单击了“输入数据”按钮后弹出的窗体,用于输入运算数x和y。窗体上建立了2个文本框(Text21和Text22)和1个“返回”命令按钮(Command21)PrivateSubCommand21_Click()“输入数据”窗体的“返回”按钮X=Val(Text21.Text)Y=Val(Text22.Text)Form2.Hide隐藏“输入数据”窗体Form1.Show显示主窗体EndSub,(3)“计算”窗体(Form3)这是在主窗体上单击了“计算”按钮后弹出的窗体。窗体上建立了1个文本框和2个命令按钮,如图7.10所示。用户可以单击“加法”(Command31)或“乘法”(Command32)命令按钮,使之按要求进行计算。PrivateSubCommand31_Click()“计算”窗体的“加法”按钮Text31.Text=X+YEndSubPrivateSubCommand32_Click()“计算”窗体的“乘法”按钮Text31.Text=X*YEndSubPrivateSubCommand33_Click()“计算”窗体的“返回”按钮Form3.Hide隐藏“计算”窗体Form1.Show显示主窗体EndSub,Text31,(4)标准模块(Modulel)由于在各窗体之间需要使用公共变量来传送数据,所以建立一个标准模块Modulel,对用到的全局变量X和Y进行声明运行程序后,首先显示主窗体。在主窗体上,用户可通过“输入数据”和“计算”两个按钮来选择进入不同的窗体,例如单击“输入数据”按钮,则主窗体消失,显示“输入数据”窗体。在“输入数据”窗体或“计算”窗体上,单击“返回”按钮,又可以隐藏当前窗体和重现主窗体,程序一般从启动窗体的Form_Load过程开始执行有时在程序启动时不加载任何窗体,而是首先执行一段程序代码,此时可把要执行的程序代码放在SubMain过程中,并指定SubMain为“启动对象”。应用程序在运行时会先执行SubMain过程SubMain过程存放在标准模块中。在一个工程中只能有一个SubMain过程设置SubMain过程为“启动对象”的方法:在“工程属性”对话框的“通用”选项卡中,从“启动对象”下拉列表框中选中“SubMain”(见),7.5.2SubMain过程,例7.10,例7.11绘制一个圆,使之从小变大,再从大变小分析:为了得到一个圆大小变动的动画效果,先在某一位置上绘制一个圆,显示一段时间(延时)后抹除,接着在下一位置上依此处理,直到指定位置为止延时:利用Timer函数,该函数返回系统时钟从午夜开始计算的秒数(带两位小数)PrivateSubDelay(d)功能:延时d秒t=Timer()+dDoWhileTimer()t利用空循环实现延迟LoopEndSub,7.6程序举例,例7.11,系统提供的当前时间数,设定的时间数,了解Timer的作用,抹除方法:采用底色(背景色)来掩盖图形,采用Circle方法可以画一个圆,PrivateSubForm_Load()ShowForm1.BackColor=QBColor(15)设置背景颜色CallPict(30,1600,30)从小变大CallPict(1600,30,-30)从大变小EndSubPrivateSubPict(a,b,c)显示延迟抹除Fori=aTobStepc在i位置上处理CallPlot(i,4)显示圆Delay0.1延迟0.1秒CallPlot(i,15)抹除NextiEndSubPrivateSubPlot(r,clr)Form1.Circle(2400,1600),r,QBColor(clr)画圆EndSub,a及b为半径的开始值及结束值,c为每次半径增量,r、clr分别为圆半径和颜色值,PrivateSubForm_Load()ShowRandomizeForm1.BackColo

温馨提示

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

评论

0/150

提交评论