学习课件总讲vb6过程_第1页
学习课件总讲vb6过程_第2页
学习课件总讲vb6过程_第3页
学习课件总讲vb6过程_第4页
学习课件总讲vb6过程_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

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

文档简介

上课了6

过程6.1过程与模块的概念6.2Sub子过程的定义及其调用6.3Function函数过程的定义及其调用6.4参数的传递6.5变量与过程的作用域6.6过程的递归调用6.7常用算法举例(三)6.8多重窗体的程序设计(1)过程的引入:

(a)较大的程序段分成若干小程序段

(b)独立出需要多次调用的程序段

实现结构化程序设计思想的重要方法6.1

过程与模块的概念6.1.1

过程

(2)分类:

两类:系统提供的内部函数过程和事件过程;用户根据自己需要定义的通用过程。(3)事件过程 存储在窗体模块文件中(.frm)优点:①程序模块化,功能明确,清晰,易于修改和维护

②可在不同程序段调用,避免重复编程6.1.1

过程

函数过程(Function)(有返回值)

通用过程

子过程(Sub)(没有返回值)

属性过程(Property)

事件过程(Event)

按作用域划分:公有过程(Public)可被程序中的任意过程调用私有过程(Private)只被同一模块中的过程调用可存储在窗体模块或标准模块

(4)通用过程6.1.1

过程

是VB程序为了将不同类型过程代码组织到一起而提供的一种结构。

(1)窗体模块(文件扩展名为.frm)

每个窗体对应一个窗体模块,窗体模块包含窗体及其控件的属性设置、事件过程、窗体级变量的说明、窗体内的通用过程说明6.1.2模块(2)标准模块(.bas)

需要在多个窗体中共享的代码,应被组织到标准模块中。标准模块可以保存通用过程以及一些相关的说明(全局变量、模块级变量的声明等)。添加标准模块的方法:“工程”

+“添加模块”(3)类模块(.cls)

可在类模块中编写代码,创建新的对象类的属性以及方法的定义。可参见VB联机帮助6.1.2模块应用程序(.vbp文件)一个或若干个窗体模块文件(*.frm)一个或若干个标准模块文件(*.bas)类模块文件(*.cls)事件过程(Sub)用户自定义子过程(Sub)用户自定义函数过程(Function)用户自定义子过程(Sub)用户自定义函数过程(Function)VB应用程序的结构6.2.1

定义Sub子过程[Public|Private][Static]

Sub

子过程名([参数列表])

局部变量或常量声明 语句块

[ExitSub]

语句块

EndSub

6.2Sub子过程的定义及其调用形式参数过程体

过程名:

(与标示符的命名规则相同)

不要与VB关键字同名 不要与WINDOWSAPI函数重名注意

参数列表形式:

[ByVal]变量名[()][As类型]_[,[ByVal]变量名[()][As类型]…]

参数列表中的参数称为形参,

无参函数过程名后的()不可缺省

ByVal:表示其后的形参数是按值传递,

缺省ByVal或用ByRef:表明参数是按地址传递。Sub子过程不能嵌套定义例:Subexl(ByValxAsInteger,yAsInteger)x=x+2y=y+x*2Printx,yEndSubSubswap(xAsInteger,yAsInteger) DimtempAsInteger Ifx<yThen temp=x:x=y:y=temp EndIfEndSub有两种方法:在VB中,打开“代码编辑器”窗口,利用“工具”菜单下的“添加过程”命令定义利用代码窗口直接定义

在“代码编辑器”窗口中的“对象”列表框中选“通用”,再在文本编辑区空白行处键入“Privatesub过程名”或“Publicsub过程名”

6.2.2建立Sub子过程复习数组排序:选择法、冒泡法查找:顺序、二分查找删除、插入通用过程的分类:Sub子过程、Function函数过程、Property属性过程、Event事件过程模块的分类:窗体模块、标准模块、类模块Sub子过程的定义、建立方法调用格式:子过程名[参数列表]

CALL子过程名(参数列表)实在参数6.2.3Sub子过程的调用举例.输入两个整数,按从大到小输出。PrivateSubswap(xAsInteger,yAsInteger) DimtempAsInteger Ifx<yThen temp=x:x=y:y=temp EndIfEndSubPrivateSubCommand1_Click()DimaAsInteger,bAsIntegera=Val(Text1.Text):b=Val(Text2.Text)Ifa<bThen

callswap(a,b)‘过程的调用,或swapa,bEndIfPrinta,bEndSub形式参数x,y(地址传递)实在参数a,b参数列表:

称为实参或实在参数,它必须与形参保持个数相同,位置与类型一一对应。参数传递:调用时把实参的值或地址传递给形参值传递

实参的值不随形参的值变化而变化

引用传递

实参的值随形参的值变化而改变有多个实参时,实参间要用逗号分隔过程调用注意事项:6.2.3Sub子过程的调用调用子过程的形式有两种:

①若用Call关键字时,实参必须用圆括号括起,且左括号与函数名间不能有空格;若实参为空,则可省略括号

②把过程名作为一个独立语句来用,实参不用空括号括起来,且第一个参数与过程名间要有空格当参数是数组时,形参与实参在参数声明时应省略其维数,但括号不能省。若形参变量的类型为String,则只能是不定长的。过程可以嵌套调用P1636.2.3Sub子过程的调用例6-1,求组合数'定义求阶乘的Sub子过程facPrivateSubfac(ByValnAsInteger,fAsLong)DimiAsIntegerf=1Fori=1Tonf=f*iNextiEndSub6.2.3Sub子过程的调用'“=”的click事件PrivateSubCommand1_Click()DimmAsInteger,nAsIntegerDimfmAsLong,fnAsLong,fmnAsLongm=Val(txtm):n=Val(txtn)

facm,fm

’计算m的阶乘

Callfac(n,fn)

’计算n的阶乘

Callfac(m-n,fmn)

’计算m-n的阶乘

txtResult=Str(fm/(fn*fmn))EndSubf是表示返回计算结果的参数示例6-1

函数过程是带有返回值的特殊过程。

6.3.1Function函数过程定义[Public|Private][Static]

Function

函数名([参数列表])[As类型]

局部变量或常量声明 语句块函数名=表达式

[ExitFunction]

语句块函数名=表达式

EndFunction函数体6.3Function函数过程的定义及其调用[As类型]指定函数返回值的类型。若省略,则返回变体型函数的命名规则同Sub子过程名如果没有“函数名=表达式”,则返回对应类型的缺省值在函数体内,可以像使用简单变量一样使用函数名Function函数过程不能嵌套定义建立Function函数过程的方法与建立Sub子过程相同

说明:6.3.1Function函数过程定义

例6-2求圆面积的函数过程:PrivateFunctionCir(ByValrAsSingle)AsSingleConstPI!=3.1415926

Cir=PI*r*r

‘给函数名赋值EndFunction6.3.1Function函数过程定义例6-3求N阶乘的函数过程:PrivateFunctionFact(ByValNAsInteger)AsLongDimkAsInteger

Fact=1IfN=0OrN=1ThenExitFunctionElseFork=1ToN

Fact=Fact*kNextkEndIfEndFunction6.3.1Function函数过程定义调用格式:

变量名=函数过程名([实参数表])

例如:调用例6-2,求两个圆面积之和

Sum=Cir(20)+Cir(30)

6.3.2Function函数过程的调用注意:①实参同Sub子过程②调用时必须给实参加上括号③允许像调用Sub子过程那样调用Function过程如:CallCir(20) Cir20

但这种调用放弃了返回值

6.3.2Function函数过程的调用

例:调用例6-3求阶乘的函数过程,求例6-1中的组合数。

PrivateSubCommand1_Click()DimmAsLong,nAsIntegerm=Val(txtm)n=Val(txtn)txtResult=

Fact(m)/(Fact(n)*Fact(m-n))EndSub

6.3.2Function函数过程的调用不同之处:函数过程通过函数名有返回值,因此定义时需要有返回值的类型说明。

Sub子过程通过变量返回值相同点:完成某种特定功能的一组程序代码总结函数过程与子过程

6.3.2Function函数过程的调用‘判断素数的prime函数过程:PrivateFunctionprime(ByValmAsInteger)AsBoolean

DimiAsIntegeri=2

prime=TrueDoWhileprimeAndi<=Sqr(m)IfmModi=0Then

prime=FalseElsei=i+1EndIfLoopEndFunction例6-5求孪生素数Fori=2ToSqr(m)IfmModi=0Then

prime=FalseExitForEndIfNexti‘窗体的单击事件调用prime函数过程:PrivateSubForm_Click()DimkAsInteger,jAsIntegerj=3DoWhilej<=99Ifprime(j)Andprime(j+2)Thenk=k+1Printj,j+2EndIfj=j+2LoopEndSub

示例6-56.4参数的传递6.4.1形参和实参6.4.2按值传递和按地址传递6.4.3数组参数的传递6.4.4可变参数6.4.5对象参数(1)形参

出现在Sub子过程和Function过程的形参表中的变量名、数组名。

可以是除定长字符串之外的合法变量名;后面跟有圆括号的数组名。在过程调用前,系统并未给其分配内存空间6.4.1形参和实参

表6-1形参与实参形态对应关系(2)实参:在主调过程的实参表中,传递给相应过程的变量名、数组名、常数或表达式形参表和实参表中的对应变量名可以不必相同,但参数的个数要相同,对应位置的参数类型要一致。“形实结合”是按“对应位置”,将主调过程的实参传递给被调过程的形参。

6.4.1形参和实参如下例:PrivateSubExamSub(xAsSingle,Arr1()AsInteger)………….EndsubPrivateSubForm_Click()DimyAsSingle,A(5)AsInteger………….

CallExamSub(y,A)

Endsub6.4.1形参和实参主调过程被调过程实在参数形式参数(1)按值传递

(2)按地址传递6.4.2按值传递和按地址传递

房间1(实参)存放一本书A临时房间(形参)

书A的复制操作:撕掉封皮剩下没有封皮的书(1)按值传递在形参前加“ByVal”关键字,则形参和实参按值传递

结合过程为:在调用一个过程时,系统会给形参分配一个临时存储单元,并将实参变量的值复制到这个临时存储单元中去,实参与形参断开联系,若形参的值被改变,不会影响实参变量。当调用结束时,形参所占用的临时存储单元被释放。实参的值不变

按值传递(分析例6-6)PrivateSubForm_Click()DimmAsInteger,nAsIntegerm=15:n=10Print"调用过程Test前";"m=";m,"n=";n

Calltest(m,n)Print"调用过程Test后";"m=";m,"n=";nEndSubPrivateSubtest(ByValxAsInteger,ByValyAsInteger)x=x+5:y=x+2*yPrint"形参的值";"x=";x,"y=";yEndSub15101015MNXY实参形参说明:①若实参是常量或表达式,则按数值传递②若形参和实参类型不一致,则系统自动进行类型转换。③值传递时,形参和实参分别占有不同的内存,调用结束,形参存储单元释放,形参的变化不影响实参

swf(2)按地址传递

①当形参前不加“ByVal”关键字,或有“ByRef”关键字,则实参和形参的结合方式为按地址传递。

②实参的地址传给形参,形参和实参共用同一内存单元,调用过程中,形参值的变化直接影响到实参

实参的值随形参值的改变而改变1510MNXY实参形参

按地址传递

(分析例6-7)PrivateSubForm_Click()DimmAsInteger,nAsIntegerm=15:n=10Print“调用过程Test前";"m=";m,"n=";n

Calltest(m,n)Print“调用过程Test后";"m=";m,"n=";nEndSubSubtest(xAsInteger,yAsInteger)x=x+5:y=x+2*yPrint"形参的值";"x=";x,"y=";yEndSub1510MNXY实参形参说明:①使用按地址传递的形参,对应的实参一般要求同类型的变量(或数组元素)。若实参是常量或表达式,则将按传值方式传递,若和形参类型不一致,则系统自动对实参进行类型转换,并将转换后的值送给形参。②变量转变为表达式的方法:将变量加括号③调用结束后,形参不在占用此存储单元,由实参占用。示例6-8参数的数据类型转换

swf

数组按传地址方式进行传递。形参数组的语法格式:

形参数组名()[As

类型]

语法格式中忽略数组维数定义,圆括号不能省。调用时注意:

①对应的实参必须是数组,且类型与形参类型对应

②实参数组直接放在实参表中,忽略维数的定义,圆括号可以省略。6.4.3

数组参数的传递

③如果被调过程不知道实参数组的上下界,可用LBound和UBound函数确定实参数组的下界和上界。

④通用过程中不能用Dim语句对形参数组进行声明。当实参数组是动态数组时,可以在过程中用Redim语句改变形参数组的维界(大小),重新定义数组的大小,当控制返回主调过程时,对应实参数组的维界也会随之发生变化6.4.3

数组参数的传递例题6-9累乘积问题

PrivateSubForm_Click()Dima%(1to5),b%(4to8),i%,t1#,t2#Fori=1to5a(i)=iNextiFori=4to8b(i)=iNexti

t1=tim(a())t2=tim(b)Print“t1=”,t1,“t2=”,t2EndSub示例6-9Functiontim(a()AsInteger)Dimt#,i%t=1fori=Lbound(a)toUbound(a)

t=t*a(i)nextitim=tEndFunction编一求任意一维数组各元素之积的通用函数过程,并调用它复习Sub子过程和Function函数过程的定义、建立方法、调用方法要善于把一些问题通过编写Sub子过程和Function函数过程来实现参数传递:按值传递、按地址传递数组参数的传递传递时的注意点:变量,表达式,数据类型区别:实参的值与形参的变化例6-10选择法排序(调用排序的子过程)

PublicSubsort2(a()AsInteger)

DimiAsInteger,jAsIntegerDimiminAsInteger,tAsIntegerFori=LBound(a)ToUBound(a)-1imin=iForj=i+1ToUBound(a)Ifa(j)<a(imin)Thenimin=jNextjt=a(i):a(i)=a(imin):a(imin)=tNextiEndSubPrivateSubForm_Click()

Dima()AsInteger,iAsInteger,nAsIntegern=Val(InputBox("输入数组元素个数"))ReDima(1Ton)Randomize:Print"排序前"Fori=1Tona(i)=Int((99-10+1)*Rnd)+10Printa(i);NextiPrint:

sort2a()

Print"排序后"Fori=1TonPrinta(i);NextiEndSub

例6-10

指在调用一个过程时,向过程传递实参的个数可以任意变化。格式:

Sub过程名(ParamArray数组名())

例6-116.4.4可变参数VB允许用对象作为参数向过程传递,即窗体或控件可以作为通用过程的参数

在形参表中用“AsForm”来定义的形参为窗体参数,调用该过程时,可向过程传递窗体;在形参表中用“AsControl”来定义的形参为控件参数,调用该过程时,可向过程传递控件。注意:对象的传递只能是按地址传递。

例6-136.4.5对象参数6.5

变量与过程的作用域6.5.1变量的作用域6.5.2过程的作用域(1)局部变量:过程中{Dim|Static}变量名[As类型][,变量名[As类型]]..(2)窗体/模块级变量:窗体/模块“通用声明”处{Dim|Private}变量名[As类型][,变量名[As类型]]...(3)全局变量:窗体/模块的“通用声明”处

Public变量名[As类型][,变量名[As类型]]...6.5.1变量的作用域

'定义求阶乘的Sub子过程facPrivateSubfac(ByValnAsInteger,fAsLong)

DimiAsInteger

f=1Fori=1Tonf=f*iNextiEndSub(1)局部变量:过程中,作用域:本过程

其值在运行过程中存在,运行后消失。每次调用过程时,局部变量初始化。{Dim|Static}变量名[As类型][,变量名[As类型]]...6.5.1变量的作用域PrivateSubForm_Click()

DimxAsIntegerx=2Print“x=“;xEndSubPrivateSubCommand1_Click()

DimxAsIntegerx=3Print“x=“;xEndSubX的作用域X的作用域6.5.1变量的作用域例6-14静态变量类型

作用域是过程内,但其值在运行过程中保留,

每次调用过程时,保留原来的值,不初始化PrivateSubForm_Click()

StaticikAsIntegerik=ik+1Print"目前为止已经单击了窗体";ik;"次"EndSub6.5.1变量的作用域(2)窗体/模块级变量:窗体/模块“通用声明”处

{Dim|Private}变量名[As类型][,变量名[As类型]]...

DimikAsIntegerPrivateSubForm_Click()ik=ik+1PrintikEndSub‘单击3次结果:234

PrivateSubForm_Load()ik=1EndSub作用域:本窗体/本模块,可被本窗体/本模块的任何过程调用6.5.1变量的作用域(3)全局变量:窗体/模块“通用声明”处

Public变量名[As类型][,变量名[As类型]]…作用域:整个应用程序,可被应用程序的任何过程访问其值在整个程序中保留,不会消失和初始化直到整个程序运行结束,才会消失

注意:窗体中声明的全局变量在被其它窗体引用时,

窗体名.变量名

6.5.1变量的作用域在标准模块中声明PublicikAsInteger在Form1窗体模块中编写:PrivateSubForm_Load()

ik=1EndSubPrivateSubForm_Click()

ik=ik+1Print"ik=";ikForm2.ShowEndSub在Form2窗体模块中编写PrivateSubForm_Click()

ik=ik+1Print"ik=";ikEndSub

例6-16全局变量改在Form1窗体中声明PublicikAsInteger在Form1窗体模块中编写:PrivateSubForm_Load()

ik=1EndSubPrivateSubForm_Click()

ik=ik+1Print"ik=";ikForm2.ShowEndSub在Form2窗体模块中编写PrivateSubForm_Click()

From1.ik=Form1.ik+1Print"ik=";Form1.ikEndSub

例6-16全局变量注意:

①VB允许在不同级声明相同的变量名,一般在同一模块中定义了不同级而同名的变量时,系统优先访问作用域小的变量名.②要在过程中引用同名的全局变量,必须在变量名前加窗体/模块名6.5.1变量的作用域PublicXAsIntegerPrivateSubForm_Click()Dim

XAsInteger

X=2

‘访问局部变量X

Form1.X=1

‘访问全局变量XPrintX,Form1.X‘输出局部变量X,全局变量XEndSub6.5.1变量的作用域PrivatexAsIntegerPrivateSubCommand1_Click()

StaticyAsIntegerDimzAsIntegern=10:z=n+zy=y+z:x=x+zLabel1.Caption=xLabel2.Caption=yLabel3.Caption=zEndSub连续3次单击命令按钮,标签中显示的内容是(1)窗体/模块级(Private)

只能被本窗体或本标准模块内的事件过程或其他过程调用

(2)全局级

(Public)

可被整个应用程序的所有窗体和所有标准模块中的过程调用

P178表6-3过程的作用域说明6.5.2

过程的作用域(2)对于多窗体,选用某个窗体作为启动窗体的方法:“工程”+“工程属性”或在工程上单击右键举例说明创建新窗体和添加现有窗体(工程/添加窗体)删除窗体保存窗体(1)多重窗体的建立和管理6.8

多重窗体的程序设计(3)窗体之间的切换语句和方法

①Load语句:把窗体装入到内存,但并不显示出来

语句格式:Load窗体名称

②Unload语句:将窗体从内存中卸载

Unload窗体名称/UnloadMe

③Show方法:显示一个窗体,触发窗体的Load事件

[窗体名称.]Show

Show方法兼有装入和显示窗体两种功能。

④Hide方法:隐藏指定的窗体,没有删除

[窗体名称.]Hide6.8

多重窗体的程序设计(4)多重窗体应用frmmainfrminputfrmoutput结束示例工程16.8

多重窗体的程序设计6.6

递归6.6.1

递归的概念6.6.2

递归子过程和递归函数(1)递归定义用自身的结构来描述自身就称为“递归”例:n!=n×(n-1)!

(2)递归种类:直接递归调用与间接递归调用①直接递归调用:甲调用甲

②间接递归调用:甲调用乙,并且乙调用甲6.6.1递归的概念

直接递归调用间接递归调用

f函数f1函数f2函数调用f函数调用f2函数调用f1函数

6.6.1递归的概念

即:一个子过程和函数在自身定义的内部直接(或间接)调用自己。其特点是:

描述方便、编程简单

如求阶乘。缺点是:

时、空开销大。在递归调用中,一个过程执行的某一步要用到其自身的前一步或者前若干步的结果。6.6.2

递归子过程和递归函数

例6-17:计算Fac(n)=n!n!=n×(n-1)!=n×Fac(n-1)Fac(n)=1(n=0,n=1)n×Fac(n-1)(n>1)Fac(5)=Fac(4)*5Fac(3)*4Fac(2)*3Fac(1)*2=1*2=26.6.2

递归子过程和递归函数(1)具备递归结束条件及结束时的值(2)能用递归形式表示,并且递归向终止条件

(或称边界条件)发展(3)软件支持构成递归的条件递归例程序例6-17求Fac(n)=n!的值:①用递归形式表示:n!=n×(n-1)!

Fac(n)=②递归结束条件:Fac(1)=1③递归向终止条件发展

Fac(4)=4*Fac(3)=4*3*Fac(2)=4*3*2*Fac(1)1,n=1n×Fac(n-1),n>1复习可变参数,对象参数变量的作用域:定义的位置、使用的关键字过程的作用域:定义的位置、使用的关键字递归的定义递归的条件fac(3)=3*fac(2)fac(1)=1fac(2)=2*1fac(3)=3*2fac(2)=2*fac(1)递推回归动画演示‘求Fac(n)=n!的函数PrivateFunctionFac(NAsInteger)AsLong‘递归函数

IfN=0OrN=1ThenFac=1Else

Fac=N*Fac(N-1)EndIfEndFunction‘输出结果过程Fac(4)PrivateSubForm_Click()Print“Fac(4)=”;Fac(4)EndSub‘调用递归函数,求N!PrivateSubForm_Click()DimNAsInteger,FAsLongN=Val(InputBox("输入一个非负整数"))

F=Fac(N)PrintN;"!=";FEndSub 6-17

递归调用的执行过程:

①主调程序执行过程中遇到调用递归函数时,转去执行相应的函数;②每次调用时,应记录下次调用的返回地址和本次调用的各有关参数值;③递归调用结束时,按照每次调用的参数与返回值的对应关系逐个取出,进行计算。

PrivateFunctionFac(nAsInteger)AsLongDimiAsIntegerFac=1Fori=2Ton

Fac=Fac*iNextiEndFunction递推:

采用一般的子过程或函数用循环的方法,每次用本次结果递推计算下次结果例:递推计算阶乘n!=1×2×3×…×n.

递归和递推比较

递归:简洁精练可读性好存储空间开销大(栈)

运行速度慢递推:可读性差开销小运行速度快例6-18求契比雪夫多项式

1n=0T(n,x)=xn=12xT(n-1,x)-T(n-2,x)n>=2PrivateFunctionChb(nAsInteger,xAsSingle)AsSingle

Ifn=0ThenChb=1ElseIfn=1ThenChb=xElse

Chb=2*x*Chb(n-1,x)-Chb(n-2,x)

EndIfEndFunc

温馨提示

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

评论

0/150

提交评论