第五章过程和函数Word格式.docx

上传人:b****1 文档编号:1397297 上传时间:2023-04-30 格式:DOCX 页数:93 大小:410.53KB
下载 相关 举报
第五章过程和函数Word格式.docx_第1页
第1页 / 共93页
第五章过程和函数Word格式.docx_第2页
第2页 / 共93页
第五章过程和函数Word格式.docx_第3页
第3页 / 共93页
第五章过程和函数Word格式.docx_第4页
第4页 / 共93页
第五章过程和函数Word格式.docx_第5页
第5页 / 共93页
第五章过程和函数Word格式.docx_第6页
第6页 / 共93页
第五章过程和函数Word格式.docx_第7页
第7页 / 共93页
第五章过程和函数Word格式.docx_第8页
第8页 / 共93页
第五章过程和函数Word格式.docx_第9页
第9页 / 共93页
第五章过程和函数Word格式.docx_第10页
第10页 / 共93页
第五章过程和函数Word格式.docx_第11页
第11页 / 共93页
第五章过程和函数Word格式.docx_第12页
第12页 / 共93页
第五章过程和函数Word格式.docx_第13页
第13页 / 共93页
第五章过程和函数Word格式.docx_第14页
第14页 / 共93页
第五章过程和函数Word格式.docx_第15页
第15页 / 共93页
第五章过程和函数Word格式.docx_第16页
第16页 / 共93页
第五章过程和函数Word格式.docx_第17页
第17页 / 共93页
第五章过程和函数Word格式.docx_第18页
第18页 / 共93页
第五章过程和函数Word格式.docx_第19页
第19页 / 共93页
第五章过程和函数Word格式.docx_第20页
第20页 / 共93页
亲,该文档总共93页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

第五章过程和函数Word格式.docx

《第五章过程和函数Word格式.docx》由会员分享,可在线阅读,更多相关《第五章过程和函数Word格式.docx(93页珍藏版)》请在冰点文库上搜索。

第五章过程和函数Word格式.docx

1.子过程

1)事件过程

事件过程由VB自行声明,附加在窗体和控件上,用户不能增加或删除。

当用户对某个对象发出一个动作时,Windows会通知VB产生了一个事件,VB会自动地调用与该事件相关的事件过程。

事件过程只能放在窗体模块中。

事件过程的常用格式如下:

PrivateSub<

对象名>

_<

事件名([<

形参表>

])>

<

语句系列>

EndSub

2)通用过程

通用过程由用户定义或删除修改,可以放在标准模块中,也可以放在窗体模块中,其格式如下:

[Private|Public]Sub<

过程名>

(<

参数表>

<

EndSub

2.函数过程

1)系统函数

VB为了简化程序设计,提供了许多内部函数供设计者调用,如Abs(),Int(),ASC(),MID()等。

常用系统函数的使用在本书的第二章有详细介绍。

2)用户自定义函数

除了有固定功能的系统函数之外,还允许用户编写自己的函数过程,被称为用户自定义函数,格式如下:

[Private|Public]Function<

自定义函数过程名>

)[As<

类型>

]

语句>

EndFunction

5.2子过程SUB的定义和调用

5.2.1创建子过程

建立通用过程有两种方法:

直接在“代码”编辑窗口中输入过程代码或使用“添加过程”对话框。

1.在“代码”编辑窗口中输入

在“代码”编辑窗口中,把光标定位在已有过程的外面(即通用声明段),然后按如下格式输入通用过程:

[Private|Public][Static]Sub<

([<

])

[ExitSub]

[<

说明:

1)Public|Private

可以将子过程放入标准模块、类模块和窗体模块中。

按照缺省规定,所有模块中的子过程为Public(公有的),这样在应用程序中可随处调用它们。

如果选用Private,则只有该过程所在模块中的程序才能调用该过程。

2)Static

若使用Static关键字,则该过程中的所有局部变量的存储空间只分配一次,切这些变量的值在整个程序运行期间都存在,即在每次调用该过程时,各局部变量的值一直存在;

若省略Static,过程每次被调用时重新为其变量分配存储空间,当该过程结束时释放其变量的存储空间。

3)过程名

过程名的命名规则与变量名相同,长度不超过40个字符。

一个过程名只能有唯一的名字,在同一模块中,同一名称不能既作Sub过程名又作Function函数过程名。

4)语句系列

是过程的过程体,语句系列中可以用一个或多个ExitSub语句从过程中退出。

5)形参表

形参表中的语法为:

[ByVal]参数名1[As类型名],[ByVal]参数名2[As类型名],…,

其中ByVal表明该参数是值传递方式。

形参表中出现的参数称为形式参数,简称形参。

它并不代表一个实际的存在变量,在调用此过程时,存储对应实参传递过来的确定的值。

类似于变量声明,它指明了从调用过程传递给被调过程变量的个数和类型。

各变量名之间用逗号分隔,其中的形式参数被缺省为具有Variant数据类型,但建议将形参声明一个指定的数据类型。

2.使用“添加过程”对话框

使用“添加过程”对话框建立过程的步骤为:

(1)打开要添加过程的代码编辑窗口。

(2)执行“工具”菜单中的“添加过程”命令,打开“添加过程”对话框,如图5-3所示。

图5-3过程添加对话框

(3)在“名称”文本框中输入过程名。

从“类型”中选择“子程序”类型。

从“范围”组中选择范围,相当于使用Public或Private关键字。

(4)单击“确定”按钮。

使用这个方法建立了一个过程模板,可以在模板上添加过程体代码。

5.2.2调用子过程

SUB过程可以被其它过程(包括事件过程和通用过程)调用。

每次调用过程都会执行Sub和EndSub之间的语句系列。

Sub过程以Sub开始,以EndSub结束。

当程序遇到EndSub时,将退出过程,并立即返回到调用语句的后续语句中。

1.调用方法

调用Sub过程有两种方法:

(1)使用Call语句:

Call<

([<

实参表>

])

(2)直接使用过程名:

2.使用说明

(1)<

是实际参数表,实参必须用圆括号括起,参数与参数之间用逗号分隔。

(2)当用Call语句调用执行过程时,若无实参,其过程名后圆括号不能省略,若有参数,则参数必须放在括号之内。

(3)若省略Call关键字,则过程名后不能加括号,若有参数,则参数直接跟在过程名之后,参数与过程名之间用空格分隔,参数与参数之间用逗号分隔。

例如,以下两个语句都调用Recarea过程:

CallRecarea(6,7)

Recarea6,7

3.实例应用

【例5.1】编写一个计算矩形面积的Sub过程,然后调用该过程计算矩形面积。

PrivateSubForm_Click()

DimAAsSingle,BAsSingle

A=Val(InputBox("

请输入矩形长度?

"

))

B=Val(InputBox("

请输入矩形宽度?

CallRecarea(A,B.

SubRecarea(RlenAsSingle,RwidAsSingle)

DimAreaAsSingle

Area=Rlen*Rwid

MsgBox"

总面积是"

&

Area'

输出矩形面积

在以上实例中,子过程Recarea用来计算矩形面积并显示计算结果,主调程序Form_Click提供实际参数A、B,分别为矩形的长和宽。

当执行到主调程序中的语句CallRecarea子过程时,程序流程进入Recarea子过程内部,实际参数A、B分别传递给形式参数Rlen,Rwid,直到遇到EndSub语句才结束Recarea子过程,返回到主调程序Form_Click中。

5.3函数过程的定义和调用

函数过程是过程的另一种形式,当过程的执行需要返回一个值时,使用函数就比较简单。

Function过程和内部函数一样,可以在程序或函数嵌套中使用。

5.3.1创建用户自定义函数过程

与Sub过程一样,Function过程也是一个独立的过程,可读取参数、执行一系列语句并改变其参数的值。

创建用户自定义函数过程有两种方法:

直接在“代码”编辑窗口中输入函数过程代码或使用“添加过程”对话框。

在“代码”编辑窗口中,把光标定位在已有过程的外面,然后按如下格式输入函数过程:

[Private|Public][Static]Function<

函数过程名>

])[As<

[<

函数名>

=<

表达式>

[ExitFunction]

1)Public|Private

与在子过程一样的作用范围。

与在子过程一样的作用。

3)函数过程名

函数过程名的命名规则与变量名相同,长度不超过40个字符,同样,一个过程名只能有唯一的名字在同一模块中,同一名称不能既作Function函数过程名又作Sub过程名。

As<

指定Function过程返回值的类型,可以是Integer,Long,Single,Double,Currency,String或Boolean。

如果没有As子句,缺省的类型为Variant。

是函数的过程体,语句系列中可以用一个或多个ExitFunction语句从函数中退出。

形参表的含义与Sub相同。

6)表达式

表达式的值是函数返回的结果。

在程序中,通过赋值语句将值赋给函数名,该值就是Function过程返回的值。

如果在Function过程中省略了“<

”,则该过程返回一个默认值:

数值函数过程返回0,字符串函数过程返回空字符串。

因此,为了能使一个Function过程完成所指定的操作,通常要在过程中为函数赋值。

使用“添加过程”对话框建立过程的步骤与添加子过程步骤一致,只是在“添加过程”对话框中选择类型为“函数”即可。

5.3.2调用函数过程

1.调用方法

函数过程的调用比较简单,可以像使用VB内部函数一样来调用Function过程,只需要在表达式中写上它的名字。

其语法格式如下:

变量=函数名(实参1,实参2,实参3,…,实参n)

显然,与调用子程序的方法不同,自定义函数的调用遵循内部函数(如Sin、Abs、ASC等)的调用规则,实参也必须用圆括号括起来。

实参可以是常量、变量、表达式或数组变量名。

实参数据的类型应与子程序定义时的形式参数类型一致。

当子程序的形参传送方式是地址传递时,调用时的实参必须是变量,不允许是常量或表达式。

例如:

a=Myfunction(5,10,1)

【例5.2】求1到6的阶乘之和,即1!

+2!

+…+6!

Functionfact(xAsInteger)AsLong

DimPAsLong,iAsInteger

P=1

Fori=1Tox

P=P*i

Nexti

fact=P

PrivateSubCommand1_Click()

DimsumAsLong,iAsInteger

Fori=1To6

sum=sum+fact(i)

Label2.Caption=sum

以上实例中的fact函数用来完成x!

的计算,主调程序Command1_Click用语句sum=sum+fact(I)来完成函数fact的调用,将实参I的值传递给形参x,在函数fact中赋值语句fact=P将x!

的值通过函数名返回到主调程序中。

在主调程序的循环体循环6次就完成了1!

,2!

,…,6!

的计算,并进行求总和,将总和在标签Label2中显示。

5.3.3函数过程与子过程的区别

函数过程与子过程的区别如下:

1)适用范围

把某功能函数定义为函数过程或子过程,没有严格的规定,但只要能用函数过程定义的,一定能用子过程定义,反之不一定。

因此子过程比函数过程适用范围广。

但当只需要返回一个值时,习惯用函数过程,当需要返回多个值时,习惯用子过程。

2)返回值

函数过程有返回值,函数过程名也就有类型,同时在函数过程体内必须对函数过程名赋值。

子过程名没有值,子过程名也就没有类型,不能在子过程体内对子过程名赋值。

【例5.3】VB提供了一个标准函数Replace(),实现查找与替换的功能。

现在分别用用户自定义子过程和函数过程来实现。

PublicFunctionMyReplace(s$,OldS$,NewS$)AsString

Dimi%,lenOldS%

lenOldS=Len(OldS)

i=InStr(s,OldS)

DoWhilei>

0

s=Left(s,i-1)+NewS+Mid(s,i+lenOldS)

Loop

MyReplace=s

PublicSubsMyReplace(s$,OldS$,NewS$)

DimstrAsString

PrintMyReplace(Text1,Text2,Text3)

str=Text1

CallsMyReplace(str,Text2,Text3)

Text1.Text=str

在上述Command1_Click中,替换后的值通过函数名返回,而在子过程中只有通过变量str作为数据通道来传递。

特别指出,对象属性不能完成地址方式的传递。

5.4过程调用中的参数传递

调用过程的目的,就是在一定的条件下完成某一工作或计算某一数值。

调用过程时可以把数据传递给过程,也可以把过程中的数据传递回来。

在调用过程中,必须考虑调用过程和被调用过程之间的数据的调用方式。

VB中用参数来实现主调过程和被调过程间的数据传递。

通常在编制一个过程时,要考虑它需要输入哪些量,进行处理后输出哪些量。

正确地提供一个过程的输入数据和正确地引用其输出数据,时使用过程的关键问题,也就是通过调用过程和被调用过程之间的数据传递问题。

5.4.1形式参数与实际参数

1.形式参数

形式参数是接收数据的变量。

形式参数表中的各个变量之间用逗号分隔。

形式参数表中的变量类型可以是合法的简单变量,也可以是数组如A(),但不能是定长字符串。

例如在形参表中只能用如Str1AsString之类的变长字符串作为形式参数,不能用Str1AsString*40之类地定长字符串作为形式参数,但定长字符串可以作为实际参数传递给过程。

2.实际参数

实际参数是指在调用Sub或Function过程时,传递给Sub或Function过程的常量、变量或表达式。

实参表可由常量、表达式、合法的变量名、数组名(后跟左、右括号)组成,实参表中各参数用逗号分隔。

形式参数与实际参数的对应关系用下图5-4所示:

调用过程:

CallSub1(23,A(),"

VB6.0"

rest)

被调用过程:

SubSub1(aAsInteger,aa()AsSingle,bbAsString,ccAsLong)

图5-4形参与实参的对应关系

在定义过程时,形式参数为实际参数保留位置。

在调用过程时,实际参数被插入对应形式参数变量处,第1个形式参数接收第1个实际参数的值,第2个形式参数接收第2个实际参数的值,依此类推。

如上图5-6中,调用过程提供实际参数23、A()、"

、rest,被调子过程Sub1提供形式参数aa、a()、bb、cc。

当执行调用时,实参23传递给a,实参A()传递给aa(),实参"

传递给bb,实参rest传递给cc。

在调用时完成形式参数与实际参数的结合,即把实际参数传递给形式参数,然后按形式参数执行被调用的过程。

5.4.2值传递和地址传递

参数传递的方式有两种:

值传递和地址传递。

1.值传递

如果在定义形式参数时使用了ByVal,或者在调用语句中的实际参数是常量或表达式,那么实参与形参之间数据传递方式是值传递。

在调用过程时,当实参是常量时,直接将常量值传递给形参变量中;

当实参是变量时,仅仅将实参变量的值传递给形参变量。

然后执行被调过程,在被调过程中,即使对形参发生改变也不会影响实参值的变化。

2.地址传递

按地址传递参数,就是将实参的地址传递给相应的形参,形式参数与实际参数使用相同的内存地址单元,这样通过调用被调程序可以改变实参的值。

在进行地址传递时,实际参数必须是变量,常量或表达式无法进行地址传递。

系统缺省的参数传递方式是按地址传递。

下面是一个既有值传递又有地址传递的实例。

【例5.4】先对a、b赋一个初值,然后调用子过程P1,因参数的传递方式不同,a、b参数的原值发生了变化。

程序清单如下:

DimaAsInteger,bAsInteger

a=20:

b=50

p1a,b

Print"

a="

;

a,"

b="

b

Subp1(xAsInteger,ByValyAsInteger)

x=x*10

y=y+20

图5-5两种参数传递方式示意图

该程序实参是a,b,被形参是x、y,其中x是地址传递方式,y是值传递方式。

当单击窗体,调用p1a,b语句后,两种参数调用方式见示意图5-5。

实参a的地址传递给形参x,也就是实参a与形参x共同占用一个内存单元,当对形参x执行语句x=x*10后,a,x的值都变成200。

而实参b仅仅将值传递给形参y,当对形参y执行语句y=y+20后,形参y的值变成70,但b的值仍然是50。

因此单击窗体运行程序后,窗体上显示结果a=200,b=50。

4.实参与形参结合时应注意的问题

1)个数、顺序、类型三一致。

实参表与实参表中变量名不必相同,但两表中的个数必须相同,而且各实际参数的数据类型书写顺序必须与相应形式参数的类型要一致。

2)形参是值传递时,对应实参可以是表达式、常量、数组元素。

3)形参是地址传递时,对应实参只能是简单变量,而且是声明了与形参一致的类型。

4)数组、记录类型、对象做参数时只能是地址传递方式。

5)当实参是对象的属性时,是值传递,即使形参是地址传递方式,也不会改变实参的值,也就是不会改变对象的属性值。

5.4.3使用参数

1.使用可选参数

1)定义可选参数

一个过程在声明时定义了几个形参,则在调用这个过程时就必须使用相同数量的实参数。

VisualBasic允许在形参前面使用Optional关键字把它设为“可选参数”。

Optional关键字可以与ByVal、ByRef关键字同时修饰一个参数。

如果一个过程的某个形参为可选参数,则在调用此过程时可以不提供对应于这个形参的实参。

如果一个过程有多个形参,当它的一个形参设定为可选参数时,这个形参之后所有的形参都应该用Optional关键字定义为可选参数。

2)调用可选参数

调用一个具有多个可选参数的过程时,可以省略它的任意一个或多个可选参数。

如果被省略的不是最后一个参数,它的位置要用逗号保留。

如CallSub1(int1,,int2)表明省略了第二个参数。

若一个可选参数没有被省略,则调用语句的实际参数与非可选参数相同。

未得到实参值的形参在调用时被赋以形参类型的默认值。

【例5.5】下面的事件过程在调用一个具有可选参数的过程时,省略了相应的实参。

PrivateSubCommand1_Click()'

省略了第二个参数

Callmysub1("

abcd"

Submysub1(var1AsString,Optionalvar2AsInteger)'

第二个参数可选

Text1.Text=var1

Text2.Text=var2'

当前情况下,由于var2没有得到相应实参的值,因此var2在调用时被赋以Integer类型的默认值,即var2的值为0。

2.可选参数的缺省值

前面讲过,一个可选参数被省略时,调用时赋给形参的是它的数据类型的默认值。

如果希望在省略一个可选参数时,能够赋给形参一个其他特定的值,就要用到给可选参数设定默认值的方法。

可以在声明过程时,通过给可选参数赋值的方法来设定可选参数的默认值。

当调用此过程时即使未提供相应实参的值,形参也会以它的默认值来运行程序。

例题:

Submysub1(var1AsString,Optionalvar2AsInteger=10)'

第二个参数可选,设定默认值时要注意,赋值号要放在类型名称的后面。

此时将var2变量的值10赋给Text2.Text

5.4.4数组作为参数传递

1.数组传递原则

整个数组可以作为一个实参传递给过程,但是要求过程在声明

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2