四章函数与过程_第1页
四章函数与过程_第2页
四章函数与过程_第3页
四章函数与过程_第4页
四章函数与过程_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1VisualBasic6.0

程序设计教程吉梅温医计算机教研室

2引例(1)求的值(2)求10!+20!+30!的值解:(1)printsqr(10)+sqr(20)+sqr(30)(2)Fori=1Ton fac=fac*i'fac初值为1 Nexti如果有一个可以求n!的函数该多好啊

3函数与过程

内部函数是VB事先定义好的函数,我们可以直接拿过来用,但内部函数并不能解决所有的问题,有很多地方需要我们亲自动手,编写自定义的函数或者过程。函数过程内部函数自定义函数事件过程自定义子过程

4函数和过程的区别:函数有返回值,过程无返回值。函数与过程MsgBox函数和MsgBox过程函数形式:变量名=MsgBox(提示[,按钮][,标题])

过程形式:MsgBox提示[,按钮][,标题]例:3-46

5PrivateSubForm_Click()Dimi%,r%,s#:ConstPI=3.14r=InputBox("请输入圆的半径","求圆的面积")s=PI*r*r

i=MsgBox("圆的面积:"&s,1,"计算的最终结果")EndSubPrivateSubForm_Click()Dimi%,r%,s#:ConstPI=3.14r=InputBox("请输入圆的半径","求圆的面积")s=PI*r*r

MsgBox"圆的面积:"&s,1,"计算的最终结果"EndSub

6本章学习目标函数过程的定义和调用子过程的定义和调用参数传递变量的作用域、生存期

7自定义函数

8Function

Fac(nAsLong)AsLong

DimF&,i%F=1Fori=1TonF=F*iNextiFac=FEndFunctionPrivateSubCmdOk_Click()Dimm&,n&,c&,i%DimFacN&,FacM&,FacNM&m=InputBox("请输入m的值","组合公式")n=InputBox("请输入n的值","组合公式")

……

c=Fac(n)/(Fac(m)*Fac(n-m))

lblResult.Caption=Str(c)EndSub

可以将代码中功能重复的部分用自定义函数来编写,这将大大提高编程的效率。自定义函数

9[Static][Public|Private]Function函数名([形参声明列表])[As类型]

……函数名=表达式EndFunction自定义函数—定义方式<限定词>Function函数名([形参声明列表])[As<类型>]<函数体>EndFunctionFunction

Fac(nAsLong)AsLong

DimF&,i%F=1Fori=1TonF=F*iNextiFac=FEndFunction

10自定义函数—调用方式调用的语法形式:

函数名([<实参列表>])说明:函数调用时实参和形参的数据类型、顺序、个数必须匹配;(如RGB函数)

例如:c=Fac(n)/(Fac(m)*Fac(n-m))

由于函数过程名返回一个值,故函数不能作为单独的语句加以调用,必须作为表达式或表达式的一部分,再配以其他的语法成分构成语句。函数的主要功能是求得函数的返回值。

11函数过程的调用:

变量名=函数名([实参列表])定义:Functionarea(x!,y!,z!)AsSingle

调用:s1=area(a,b,c) s2=area(c,e,d)abcd

efgS1S2S3

例:已知多边形的各条边的长度,要计算多边形的面积。

12自定义函数—参数形参:在函数定义中的参数列表称为形参。形参标明了在调用函数时参数的个数、位置和类型。形参仅仅是一个符号,是要被实际数据所代替的。实参:函数调用中的参数列表就是实参。实参就是替换掉形参、参与运算的实际数据。参数传递:程序在调用函数时,实参代替形参的过程。参数:就是指函数操作时所需要的数据。

13自定义函数—参数参数传递:实参代替形参的时候,是用相对应的实参把<函数体>中所遇到的全部形参一一替换掉。数学上函数的使用:F(x,y)=2x+5y-xyx,y:形参a=3,b=5a,b:实参F(a,b)=?F(a,b)=2a+5b-ab=2*3+5*5-3*5=16实参代替每一处存在的形参执行过程体中的代码获得函数的结果VB中函数的参数传递与数学中的过程是一样的。

14例4-3显示1~100之间的素数。要求编制函数过程,用于判断1个整数是否是素数。PrivateFunctionprime(nAsInteger)AsBooleanDimiAsIntegerIfn<2Thenprime=FalseElseFori=2ToSqr(n)IfnModi=0ThenExitForNextiIfi>Sqr(n)Thenprime=TrueElseprime=FalseEndIfEndFunction这里的n是形参,表示需要一个整数参与运算

15例4-4计算a数组中最大值与b数组中最大值之差。如果能够定义一个函数,让其功能是在n个元素的数组中找最大值,则程序的结构会更清晰。PrivateFunctionfmax(x()AsSingle,ByValnAsByte)AsSinglefmax=x(1)Fori=2TonIfx(i)>fmaxThenfmax=x(i)NextiEndFunction注意:数组作为形参时,数组名后的括号不能省,但维数要省略。并要再设置一个或多个形参传递实参数组的元素个数

16SUB过程—定义方式SUB过程有两种:事件过程和自定义子过程SUB过程的实质就是去执行其中的一系列语句来实现某种功能;语句全部执行完就是过程的任务完成之时。而函数的执行目的是为了追求函数的返回值,再利用此值参与运算。SUB过程的定义形式如下:[Public|Private][Static]Sub<过程名>([形参声明列表])……[ExitSub]……EndSub

17说明:

SUB过程名:命名规则与变量命名规则相同。

SUB过程无返回值,亦即无<As数据类型><SUB过程体>内不存在类似<函数体>中用来返回值的特殊赋值语句。如果中途要退出过程,使用语句:ExitSub形参声明格式(同函数声明中的形参):

[ByVal|ByRef]变量名[As数据类型][,…]

18SUB过程的建立选择“工具”菜单中的“添加过程”命令,即出现“添加过程”对话框(见右图):如:

PublicSubSort()

……EndSub

19SUB过程—调用方式

两种调用方式:

(1)SUB过程名实参列表

(2)

CallSUB过程名(实参列表)使用Call关键字时,参数两边要加圆括号省略Call关键字,则必须省略参数两边的圆括号。

20PrivateSubForm_Click()DimFirst%,Second%First=Val(InputBox("请输入第一个数:","First"))Second=Val(InputBox("请输入第二个数:","Second"))Print"初始值:First=";First,"Second=";Second

swapFirst,SecondPrint"交换后:First=";First,"Second=";SecondEndSubPrivateSubswap(xAsInteger,yAsInteger)DimTempAsIntegerTemp=x:x=y:y=TempEndSub例:编写一个交换两个整型变量值的SUB过程。

21PrivateSubcmdOK()……

CallSwap(a,b)……Swapa,b……EndSubPrivateSubSwap(x%,y%)Dimtemp%Temp=xx=yy=TempEndSubSUB过程调用的执行过程:

22例4-6编程,单击窗体后,在窗体上显示如下图案所有输出行的共性为:先输出m个空格、n个指定字符,然后换行。m、n以及所输出的字符作为形参,调用时由对应的实参表达式确定。因此,可以编写为SUB过程

23参数传递

参数的传递是实参一一替换形参的过程;而实参传递给形参存在两种传递的方式:

按值传递、按地址传递,即传值和传址按值传递:形参得到的是实参的值,形参的改变不会影响实参的值。按地址传递:形参得到的是实参的地址,当形参的值改变时,实参的值也跟着改变。形参前加“ByVal”关键字的是按值传递形参前加“ByRef”关键字或什么都不加的是按地址传递

24参数传递—按值传递PrivateSubForm_Click()DimaAsInteger,bAsIntegera=10b=20Print"初始值:a=";a,"b=";bPrint

Callswap1(a,b)Print"交换后:a=";a,"b=";bEndSubPrivateSubswap1(ByValxAsInteger,ByValyAsInteger)DimtAsIntegert=x:x=y:y=tEndSub例

25参数传递—按值传递按值传递——将复印件上交,原件不受影响

26参数传递——按地址传递PrivateSubForm_Click()DimaAsInteger,bAsIntegera=10b=20Print"初始值:a=";a,"b=";bPrint

Callswap2(a,b)Print"交换后:a=";a,"b=";bEndSubPrivateSubswap2(x%,y%)Dimt%t=x:x=y:y=tEndSubPrivateSub

swap2(ByRefx%,ByRefy%)Dimt%t=x:x=y:y=tEndSub例

27参数传递——按地址传递按地址传递——将原件上交,改的就是原件

28例:单击窗体后的运行结果PrivateSubss(ByValx%,ByRefy%,z%)x=x+1y=y+1z=z+1EndSubPrivateSubForm_Click()DimA%,B%,C%A=1B=2C=3Callss(A,B,C)PrintA;B;CEndSub134

29PrivateSubForm_Click()DimxAsInteger,yAsIntegerx=1

CallAA(x)Printx

y=BB(x)Printx,yEndSubPublicSubAA(ByValaAsInteger)a=a+1EndSubPublicFunctionBB(ByRefbAsInteger)b=b+1

BB=b+1EndFunction

30数组为参数当参数是数组时,无论是形参还是实参,都应省略其维数。但形参括号不能省略!如:privatesubsort(a()asinteger,nasinteger)Endsub数组参数在传递时只能按地址传递!例4-9编制SUB过程,用于在数组中找出最大值、最小值

31PrivateSubForm_Click()Dimb(6)AsSingle,xAsSingle,yAsSingle,iAsIntegerFori=1To6b(i)=InputBox("b("+Str(i)+")=")Nexti

findb(),6,x,yPrintx,yEndSubPrivateSubfind(a()AsSingle,n%,ByRefmax!,ByRefmin!)max=a(1):min=maxWhilen>1Ifa(n)>maxThenmax=a(n)Ifa(n)<minThenmin=a(n)n=n-1WendEndSub思考:ByRef改成ByVal会显示怎样的结果注意:实参与形参的个数、类型、位置、次序要一一对应

32小结过程Sub过程函数过程问题:Sub过程与函数过程有什么区别?事件过程自定义子过程内部函数自定义函数问题:参数传递的两种方式?

33<限定词>Function函数名([形参声明列表])[As<类型>]

<限定词>变量名as<数据类型> ExitFunction ……EndFunction<限定词>

Sub过程名([形参声明列表]) …… ExitSub ……EndSub

34多模块程序设计模块是VB用于将不同类型过程代码组织到一起而提供的一种结构。VB中有3种类型:窗体模块、标准模块、类模块窗体模块:每个窗体都有一个相对应的窗体模块,包含窗体中各个对象的事件过程、控件属性等。标准模块中保存的过程都是通用过程。类模块:用于创建新的对象类的属性、方法等。标准模块的创建方法跨模块调用

35过程的作用域过程的作用域:过程可被访问,起作用的范围。<限定词>Function函数名([形参列表])[As<类型>]……EndFunction<限定词>

Sub子过程名([形参列表])……EndSub过程的执行:事件的驱动:单击事件过程调用:内部函数的调用、事件过程的调用[例1]

36过程的作用域可以通过Public和Private两个限定词对过程起作用的范围加以区分。当过程前的限定词为Private,则表明此过程只能被本模块中其他的过程所调用,我们称之为模块级过程。当过程前的限定词为Public,则表明此过程不仅能被本模块所调用,也可以被其他模块中的过程所调用,我们称之为全局过程。[例3]

37过程的作用域过程前没有限定词时,默认为PublicPublic

Subswap(x%,y%)DimT%T=xx=yy=TEndSub(标准模块)Private

SubForm_Click()Dima%,b%a=InputBox("请输入第一个数:","a")b=InputBox("请输入第二个数:","b")Print"初始值:a=";a,"b=";bCall

swap

(a,b)

Print"交换后:a=";a,"b=";bEndSubPrivateSubCommand1_Click()Form2.ShowEndSub(Form1模块)Private

SubForm_Click()Dimp%,q%p=InputBox("请输入第一个数:","p")q=InputBox("请输入第二个数:","q")Print"初始值:p=";p,"q=";qCall

swap

(p,q)Print"交换后:p=";p,"q=";qEndSub(Form2模块)

38过程的作用域思考:(1)如果swap在标准模块中是用Private定义的,是否能被Form1和Form2调用?(2)如果swap是在Form1中用Private定义的,是否能被Form1和Form2调用?(3)如果swap是在Form1中用Public定义的,是否能被Form1和Form2调用?

39过程的作用域(调用规则)

40变量的作用域和生存期变量的作用域:变量能被使用的范围。变量的生存期:变量从产生到消亡的时间。声明变量的语法形式:

Dim|static|public|private

<变量名>[as<类型>]所谓初始化就是给新分配的存储空间一个初始值。数值类型的初始值为0,字符串类型的初始值为空字符串””,逻辑类型的初始值为False。声明变量的位置和限定词二者共同决定了变量的作用域和生存期。我们把变量分为:

局部变量、模块级变量、全局变量。

41局部变量的概念:用Dim或Static在过程内声明的变量称为局部变量。局部变量的作用域和生存期局部变量的作用域:只能在声明它的过程中使用,而不能被其它过程调用。所以可以在不同的过程中声明相同名字的局部变量而互不影响。

PrivateSubCommand1_Click()

DimnAsIntegern=10Print"Command1中的n=";nEndSubPrivateSubCommand2_Click()

DimnAsIntegern=20Print"Command2中的n=";nEndSub作用域例子

42局部变量的作用域和生存期以Dim声明——动态局部变量以Static声明——静态局部变量(过程结束,变量占据的存储空间被释放)(过程结束,变量还会保持当前的值)局部变量的生存期:若是动态变量,生存期为变量所在过程的执行期;若是静态变量,生存期为整个应用程序的运行期PrivateSubCommand2_Click()

StaticnAsInteger

n=n+10PrintnEndSubPrivateSubCommand1_Click()

DimnAsInteger

n=n+10PrintnEndSub生存期例子

43注意:如果在过程头的起始处加上Static关键字,则此过程为模块级过程;过程中的所有局部变量都变为静态局部变量,无论它们是用Static或Dim声明的。局部变量的作用域和生存期StaticSubCommand1_Click()DimnAsIntegerStaticmAsIntegern=n+10m=m+100Print"n=";nPrint"m=";mEndSub

44

程序阅读1:请写出下列程序运行时单击窗体后,窗体上的显示结果。

45模块级变量的作用域和生存期模块级变量的概念:用Private或Dim在模块内的“通用-声明”段声明的变量.模块级变量的作用域:只能在声明它的模块中使用,能被本模块中的所有过程调用。模块级变量的生存期:整个应用程序的运行期。Private和Dim之间没有什么区别,但Private更好些,因为很容易把它和Public区别开来,使代码更容易理解。所以一般使用Private声明模块级变量。

46模块级变量的作用域和生存期PrivateZAsIntegerSubS()Z=Z+2PrintZEndSubPrivateSubForm_Click()Z=Z+2CallSPrintZEndSub问题:第一次单击窗体?第二次单击窗体?第三次单击窗体?

47全局变量的作用域和生存期全局变量的概念:用Public在模块内的“通用-声明”段声明的变量。全局变量的作用域:能被整个工程中的所有模块的所有过程调用。全局变量的生存期:整个应用程序的运行期。[例]全局变量问题:将Publici%,j%,k%声明在标准模块中?将Publici%,j%,k%声明在Form2中?

48三种变量的声明及使用规则如下表

49变量的作用域和生存期例:有一个人编了下面一段程序,想用变量n记录单击命令按钮Command1的次数。PrivateSubCommand1_Click()DimnAsIntegern=n+1Print"已单击次数:";n&"次"EndSub

50变量的重名问题

我们说过,变量命名时,在同一范围内名称必须唯一,否则会发生名称冲突。但我们可以在不同的作用域范围内声明具有相同名称的变量,它们是毫无关联的不同变量,不会相互影响。

51变量的重名问题PrivateSubCommand1_Click()DimXAsInteger,YAsInteger,ZAsIntegerX=2Y=3Z=X+YCallSPrintX,Y,ZEndSubSubS()DimXAsInteger,YAsInteger,ZAsIntegerX=1Y=2Z=X+YPrintX,Y,ZEndSub

52

如果发生作用域重叠,就应该

温馨提示

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

评论

0/150

提交评论