版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
内容简介9.1概述9.2Sub子过程9.3Function函数过程9.4参数传递9.5过程嵌套调用和递归调用9.6变量的作用域9.7静态变量9.8程序示例9章过程09.1概述-9.1.1工程启动VB就要创建工程。工程是创建应用程序文件的集合。
工程由模块组成。模块又由多个过程构成。
VB工程文件(.vbp)类模块(.cls)标准模块(.bas)窗体模块(.frm)SUB事件过程SUB通用过程Function过程(函数)Function过程(函数)SUB通用过程9章过程19.1概述-9.1.1工程标准模块的添加:
9章过程29.1概述-
9.1.2过程过程可以分成两大类:事件过程和通用过程。
事件过程:面向对象由系统创建,不同的对象有不同的事件,用户不能添加或删除事件及其它的参数。事件过程一般放在窗体模块中。
Sub<对象名>_<事件名>([<参数表>]) [<语句组>]EndSub9章过程39.1概述-
9.1.2过程通用过程:也叫自定义过程,它是具有一定功能的独立程序段。调用过程示意图调用程序(主程序)调用过程1调用过程1结束过程1结束9章过程49.1概述-
9.1.2过程一般情况下,程序运行都由事件过程先执行,然后调用其他的事件过程或通用过程。当应用程序启动后不希望加载任何窗体或者在装载窗体前对一些条件进行初始化,可以在标准模块中建立一个名字固定为SubMain的子过程。运行时可以先运行SubMain。9章过程59.2
SUB子过程Sub
子过程的定义使用“添加过程”对话框:工具/添加(在代码窗口)
9章过程69.2
SUB子过程在代码窗口,直接输入代码
PrivateSubfact()EndSub[Public|Private]Sub<过程名>([<参数表>])[<语句组>](可含ExitSub)EndSub可选项9章过程79.2
SUB子过程Sub子过程的调用使用Call
语句调用
Call
过程名([<参数表>])例如:Callfact(a,b)直接使用过程名调用过程名[<参数表>]例如:facta,b9章过程89.2
SUB子过程【例9-1】无参数子程序和带参数子程序的比较。
9章过程99.2
SUB子过程9章过程109.2
SUB子过程
9章过程119.2
SUB子过程【例9-2】计算2!+4!+6!+8!。建立子过程建立子过程fact求任意数的阶乘子程序输入输出数据都通过参数参数的个数:2个
例如:Callfact(3,b)传入子过程传出结果9章过程129.2
SUB子过程主程序(调用程序)PrivateSubForm_Load()DimiAsIntegerDimsumAsLong,tAsLongShowFori=2To8Step2Callfact(i,t)sum=sum+tIfi<>8ThenPrinti;"!+";ElsePrinti;"!=";sumNextiEndSub
9章过程139.2
SUB子过程子程序(被调用程序)Subfact(nAsInteger,totalAsLong)DimiAsIntegertotal=1Fori=1Tontotal=total*iNextiEndSub
9章过程149.3
Function函数过程
Function过程定义
Function<函数名>([<参数表>])[As类型][<语句组>](可含ExitFunction
)
<函数名
>=<表达式>
EndFunction必须将运算结果通过赋值语句赋给函数名,否则返回数值0或空字符串9章过程159.3
Function函数过程Function过程调用与内部函数的调用完全一样,即函数名(参数)
Sub过程与Function过程的区别Function过程要返回一个值,通常出现在表达式中。Sub过程不直接返回值,可作为独立的基本语句调用。9章过程169.3
Function函数过程【例9-3】设计一个求以10为底的常用对数的函数。PrivateSubForm_Load()ShowPrintLg(100)EndSubFunctionLg(xAsSingle)AsDoubleLg=Log(x)/Log(10)'给函数名赋值EndFunction
9章过程179.3
Function函数过程【例9-4】同【例9-2】,利用Function函数计算2!+4!+6!+8!。PrivateSubForm_Load()ShowFori=2To8Step2sum=sum+fact(i)
Ifi<>8ThenPrinti;"!+";ElsePrinti;"!=";sumNextiEndSub
9章过程189.3
Function函数过程Function过程也可以像Sub过程那样调用。但无法返回函数值。Functionfact(nAsInteger)AsLongtotal=1Fori=1Tontotal=total*iNextifact=total EndFunction
9章过程199.4参数传递
9.4.1参数传递的定义9.4.2
参数传递的方式9.4.3
参数传递的内容9章过程209.4参数传递-
9.4.1参数传递的定义形参也叫形式参数,是指在定义过程时出现的参数以【例9-2】为例
Subfact(nAsInteger,totalAsLong)形参,只供定义而无固定值9章过程219.4参数传递-
9.4.1参数传递的定义
实参也叫实际参数,是指在调用过程中出现的参数以【例9-2】为例Callfact(i,t)实参,只供调用,有固定值9章过程229.4参数传递-
9.4.1参数传递的定义形参与实参对应关系形参实参变量变量、常量、表达式、数组元素、对象数组数组9章过程239.4参数传递-
9.4.1参数传递的定义参数传递
调用程序和被调用程序之间参数的数据传递调用程序实参被调用程序形参传入传出名字可不同,但个数和类型必须相同9章过程249.4参数传递-
9.4.2参数传递的方式显式传递
通过参数表(形参与实参之间)传递隐式传递通过数据的作用域,使用模块级变量,使它在不同过程中保持一致而达到参数传递9章过程259.4参数传递-
9.4.3参数传递的内容传递数值实参和形参占用两个存储单元,从实参到形参传递的是参数的副本参数可传入过程,却不能从过程中传出改变后的新值,即“传入传不出”
实参形参传入传不出9章过程269.4参数传递-
9.4.3参数传递的内容传递地址实参和形参共用一个存储单元,从实参到形参传递的是参数本身。参数可传入过程,又能从过程中传出改变后的新值,即“传入传出”实参形参传入传出9章过程279.4参数传递-
9.4.3参数传递的内容实参的表示形式按值传递:实参为常数、表达式、带括号的变量,或在定义过程中用关键字
ByVal定义参数例:Callfact(3)Callfact(x+1)Callfact((x))9章过程289.4参数传递-
9.4.3参数传递的内容按址传递:实参为变量,或在定义过程中用关键字ByRef
定义参数例:Callfact(x)9章过程299.4参数传递-
9.4参数传递【例9-5】按值和按址传递参数的几种方式。运行界面如图所示9章过程309.4参数传递-
9.4参数传递PrivateSubForm_Load()DimnAsIntegerShowCallexer(2)'实参为常数,按值传递
Print"主程序中n=";nn=2Callexer(n+1)'实参为表达式,按值传递
Print"主程序中n=";nCallexer((n))'实参为带括号的变量,按值传递
Print"主程序中n=";nCallexer(n)Print"主程序中n=";n'实参为不带括号的变量,按址传递EndSub9章过程319.4参数传递-
9.4参数传递【例9-6】下面程序实参和形参都是变量,在形参名称前面加了ByVal,表示按数值传递。PrivateSubForm_Click()DimaAsInteger,bAsIntegera=10:b=20Callpara_transfer(a,b)Print"a=";a,"b=";bEndSubPrivateSubpara_transfer(ByValXAsInteger,ByValYAsInteger)X=X+5Y=Y+5Print"X=";X,"Y=";YEndSub运行程序,结果为:X=15Y=25a=10b=209章过程329.4参数传递-
9.4参数传递若将
PrivateSubpara_transfer(ByValXAsInteger,ByValYAsInteger)修改为:
PrivateSubpara_transfer(XAsInteger,YAsInteger),则运行结果变为:运行程序,结果为:X=15Y=25a=15b=259章过程339.4参数传递-
9.4参数传递【例9-7】举例说明参数为数组的过程的定义和调用方法。注意观察数组做形参和实参在格式上的区别。并且注意数组做参数只能传地址。PrivateSubForm_Load()DimiAsIntegerShowDima(3)AsIntegerFori=1To3a(i)=i*2Printa(i)NextiPrint"total=";exer(a)'显示total=12EndSubFunctionexer(m()AsInteger)DimiAsIntegerDimsumAsIntegerFori=1To3sum=sum+m(i)Nextexer=sumEndFunction9章过程349.4参数传递-
9.4参数传递【例9-8】计算的值,m的值取10,100,1000。运行界面如图比较Sub子程序和Function函数的区别比较显式传递和隐式传递的区别9章过程359.4参数传递-
9.4参数传递解法一:用Function函数PrivateSubForm_Load()DimiAsLong,mAsIntegerShowFori=1To3m=10^iPrintTab(5);"m=";m,"s=";sum(m)NextiEndSubFunctionsum(nAsInteger)AsSingleDimiAsLong,sAsSingles=0Fori=1Tons=s+1/(i*(i+1))Nextisum=sEndFunction
9章过程369.4参数传递-
9.4参数传递解法二:用Sub子程序(显式传递)PrivateSubForm_Load()DimiAsLongDimmAsInteger,sAsSingleShowFori=1To3m=10^iCallsum(m,s)PrintTab(5);"m=";m,"s=";sNextiEndSubSubsum(nAsInteger,sAsSingle)DimiAsLongs=0Fori=1Tons=s+1/(i*(i+1))NextiEndSub
9章过程379.4参数传递-
9.4参数传递解法三:用Sub子程序(隐式传递)DimsAsSinglePrivateSubForm_Load()DimiAsLongDimmAsIntegerShowFori=1To3m=10^iCallsum(m)PrintTab(5);"m=";m,"s=";sNextiEndSubSubsum(nAsInteger)DimiAsLongs=0Fori=1Tons=s+1/(i*(i+1))NextiEndSub
9章过程389.5
过程嵌套调用和递归调用
过程的调用嵌套在过程的调用时,一个过程去调用另一个过程过程的定义是一段独立的代码,不能将过程的定义嵌套在另一个事件过程和自定义过程中9章过程399.5
过程嵌套调用和递归调用【例9-9】编制一个子程序,实现一组数排序。PrivateSubCommand1_Click()Callsort(a(),True)'从小到大排序EndSubPrivateSubCommand2_Click()Callsort(a(),False)'从大到小排序EndSub
9章过程409.5
过程嵌套调用和递归调用Fori=1Ton-1Forj=i+1TonIfflagThenIfx(i)>x(j)ThenCallswap(x(i),x(j))'嵌套调用
ElseIfx(i)<x(j)ThenCallswap(x(i),x(j))EndIfNextjNextiPrivateSubswap(x,y)Dimtt=x:x=y:y=tEndSub9章过程419.5
过程嵌套调用和递归调用过程的递归调用当嵌套调用过程时,如果一个过程自己调用自己,就叫做递归调用。递归必须有边界,否则会出现以下错误。9章过程429.5
过程嵌套调用和递归调用【例9-10】用递归法求一个数的阶乘。根据数学知识,n!=n(n-1)! (n-1)!=(n-1)(n-2)! … 1!=1(结束递归的条件)9章过程439.5
过程嵌套调用和递归调用PrivateSubForm_Load()DimnAsIntegerShown=Val(InputBox("输入一个正整数","求阶乘"))Printn;"!=";fact(n)EndSub
Functionfact(n)Ifn<=1Thenfact=1Elsefact=n*fact(n-1)EndIfEndFunction
9章过程449.6变量的作用域变量的作用域是指在程序的哪些范围内,这些变量才有意义,才可以发挥作用比如,在一个事件过程或通用过程内部声明变量时,只有过程内部的代码才能访问或改变那个变量的值。9章过程459.6变量的作用域过程级变量:作用域只在声明它们的过程中,也称它们为局部变量
用Dim或者Static关键字来声明它们
例如:DimintTempAsInteger或StaticintPermanentAsInteger9章过程469.6变量的作用域【例9-11】观察以下过程的执行结果PrivateSubCommand1_Click()DimintTempAsIntegerintTemp=10Print“intTemp1=”;intTempEndSubPrivateSubCommand2_Click()DimintTempAsIntegerintTemp=intTemp+1Print“intTemp2=”intTempEndSub我们会发现运行结果是:intTemp1=10intTemp2=19章过程479.6变量的作用域模块级变量:在模块“通用”的“声明”段中定义的变量是模块级变量。
模块级变量有两种:公有和私有。比较变量的作用域的区别9章过程489.6变量的作用域
变量的作用域说明等级定义范围过程级(局部)DimStatic在过程中说明,仅在说明它的过程中有效模块级(私有,窗体/标准模块)DimPrivate在窗体或标准模块内定义,在定义该变量的模块或窗体的所有过程内有效模块级(公有,全局)Public在窗体或标准模块中说明,在工程的所有过程有效9章过程499.6变量的作用域【例9-12】建立两个窗体Form1和Form2,一个标准模块。比较模块级公有变量和私有变量的作用域。
'标准模块的代码PublicaAsInteger,bAsInteger'a,b为模块级公有变量'窗体Form1的代码PubliccAsInteger'c为模块级公有变量PrivateSubForm_Click()Form2.ShowForm1.HideEndSubPrivateSubForm_Load()Showa=1:b=2:c=3Printa+b+c'显示6EndSub'窗体Form2的代码PrivatebAsInteger'b为模块级私有变量PrivateSubForm_Load()ShowPrinta,b,c+1,Form1.c'显示1013EndSub9章过程509.7静态变量变量除了有作用域之外还有存活期,在存活期内变量能够保持它们的值多次重复执行以下过程,观察运行结果
PrivateSubCommand1_Click()DimintTempAsIntegerintTemp=intTemp+1PrintintTempEndSub你会发现无论你重复运行该过程多少次,它的运行结果一直是1。
运行结果9章过程519.7静态变量但是可将局部变量定义成静态的,从而保留变量的值把上面的过程定义变量intTemp的语句DimintTempAsInteger修改为StaticintTempAsInteger,再次重复运行该过程得到的结果就是;1,2,3,4……9章过程529.7静态变量【例9-13】定义静态变量求三个随机数的和FunctionTotal(n)Staticsum'sum为静态变量
sum=sum+nTotal=sumEndFunctionPrivateSubForm_Load()Dimi,x,sShowFori=1To3x=Int(Rnd*10)Printx;s=Total(x)NextiPrint"sum=";sEndSub本题Function函数Total的定义中,如果用关键字Dim而不是Static声明sum变量,则以前的累计值不会通过调用函数Total保留下来,函数只会每次都返回调用的那个参数值9章过程539.7静态变量【例9-14】统计文本框中单词的个数。在文本框中输入单词,当输入空格或回车键时,计算器加1。
StaticPrivateSubText1_KeyPress(KeyAsciiAsInteger)DimnIfKeyAscii=32OrKeyAscii=13Then'空格或回车
n=n+1Label1.Caption="共有"&n&"个单词"EndIfEndSub9章过程549.8程序示例【例9-15】输入三个数,按照从小到大排序输出其中任意两个数的和。运行界面见图9章过程559.8程序示例PrivateSubCommand1_Click()DimxAsSingle,yAsSingle,zAsSingleDimaAsSingle,bAsSingle,cAsSinglex=Val(Text1.Text)y=Val(Text2.Text)z=Val(Text3.Text)a=x+yb=x+zc=y+zCallsort(a,b,c)Label4.Caption=“任意两个数的和是:"&a&""&b&""&cEndSubPrivateSubsort(a,b,c)DimtAsSingleIfa>bThent=a:a=b:b=tIfa>cThent=a:a=c:c=tIfb>cThent=b:b=c:c=tEndSub不增加变量a、b、c,调用语句改成Callsort(x+y,x+z,y+z),能得到正确结果吗?为什么?
9章过程569.8程序示例【例9-16】利用递归求任意两个正整数的最大公约数PrivateSubForm_Click()DimNAsInteger,MAsInteger,GAsIntegerN=InputBox("输入N")M=InputBox("输入M")G=Gcd(N,M)PrintN;"和";M;"的最大公约数是:";GEndSubPrivateFunctionGcd(ByValAAsInteger,ByValBAsInteger)DimRAsIntegerR=AModBDoWhileR<>0A=BB=RR=AModBLoopGcd=BEndFunction思考如果在GCD过程中的形参前面不加Byval对运行结果有无影响?
9章过程579.8程序示例【例9-17】将一个十进制数据转换为任意数制(16进制以内)的数据9章过程589.8程序示例DimnAsInteger,numAsLongPrivateSubCommand1_Click()DimchAsString,iAsInteger,char(15)AsStringDimbin()AsStringFori=0To9:char(i)=Str(i):NextiFori=0To5:char(10+i)=Chr(Asc("A")+i):NextiReDimbin(1)Calltrans(bin,char)Fori=UBound(bin)To1Step-1ch=ch+bin(i)NextiText3.Text=chEndSub9章过程599.8程序示例PrivateSub
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026年心理素质提升策略测试卷
- 2025-2026年导游资格考试政策法规练习题
- 某汽车厂人事条例
- 某家电厂安全生产细则
- MES系统运维协议
- 2026初中美术教资面试答辩题库及答案
- 地下管沟管道施工测量方案
- 2026高中地理教资面试易错题题库及解析
- 2026高中体育教资面试易错题题库
- 统编版语文八年级上册第26课《诗词五首》练习题(含答案)
- 2025年行政复议人员业务考试真题(回忆版)及答案
- 2026年信息安全法律法规测试题
- 2024年《中华人民共和国爱国主义教育法》主题课件
- 2026年滋补产业蓝皮书 -电商数据分析和增长归因和品牌商策略
- DBJ-T15-295-2026 高处作业吊篮安装检验评定标准
- 2026内蒙古地质矿产集团有限公司所属企业招聘226人考试参考题库及答案详解
- 村干部考乡镇公务员考试真题题库(含答案解析)
- 【三年级上册】开学家长会:翻三越岭只为等花开【课件】
- 2026年陕西省社区卫生服务中心招聘笔试试题(含答案)
- 电气控制柜装配接线规范
- Petrel中文操作手册2010-(10-11章)
评论
0/150
提交评论