版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
子过程和函数过程1第1页,课件共86页,创作于2023年2月本章主要介绍:定义Sub过程定义Function函数过程调用Sub过程或Function函数过程调用事件过程变量的存储类别和作用域。编写过程,可以实现代码重复使用。2第2页,课件共86页,创作于2023年2月8.1.1什么是过程过程是编写程序的功能模块使用过程主要有以下两方面的原因:1.可以把复杂的问题简单化任务分解为子任务,子任务用过程实现使程序结构清晰、易读,也便于调试和维护。2.可以实现代码重复使用可以避免重复编写的烦琐可以减少出错。8.1概述3第3页,课件共86页,创作于2023年2月8.1.2
过程分类与调用流程VB中的过程分成两大类:事件过程:由对象的某个事件驱动执行如Click事件过程、Load事件过程等通用过程由用户自已定义的完成某一功能的过程。通用过程不属于任一对象,不由事件驱动使用专用的调用语句来执行它4第4页,课件共86页,创作于2023年2月通用过程又分两类:Sub过程(子过程、子程序)往往用于处理不需要有返回值的一些基本任务如显示矩阵。Function函数过程:可作为函数使用,它一般应有一个返回值如求阶乘。5第5页,课件共86页,创作于2023年2月调用流程如图:VB的应用程序就是由若干个过程构成的。6第6页,课件共86页,创作于2023年2月【例8-1】设计程序,其作用是根据姓名查电话号码。输入姓名后,单击“确定”或按回车键,使姓名与内部储存的一批姓名核对,若存在,则显示“欢迎查询”内并使窗体只显示标签,且文字为姓名和对应的电话号码。最多允许输入3遍。控件:1个标签、1个文本框1个“确定”命令按钮8.2查询电话号码7第7页,课件共86页,创作于2023年2月过程:Form_Load事件:储存一批姓名和电话号码等Command1_Click事件:核对姓名,显示提示Text1_KeyPress事件:核对姓名,显示提示CheckName函数过程:判断此人是否存在,得下标/-1。姓名和电话号码为模块级变量、N为静态变量。8第8页,课件共86页,创作于2023年2月DimName1,Phone'声明Name1,Phone为模块级Variant类型变量
PrivateSubCommand1_Click()
'核对姓名,显示提示
StaticNAsInteger'声明N为静态整型变量
DimTAsInteger
T=CheckName(Text1.Text)'以姓名为参数,调用函数CheckBook
IfT<>-1Then
MsgBox"欢迎查询!",,"提示"
Text1.Visible=False:Command1.Visible=False
Label1.Caption="姓名:"&Text1.Text&Chr(13)&"电话:"&Phone(T)
Label1.Left=(Form1.ScaleWidth-Label1.Width)/2'让标签在中间9第9页,课件共86页,创作于2023年2月Else
N=N+1'核对次数加1
IfN<3Then
MsgBox"你输错了,这是第"&N&"次错,请重输!",,"提示"
Text1.Text="":Text1.SetFocus
Else
MsgBox"你已经输错3次了!再见!",,"提示"
End
EndIf
EndIf
EndSub10第10页,课件共86页,创作于2023年2月
PrivateSubForm_Load()'初始化数组、设置属性
Label1.AutoSize=True
Text1.Text="":Label1.Caption="姓名:":Command1.Caption="确定"
Name1=Array("张小红","李小芳","王小华","王力","李季","黄大海")
Phone=Array(8820123,8882011,7812321,2444522,1243211,3434555)
EndSub
11第11页,课件共86页,创作于2023年2月
FunctionCheckName(NaAsString)AsInteger
‘函数过程,返回位置
DimiAsInteger
CheckName=-1
Fori=LBound(Name1)ToUBound(Name1)’线性查找法
IfName1(i)=NaThenCheckName=i:ExitFor
NextIEndFunctionPrivateSubText1_KeyPress(KeyAsciiAsInteger)
IfKeyAscii=13ThenCommand1_Click
‘遇回车时,调用事件过程
EndSub12第12页,课件共86页,创作于2023年2月VB中的模块属于工程资源它由过程或声明构成,以独立的文件管理。工程中包含窗体、类和标准模块文件本节介绍窗体模块标准模块。8.3窗体模块和标准模块13第13页,课件共86页,创作于2023年2月8.3.1
窗体模块窗体模块是大多数VB应用程序的基础窗体模块与窗体对应,存放窗体上所有信息:窗体及窗体上各控件界面信息、属性、事件过程通用过程变量和常量的声明等。窗体模块文件的扩展名为.Frm一个应用程序可以创建多个窗体模块14第14页,课件共86页,创作于2023年2月8.3.2
标准模块和SubMain过程标准代码模块一般存放与特定窗体或控件无关的通用过程、全局变量的声明等如求阶乘一个过程要被多个不同对象或模块调用时,那么该过程一般可放在标准模块中。一个应用程序可建立多个标准模块建立标准模块的方法是:使用“工程”菜单的“添加模块”命令项。15第15页,课件共86页,创作于2023年2月应用程序启动时,可先装载窗体,也可先运行
SubMain过程SubMain是过程名为Main的特殊过程SubMain过程必须放在标准模块中才可作为启动对象。启动对象可以在工程属性中设置16第16页,课件共86页,创作于2023年2月8.4.1定义Sub过程Sub过程一般指通用子过程,可在程序中调用执行,执行完毕后无返回值。它可以定义在窗体模块的通用对象中,也可以定义在标准模块中。格式:
Sub过程名([参数列表])
[语句块]
EndSub8.4Sub过程17第17页,课件共86页,创作于2023年2月1.关于格式过程名的命名方式与变量名命名一致。参数列表为调用时传递给Sub过程的参数,用逗号间隔。Sub过程也可以没有参数,但括号不可省。参数的常用语法是:参数名[As类型说明]定义时的参数,又称为形式参数,简称形参。Sub和EndSub必须成对出现18第18页,课件共86页,创作于2023年2月2.关于语句块语句块即为过程体,与事件过程的代码编写一样包含变量声明和可执行的语句、方法等可以由顺序、分支、循环三种结构综合而成。语句块中可直接使用参数说明:语句块中不能重复声明形式参数。Sub过程名([参数列表])
[语句块]
EndSub19第19页,课件共86页,创作于2023年2月3.过程定义步骤打开代码窗口,对象框中选“通用”,然后输入过程首行并回车,VB自动显示EndSub然后再输入过程体就可以了。如:定义过程Hello:实现以姓名为参数显示“XXX你好!”(XXX具体内容由参数决定)Sub过程名([参数列表])
[语句块]
EndSub20第20页,课件共86页,创作于2023年2月完整代码应为:
SubHello(XXXAsString)
MsgBoxXXX&"你好!"
EndSub以上过程的过程名为Hello形式参数为XXX且是字符串型过程体只用了一句MsgBox,并同时使用了参数XXX。21第21页,课件共86页,创作于2023年2月程序中使用调用语句可调用Sub过程过程运行完毕或跳出过程运行后,返回到调用处。1.调用Sub过程的方法过程定义在当前模块或标准模块中使用以下两种格式之一:
格式一:过程名[实参数列表]
格式二:Call过程名[(实参数列表)]如Hello过程,可以使用:
Hello"王小红"或CallHello("王小红")22第22页,课件共86页,创作于2023年2月过程定义在窗体模块中而调用语句在其它模块中采用以下两种格式之一:
格式一:窗体名.过程名[实参数列表]
格式二:Call窗体名.过程名[(实参数列表)]调用Sub过程的方法也可以用来调用事件过程,如例4-10,可用:
PrivateSubCheck2_Click()
Check1_Click'这时调用的过程名即为Check1_Click
EndSub23第23页,课件共86页,创作于2023年2月2.关于过程调用时的参数过程调用时的参数称为实际参数,简称实参。它可以变量、常量或表达式。实参与形参的个数应相同、类型应一致若实参是表达式,则先计算值,再将值送给对应的形参。实参和形参可以使用同名变量。如果定义的过程没有形参,则调用时就没有实参。24第24页,课件共86页,创作于2023年2月使用Call调用时,实参部分要加上括号不使用Call关键字,直接用过程名调用时,参数部分不能加上括号,但过程名和第一个参数之间要有空格。例如,编程:要求输入姓名,调用Hello过程,则程序如下:
PrivateSubCommand1_Click()
DimSAsString
S=InputBox("请输入姓名")
HelloS
EndSub25第25页,课件共86页,创作于2023年2月【例8-2】分析以下程序:
SubA(nAsInteger)
DimiAsInteger
Fori=1Ton:Printi;:Next
CallB
EndSub
SubB()
Print"BBBBBB"
EndSub
PrivateSubCommand1_Click()
CallA(9)
B
'直接使用过程名调用过程B()
EndSub26第26页,课件共86页,创作于2023年2月8.4.2
调用Sub过程【例8-3】设计一个如图所示的程序,其作用是显示字符图案。显示的字符和行数由输入决定,形状可以是正三角形或倒三角形。编写通用过程Print_triangle,输出三角形图案。显示的字符S、行数Line、及作为正或倒的三角形标志Flag均作为参数Print_triangle供两个命令按钮调用两个命令按钮的Click事件:输入1个字符和行数,调用
Print_triangle过程。8.4Sub过程27第27页,课件共86页,创作于2023年2月8.4.2调用Sub过程—字符三角形SubPrint_triangle(SAsString,LineAsInteger,FlagAsInteger)'通用过程
DimAAsInteger,BAsInteger,iAsInteger,jAsInteger
ClsIfFlag=-1ThenA=Line:B=1ElseA=1:B=Line
Fori=AToBStepFlag'正:从小到大循环,倒:从大到小循环
PrintTab(Line+10-i);
Forj=1To2*i–1:PrintS;:Nextj
Nexti
EndSub28第28页,课件共86页,创作于2023年2月
PrivateSubCommand1_Click()
DimChAsString*1,LineAsInteger'Ch只容纳1个字符
Ch=InputBox("请输入一个要显示的字符")
Line=Val(InputBox("请输入显示的行数"))
Print_triangleCh,Line,1'以标志1调用过程
EndSub
PrivateSubCommand2_Click()
DimChAsString*1,LineAsInteger
Ch=InputBox("请输入一个要显示的字符")
Line=Val(InputBox("请输入显示的行数"))
Print_triangleCh,Line,-1'以标志-1调用过程
EndSub29第29页,课件共86页,创作于2023年2月8.4.3
ExitSub语句使用ExitSub语句可以中途结束子过程的运行。程序不再执行ExitSub到EndSub之间的代码,而是直接返回到调用处。ExitSub语句一般往往与If语句合用,如:修改例8-3中的Print_triangle过程,当Line参数小于等于0,Flag参数不等于±1时,显示“参数错误”并退出过程。30第30页,课件共86页,创作于2023年2月则可以在Print_triangle过程的Cls前增加一句:
IfLine<=0OrAbs(Flag)<>1ThenMsgbox"参数错误":ExitSubExitSub也可以用在事件过程特别注意:在过程中途退出过程不能使用EndSub。31第31页,课件共86页,创作于2023年2月8.5.1
定义Function函数过程Function函数过程执行完毕后有一个返回值。函数过程定义后,可像系统函数一样使用。函数可定义在窗体模块的通用对象中或标准模块中。格式:
Function函数名([参数列表])[As类型说明]
[函数体]
EndFunction8.5Function函数过程32第32页,课件共86页,创作于2023年2月1.关于格式函数名、参数列表的要求与Sub过程的过程名、参数相同。Function必须在EndFunction之前出现,且必须成对Function语句中的类型说明,是返回值的类型。如编一个判断整型参数n是否为素数的函数,首行可写为:
FunctionPrime(nAsInteger)AsBoolean33第33页,课件共86页,创作于2023年2月8.5.1定义Function函数过程2.关于函数体函数体是一系列用于完成某一功能的代码包含变量声明和可执行语句可由顺序、分支、循环三种结构合成。一般格式:
[语句块]
函数名=表达式
[语句块]一般,函数体中应有一句“函数名=表达式”,表示该表达式的值就作为函数的返回值该表达式的类型应该与函数的类型说明一致34第34页,课件共86页,创作于2023年2月3.函数定义步骤同编写过程一样,在“通用”对象代码窗口输入函数首行。如定义函数过程Max,实现求三个数的最大值:
FunctionMax(aAsInteger,bAsInteger,cAsInteger)AsInteger
Max=a
Ifb>Max
ThenMax=b
Ifc>Max
ThenMax=c
EndFunction35第35页,课件共86页,创作于2023年2月以上函数过程的过程名为Hello形式参数a、b、c为整型函数体中多次使用了函数名Max,并使用了参数特别说明:不能写成Max(a,b,c)=a。
36第36页,课件共86页,创作于2023年2月8.5.2调用Function函数过程函数调用方式如同调用VB内部函数调用格式:
函数过程名[(实参数列表)]调用函数往往在可以使用表达式的代码中出现,只要类型相同就可以了。如对Max函数过程,可以使用:
A=Max(1,43,5):PrintMax(Max(1,3,21),56,4)如果函数定义在窗体模块中而调用语句在其它模块中,则调用时应在函数名前加上所属的窗体名。实参用法和要求,与子过程调用相同。37第37页,课件共86页,创作于2023年2月【例8-4】编程计算,在本文框输出。要求计算n!使用函数过程Factorial(n)实现。控件:2个文本框、3个标签
1个命令按钮。过程:通用函数过程Factorial(n):求阶乘Command1_Click事件:求属性:大部分属性在Form_Load中设置命令按钮为图形按钮,更改Style、Caption和Picture属性38第38页,课件共86页,创作于2023年2月FunctionFactorial(NAsInteger)AsDouble'通用函数过程,求n!
DimiAsInteger,TAsDouble
T=1
Fori=1ToN:T=T*i:Nexti
Factorial=TEndFunctionPrivateSubCommand1_Click()'计算结果,要求m≥n
DimMAsInteger,NAsInteger
M=Val(Text1.Text):N=Val(Text2.Text)
IfM<NThen'当m<n时,给出提示,清除数据,跳出过程39第39页,课件共86页,创作于2023年2月
MsgBox"m必须大于等于n。",,"提示“
Text1.Text="":Text2.Text="":Text1.SetFocusExitSubEndIfLabel3.Caption="答案:"&Factorial(M)/(Factorial(N)*Factorial(M-N))
EndSubPrivateSubForm_Load()
‘初始化控件属性
Label1.Caption="m=":Label2.Caption="n=":Label3.Caption="“Text1.Text="":Text2.Text="“EndSub40第40页,课件共86页,创作于2023年2月8.5.3ExitFunction语句使用ExitFunction语句跳出Function函数过程。ExitFunction语句一般与If语句合用,即在满足某种条件时退出该函数过程,返回调用处。如修改例8-4中的Factorial函数过程,当N<0时显示“参数错误”并退出Factorial函数过程。则可以增加:IfN<0ThenFactorial=1:MsgBox"参数错误":ExitFunction注意:在函数过程中途退出不能使用EndFunction。41第41页,课件共86页,创作于2023年2月形式参数(形参)是过程定义时的参数实际参数(实参)是过程调用时的参数过程调用时,实参向形参传递数据传递的方法分为:“引用传递”(“引用调用”)“按值传递”(“按值调用”)(这里的过程是统指子过程和函数过程)8.6引用调用和按值调用42第42页,课件共86页,创作于2023年2月8.6.1
引用调用引用调用:形参变量与实参变量共享一个内存单元。此时,过程中对形参的修改,影响实参变量即可实现把过程中对形参修改的结果带回调用过程。前面格式中,所有参数都采用引用调用,除非实参是表达式。单击Command1后,N1和N为同一个内存单元,所以N1的值就变成8。最终窗体显示8。43第43页,课件共86页,创作于2023年2月引用调用的形参说明,可使用格式:ByRaf参数名[As类型说明]缺省ByRaf表示引用调用。如:
SubAbc1(NAsInteger)
N=N+5
EndSub
PrivateSubCommand1_Click()
DimN1AsInteger
N1=3:CallAbc1(n1):PrintN1
EndSub44第44页,课件共86页,创作于2023年2月8.6.2
按值调用按值调用时,实参值被复制到形式参数中如果实参为变量,相当于两者用了不同的存储单元对形参的操作不会影响实参的内容。按值调用的形式参数的说明,使用格式:ByVal
参数名
[As类型说明]若实参是表达式,则一律使用按值调用单击Command1后,N1和N实际上
是不同的内存单元,调用时只将
N1的值送入形参N中,最终显示3。45第45页,课件共86页,创作于2023年2月如:
SubAbc2(ByValNAsInteger)
N=N+5
EndSub
PrivateSubCommand1_Click()
DimN1AsInteger
N1=3:CallAbc2(N1)
PrintN1
EndSub
46第46页,课件共86页,创作于2023年2月【例8-5】编写求一元二次方程实数解的过程并调用它。由于方程有两个解。而函数返回一个值。解决方法:编写Sub过程Root,X1和X2为引用调用,A、B、C为按值调用。
Sub
Root(ByValAAsSingle,ByValBAsSingle,_
ByValCAsSingle,X1AsSingle,X2AsSingle)
DimDAsSingle
D=B*B-4*A*C
IfA=0ThenMsgBox"不是一元二次方程!":ExitSub
IfD<0ThenMsgBox"方程无实数解!":ExitSub
X1=(-B+Sqr(D))/(2*A):X2=(-B-Sqr(D))/(2*A)
EndSub47第47页,课件共86页,创作于2023年2月PrivateSubCommand1_Click()
DimAAsSingle,BAsSingle,CAsSingle,X1AsSingle,X2AsSingle
A=3:B=9:C=5
RootA,B,C,X1,X2
‘A、B、C按值,X1和X2引用调用
PrintX1,X2EndSub程序调用前,X1和X2没有赋过值,通过
引用调用,使它们得到了方程的实数解。48第48页,课件共86页,创作于2023年2月8.6.3
传递数组传递数组,形式参数的格式:
参数名()[As类型说明]数组不能按值调用,只能引用调用【例8-6】随机产生两个3×4的矩阵A和B,矩阵元素值为1~50的整数。求两个矩阵的和C。并输出矩阵A、B和C。运行如图。矩阵加法使元素C(i,j)=A(i,j)+B(i,j)49第49页,课件共86页,创作于2023年2月编写过程:通用过程PrintM:实现矩阵输出通用过程CreateM:产生矩阵事件过程Form_Load:初始化随机数种事件过程Command1_Click:调用通用过程并实现题目50第50页,课件共86页,创作于2023年2月8.6.3
传递数组--矩阵加法SubCreateM(A()AsInteger)
'创建
Fori=1ToUBound(A,1)Forj=1ToUBound(A,2)A(i,j)=Int(Rnd*50)+1NextjNextiEndSub51第51页,课件共86页,创作于2023年2月SubPrintM(A()AsInteger)'输出
Fori=1ToUBound(A,1)Forj=1ToUBound(A,2)PrintA(i,j),NextjPrintNextiEndSub
说明:UBound函数的第2个参数指数组的维,当该数为1时,指它的第1维上界,该数为2时,指它的第2维上界。52第52页,课件共86页,创作于2023年2月PrivateSubCommand1_Click()
DimA(3,4)AsInteger,B(3,4)AsInteger
DimC(3,4)AsInteger,iAsInteger,jAsInteger
CreateMA
‘创建矩阵A
CreateMB
’创建矩阵B
Fori=1To3
‘矩阵加法
Forj=1To4
C(i,j)=A(i,j)+B(i,j)
Nextj
NextiCls
53第53页,课件共86页,创作于2023年2月
PrintTab(22);"A矩阵":PrintMA'输出A
PrintTab(22);"B矩阵":PrintMB
'输出B
PrintTab(22);"C矩阵":PrintMC
'输出CEndSubPrivateSubForm_Load()
RandomizeEndSub
54第54页,课件共86页,创作于2023年2月8.6.4可选参数可选参数表示调用时该参数可选(可不写)定义可选参数是在形参的前加Optional关键字若该形参后还有参数,则后面必须都定义为可选。IsMissing函数判断是否提供可选参
数,若未提供,则值为True。这时两个过程调用语句可分别改为:
Print_triangleCh,Line
'2个参数
Print_triangleCh,Line,-1
'3个参数。55第55页,课件共86页,创作于2023年2月如例8-3的Print_triangle过程,可将第3个参数Flag设置为可选:若调用时不用Flag表示输出正三角形:
SubPrint_triangle(SAsString,LineAsInteger,OptionalFlagAsInteger)
DimAAsInteger,BAsInteger,CAsInteger,iAsInteger,jAsInteger
Cls:A=1:B=Line:C=1
IfNotIsMissing(Flag)Then
IfFlag<0ThenA=Line:B=1:C=-1
EndIf Fori=AToBStepC
PrintTab(Line+10-i);
Forj=1To2*i–1:PrintS;:Nextj
NextiEndSub56第56页,课件共86页,创作于2023年2月8.6.5可变参数使用可变参数可使参数个数不受限制可变参数其实是一种数组表示法可变参数在形参前加上ParamArray关键字。如将Max函数定义为使用可变参数的函数:57第57页,课件共86页,创作于2023年2月FunctionMax(ParamArrayA())AsInteger'使用可变参数
DimiAsInteger,MAsInteger
M=A(1)
Fori=LBound(A)ToUBound(A)
IfA(i)>MThenM=A(i)
Nexti
Max=M
EndFunction
PrivateSubCommand1_Click()'调用时,参数个数可以不限
PrintMax(6,4,3,2,1)'使用了5个参数
PrintMax(10,34,5,56,2,55,67,83,9)'使用了9个参数
EndSub58第58页,课件共86页,创作于2023年2月8.6.6对象参数过程可以使用对象如在7.8节的“选择联系人”例子中,List1_KeyDown事件过程和List2_KeyDown事件过程的代码除了对象名不同外,其它是可以相同,因此可用参数为对象的通用过程Delete:59第59页,课件共86页,创作于2023年2月
SubDelete(aAsObject,keyCodeAsInteger)'将a定义为对象变量
DimiAsInteger
IfkeyCode=vbKeyDeleteThen'按下了Delete键,删除已选项目
Fori=a.ListCount-1To0Step-1
Ifa.Selected(i)=TrueThena.RemoveItemi
Next
EndIfEndSubPrivateSubList1_KeyDown(keyCodeAsInteger,ShiftAsInteger)
DeleteList1,keyCodeEndSubPrivateSubList2_KeyDown(keyCodeAsInteger,ShiftAsInteger)
DeleteList2,keyCodeEndSub60第60页,课件共86页,创作于2023年2月变量是存放数据的单元,其中的数据随着程序的运行而变化。过程中使用Dim语句声明的变量,将随着过程的结束而消失,其中的储存的数据也就不再存在。其实,程序还可以使用多种存储类别的变量:可以整个应用程序都可使用可以在定义的过程中继续使用…8.7存储类和作用域61第61页,课件共86页,创作于2023年2月8.7.1
存储类别根据存储类别,变量分成静态变量和动态变量。1.动态变量指程序运行进入变量所在过程时,才给变量分配内存空间,退出该过程时,变量所占用内存空间自动释放,其值消失,变量不再存在。在过程中使用Dim语句声明的变量属于动态变量。62第62页,课件共86页,创作于2023年2月如有以下过程:
PrivateSubCommand1_Click()
DimAAsInteger
A=A+1:PrintA
EndSub窗体启动后,无论用户单击Command1多少次,
显示的数据总是1。63第63页,课件共86页,创作于2023年2月8.7.1
存储类别2.静态变量静态变量指程序运行中虽然退出变量所在的过程,但变量所占用的空间没有释放,值仍保留,若下次再进入该过程,原值仍可使用。使用Static语句在过程中声明的变量属于静态变量。Static变量只能在过程中声明。格式:
Static变量名As类型说明64第64页,课件共86页,创作于2023年2月例如以下事件过程,单击显示:
PrivateSubCommand1_Click()
DimAAsInteger'A为动态变量
StaticBAsInteger'B为静态变量
A=A+1:B=B+1:PrintA,B
EndSub111213…65第65页,课件共86页,创作于2023年2月8.7.2
作用域作用域指变量或符号常量在程序哪个范围中有效。作用域分成:局部的、模块级的和全局的三类。1.局部变量/局部符号常量局部变量是指在过程中声明的变量它在过程内采用Dim语句或Static语句声明局部符号常量是指在过程中定义的符号常量它在过程内采用Const语句定义。它们只能在该过程中有效。66第66页,课件共86页,创作于2023年2月其它过程中出现同名量,则代表着另一个量。如:
PrivateSubCommand1_Click()'事件过程Command1
DimXAsInteger'X变量仅在该过程中有效
ConstPI=3.1415926'符号常量PI仅在该过程中有效
X=3:Print"有效的值";X*PI
EndSub
PrivateSubCommand2_Click()'事件过程Command2
PrintX,PI'无效
EndSub若用了OptionExplicit语句,单击Command2时还会出错67第67页,课件共86页,创作于2023年2月2.模块级变量/模块级符号常量模块级变量或符号常量可在一个模块的各过程中使用窗体模块级变量/常量是在通用对象的声明部分用Dim或Private语句声明变量,或用Const定义符号常量。如:
PrivateXAsInteger'也可以使用Dim,将x声明为模块级变量
PrivateSubForm_Load()
X=5
EndSub
68第68页,课件共86页,创作于2023年2月PrivateSubCmd1_Click()
X=X+1
Print"过程1中的X=";X
EndSub
PrivateSubCmd2_Click()
X=X+1
Print"过程2中的X=";X
EndSub按序单击Cmd1和Cmd2,显示:
过程1中的X=6
过程2中的X=7
只要应用程序不停止运行,即使
窗体卸下后再次装载,原值仍可用69第69页,课件共86页,创作于2023年2月8.7.2
作用域3.全局变量/全局符号常量全局变量在整个应用程序中有效全局变量在窗体通用对象或标准模块中Public声明:Public变量名As类型说明定义全局符号常量的格式为:PublicConst符号常量名=常量表达式70第70页,课件共86页,创作于2023年2月说明:过程中不能用Public和Private声明变量和定义符号常量;窗体模块中不能用Public定义全局符号常量,也不能声明数组、定长字符串和用户自定义类型,它们只能在标准模块中用。71第71页,课件共86页,创作于2023年2月标准模块中声明的全局变量,在其它模块中可直接使用窗体模块声明的全局变量,其它模块采用格式:
窗体名.变量名
如:Form1.X=100与模块级变量一样,全局变量在静态存储区分配空间。72第72页,课件共86页,创作于2023年2月8.7.3生存期生存期是指变量的存在时间只有动态变量,生存只在过程的一次执行中静态变量、模块级变量和全局变量的生存期将持续到整个应用程序运行结束。73第73页,课件共86页,创作于2023年2月8.7.4
过程的作用域和局部变量存储类别定义过程时,可加上作用域关键字Public或Private,可加存储类别的关键字Static。过程定义首行格式可以写成:[Private|Public][Static]Sub过程名[(参数列表)][Private|Public][Static]Function函数名[(参数列表)]As类型说明Public:表示所有过程都可以调用该过程定义在窗体模块中,其他模块调用时使用:窗体名.过程名如果定义在标准模块或本模块中,可以直接使用。缺省Public,也没有Private关键字,则等同Public的特性。74第74页,课件共86页,创作于2023年2月Private:表示该过程只能在本模块中可以调用Static:表示过程中所有局部变量都作为静态变量。如:
StaticSubBb()
DimAAsInteger
A=A+1
MsgBox"Bb"&A
EndSub若Cmd1的Click中有CallBb语句,
则单击Cmd1将显示:Bb1、Bb2、Bb3……75第75页,课件共86页,创作于2023年2月8.8.1
用递归实现求阶乘递归调用是指在一个过程内直接或间接调用自己。【例8-7】利用递归调用编写的求n!的函数Fact(n)。求n!时,n!=n×(n-1)!,(n-1)!=(n-1)×(n-2)!,……,若知道1!=1或0!=1,则可回推可以算出n!。在求n!时要调用Fact(n-1),产生了递归调用。
FunctionFact(nAsInteger)AsDouble
Ifn=0Orn=1Then
Fact=1
Else
Fact=n*Fact(n-1)
EndIf
EndFunction8.8程序举例76第76页,课件共86页,创作于2023年2月编写递归过程,需要两个必须的条件:形成递归式。如:Fact=n*Fact(n-1)必须有一个出口。如:Ifn=0Orn=1ThenFact=177第77页,课件共86页,创作于2023年2月8.8.2
冒泡分类法【例8-8】
实现30个数据的排序输出。要求使用冒泡分类法。其中数据排序、产生和输出分别用通用过程实现。冒泡分类法的基本思想:大的数逐层往下沉,而小的数逐层往上浮,就气泡上浮一样。算法:1.从数组元素a(1)到a(N),将相邻的两个数两两进行比较(共比较N-1次),若前一个数大于后一个数,则进行对调。一趟操作后,a(N)已为最大数。78第78页,课件共86页,创作于2023年2月2.再从数组元素a(1)到a(N-1)作同样操作后,结果是a(N-1)成为次大数。3.重复以上步骤,直至只剩a(1)和a(2)作比较。由此可见,对N个数据第1趟比较N-1次,第2趟比较N-2次,……,第i趟比较N-i次。共进行N-1趟比较就可以排好顺序。79第79页,课件共86页,创作于2023年2月SubOrderArray(A()AsInteger)'排序
DimiAsInteger,jAsInteger,NAsInteger,TAsInteger
N=UBound(A)
Fori=1ToN-1'开始冒泡排序,共进行n-1趟
Forj=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 综合探究:构建高水平社会主义市场经济体制 课件统编版高中政治必修二 经济与生活
- 2026高中必修一《基本初等函数》考点真题精讲
- 甘肃酒泉市2025-2026学年下学期高三4月调研考试语文试题及参考答案
- 2025寺庙(古建筑修复)合同
- 汽车机械基础课件 齿轮的结构设计及润滑
- 《为何喜欢这幅画》课件-2025-2026学年沪教版(新教材)小学美术三年级下册
- 临床颈椎病不良习惯、症状表现、预防及治疗要点
- 思政课教师听课制度
- 建立职能监督清单制度
- 2026年买卖合同与定作合同(1篇)
- 2025年青海省中考数学模拟试卷附答案解析
- 注射泵操作使用课件
- DL∕T 5362-2018 水工沥青混凝土试验规程
- 气瓶生产单位质量安全员、安全总监-特种设备考试题库
- 2025届云南师大附中高一下数学期末检测试题含解析
- GB/T 44092-2024体育公园配置要求
- U型桥台计算书
- 社会体育指导员工作规范课件
- ICD-9-CM3编码与手术分级目录
- 探究物联网的技术特征-说课
- GB/T 18804-2022运输工具类型代码
评论
0/150
提交评论