版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
关于过程学时理论学时上机第1页,共47页,2023年,2月20日,星期六2过程的引入:
使同类的操作不重复编写,写一次多次用把一项复杂的工作分成简单的功能块,分而治之过程:
完成一段独立功能,可供其他过程使用(调用)。调用过程:
调用其他过程的过程调用过程:调用Sprg1调用Sprg1调用Sprg2子过程:Sprg1子过程:Sprg2第2页,共47页,2023年,2月20日,星期六3
常用过程分类:Sub过程Function过程事件过程自定义子过程
内部函数(标准函数)自定义函数过程第3页,共47页,2023年,2月20日,星期六46.1函数过程的定义和调用
引例6.1已知多边形各条边的长度和对角线的长度,计算多边形的面积。计算多边形面积,可将多边形分解成若干个三角形。计算三角形面积的公式如下:x,y,z为三角形的三边长第4页,共47页,2023年,2月20日,星期六5PrivateSubForm_Click()Dima!,b!,c!,d!,e!,f!,g!,x!,y!,z!,s1!,s2!,s3!
a=InputBox("输入a"):b=InputBox("输入b")c=InputBox("输入c"):d=InputBox("输入d")e=InputBox("输入e"):f=InputBox("输入f")g=InputBox("输入g")
x=(a+b+c)/2s1=Sqr(x*(x-a)*(x-b)*(x-c))
y=(c+d+e)/2s2=Sqr(y*(y-c)*(y-d)*(y-e))
z=(e+f+g)/2s3=Sqr(z*(z-e)*(z-f)*(z-g))MsgBox("多边形面积="&s1+s2+s3)EndSub引例6.1第5页,共47页,2023年,2月20日,星期六66.1.2函数过程的定义
在窗体、模块等的代码窗口把插入点放在所有现有过程之外,直接输入函数过程。定义函数过程的形式如下:Public
全局函数过程,可被程序任何模块调用Private
仅供本模块中的其它过程调用函数名命名规则同变量名的命名规则形参只能是变量或数组名(),仅表示参数的个数、类型,无值[Public|Private]Function函数名(形参列表)[As类型]
变量声明语句块
函数名=表达式EndFunction形参名1[As类型],形参名2[As类型],…必须要有第6页,共47页,2023年,2月20日,星期六7定义函数过程areaFunction
area(
)AsSingleDimc!c=(x+y+z)/2area=Sqr(c*(c-x)*(c-y)*(c-z))EndFunctionx!,y!,z!使用函数解决引例6.1
Subcommand1_click()
…输入若干个三角形边长
S=area(a,b,c)+area(c,d,e)+area(e,f,g)msgbox(“面积=”&S)EndSub调用函数过程第7页,共47页,2023年,2月20日,星期六8第五章课后习题讲解n=12Dima(1ton)asintegerDimb%()n=11Redimb(n)Dimc%[2,3]Dimd(1,1,2)asintegerDime%(10)Redime(1to12)Dimf!()Redimf(3,2)asintegerDimg%(2,3)Dimh(1to31to4)asinteger√√×√××××第8页,共47页,2023年,2月20日,星期六9实验C2
PrivateSubCommand1_Click()Dimx!x=Val(Text1)Ifx<10Theny=30ElseIfx>=10Andx<50Theny=2.5*xElseIfx>=50Theny=2*x
ify>150theny=150EndIfprintyEndSub第9页,共47页,2023年,2月20日,星期六10PrivateSubCommand2_Click()Dims%(5To9)Fori=1To20k=mark(i)\10
SelectCasek
Case0To5s(5)=s(5)+1
Case6To8s(k)=s(k)+1
Case9To10s(9)=s(9)+1
EndSelectNextiFori=5To9
Picture2.Print"s(";i;")人数有";s(i);"个"NextiEndSubDimmark(1To20)AsInteger
'也可写成mark%(1To20)PrivateSubCommand1_Click()Fori=1To20mark(i)=Int(Rnd*101)
IfiMod4=0ThenPicture1.Printmark(i)
ElsePicture1.Printmark(i);
EndIfNextiEndSub实验E3
第10页,共47页,2023年,2月20日,星期六116.1.2函数过程的定义
定义函数过程的形式如下:[Public|Private]Function函数名(形参列表)[As类型]
变量声明语句块
函数名=表达式EndFunction形参名1[As类型],形参名2[As类型],…必须要有第11页,共47页,2023年,2月20日,星期六PublicFunctiongcd(m%,n%)AsIntegerEndFunction例6.2编一求最大公约数的函数过程Ifm<nThent=m:m=n:n=tr=mModnDoWhiler<>0m=n:n=r:r=mModnLoopgcd=n第12页,共47页,2023年,2月20日,星期六136.1.3函数过程的调用
调用形式:函数名([实参列表])实参列表:必须与形参个数相同,位置与类型一一对应。可以是同类型的常量、变量、表达式。SubForm_Click
Dimx%,y%,z%x=124:y=24
z=gcd(x,y)
MsgBox("最大公约数是"&z)EndSub
程序运行流程
Functiongcd(m%,n%)AsIntegerIfm<nThent=m:m=n:n=tr=mModnDoWhiler<>0m=n:n=r:r=mModnLoop
gcd=nEndFunction第13页,共47页,2023年,2月20日,星期六14Functionsum(m,n)EndFunction练习:编一个计算m到n的和的函数过程,使用该函数求1+2+3+…+100的和,并输出s=0Fori=mTons=s+iNextisum=sPrivateSubForm_Click()Printsum(1,100)EndSub第14页,共47页,2023年,2月20日,星期六15例6.3编一函数,统计字符串中汉字的个数。分析:字符以Unicode码存放,每个汉字和英文是一个字符、占有两个字节汉字的机内码最高位为1,若利用Asc函数求其码值为小于0(以补码表示)西文字符的最高位为0,Asc函数求其码值为大于0第15页,共47页,2023年,2月20日,星期六16FunctionCountC%(s$)Dimi%,t%,k%,c$
Fori=1ToLen(s)c=Mid(s,i,1)'取一个字符
IfAsc(c)<0Thenk=k+1
'汉字数加1
Nexti
CountC=kEndFunctionPrivateSubCommand1_Click()Dimc1%
c1=CountC(Text1.Text)
Picture1.PrintText1;Tab(15);"有";c1;"个汉字数"EndSub例6.3第16页,共47页,2023年,2月20日,星期六176.2子过程的定义和调用
6.2.1引例例6.4编一过程,对image1控件进行移动,通过参数Tag的值(1或-1)决定移动方向。
该过程不是为了计算获得某个结果,而是进行对控件移动的处理。
以下情况使用函数过程存在不便:不是为了获得某个函数值,而是为了某种功能的处理。要获得多个结果。VB中提供了使用更灵活的子过程。第17页,共47页,2023年,2月20日,星期六186.2.2子过程的定义
格式:Sub子过程名[(参数列表)]
局部变量或常数定义语句
[ExitSub]
语句EndSub子过程名、形参与函数过程中对应项的规定相同子过程名无值,所以也没有类型,也不能在子过程内对子过程名赋值第18页,共47页,2023年,2月20日,星期六
子过程与函数过程的区别一般若程序有一个返回值时,用函数过程直观;当有多个返回值时,习惯用子过程函数过程必须有返回值,函数名有类型子过程名没有值,过程名没有类型,不能在子过程体内对子过程名赋值形参个数的确定:通过形参,过程从主调程序获得初值,或将计算结果返回给主调程序注意:不要将过程中所有变量均作为形参如:求最大公约数的函数过程参数确定形参没有具体的值,只代表参数的个数、位置和类型gcd%(m%,n%)如:求最大公约数的子过程参数确定gcd(m%,n%,result%)而变量t作为临时变量,不必作为形参第19页,共47页,2023年,2月20日,星期六子过程的调用是一句独立的调用语句,有两种形式:
Call子过程名[(实参列表)]
或者
子过程名
[实参列表]用Call关键字时,若有实参,则实参必须用圆括号括起,无实参圆括号可省略。注意:若实参要获得子过程的返回值,则实参只能是变量(与形参同类型的简单变量、数组名),不能是常量、表达式,也不能是控件名。
6.2.3子过程的调用如:求最大公约数的子过程定义Sub
gcd(m%,n%)……EndSub这里的n既用于获得初值,也用于将最大公约数返回。判断下面那种调用正确gcd12,16×Dimm%,n%m=12n=16gcdm,n√第20页,共47页,2023年,2月20日,星期六例6.5分别编一统计字符串S中定冠词The出现个数的子过程和函数过程,并分别调用。InStr(c1,c2)在c1中查找c2是否存在,若找不到,结果为0如:InStr(“ABCDE”,”CD”),结果为3;InStr(“ABCDE”,”CE”),结果为0;处理方法:利用InStr函数反复在字符串S找The子串若找到后,再用Mid函数取“the”后的那部分字符串,再用Instr继续找。先定义函数过程,之后抓住函数过程和子过程的区别,定义子过程。第21页,共47页,2023年,2月20日,星期六22FunctionFuncThe(ByVals$)DimCount%,i%,st$Count=0
st=Trim(s)
i=InStr(st,"the")
DoWhilei>0
'当i>0说明找到
Count=Count+1'统计个数加1
st=Mid(st,i+1)
'为找下一个准备
i=InStr(st,"the")
Loop
FuncThe=CountEndFunctionPrivateSubCommand1_Click()'调用函数过程
Label3=FuncThe(Text1)EndSub例6.5第22页,共47页,2023年,2月20日,星期六23SubProcThe(ByVals$,ByRefCount%)Dimi%,st$Count=0
st=Trim(s)
i=InStr(st,"the")
DoWhilei>0Count=Count+1
st=Mid(st,i+1)
i=InStr(st,"the")
LoopEndSubPrivateSubCommand2_Click()'调用子过程
Dimn%
CallProcThe(Text1,n)Label4=nEndSub例6.5第23页,共47页,2023年,2月20日,星期六246.3参数传递
6.3.1形参与实参在参数传递中,一般是按位置传送,与参数名没有关系。如:在调用标准函数时,用户根本不知道形参名,只要关心形参的个数、类型、位置。见下面Mid函数形式:
Mid(字符串$,起始位%,取几位%)
调用语句:s=Mid("ThisisVB",9,2)
则s中的结果为“VB”。第24页,共47页,2023年,2月20日,星期六256.3.2传地址(ByRef)与传值(ByVal)传址方式:当调用一个过程时,它将实参的地址传递给形参。因此在被调过程体中对形参的任何操作都变成了对相应实参的操作,实参的值就会随过程体内对形参的改变而改变。传值方式:当调用一个过程时,系统将实参的值复制给形参,实参与形参断开了联系。在过程体内对形参的任何操作不会影响到实参。第25页,共47页,2023年,2月20日,星期六26例6.6传地址与传值形参获得实参的值形参获得实参的地址实参必须是同类型的变量名(包括简单变量、数组名),不能是常量、表达式。第26页,共47页,2023年,2月20日,星期六27SubSwap1(ByValx%,ByValy%)Dimt%t=x:x=y:y=tEndSubSubSwap2(x%,y%)Dimt%t=x:x=y:y=tEndSubSubCommand1_Click()Dima%,b%a=10:b=20Print"调用Swap1前a和b的值为:";Tab(40);a;b
CallSwap1(a,b)Print"调用Swap1后按传值方式a和b的值为:";Tab(40);a;b
a=10:b=20
CallSwap2(a,b)Print"调用Swap2后按传地址方式a和b的值为:";Tab(40);a;bEndSub编写交换两个数的过程,Swap1用传值方式,Swap2用传地址方式(ByRef
x%,ByRef
y%)例6.6第27页,共47页,2023年,2月20日,星期六28传地址与传值方式选择
要将被调过程中的结果返回给主调程序,则形参必须是---
不希望过程修改实参的值,则应选用(),减少各过程间的关联。形参是数组是地址传递。传址方式传值方式第28页,共47页,2023年,2月20日,星期六形参是数组要以数组名加圆括号表示,不要给出维数下/上界;在过程中通过Lbound()/Ubound()函数确定每维的上界。实参是数组要给出数组名(可以不加圆括号)。当数组作为参数传递时,系统将实参数组的起始地址传给过程,使形参数组也具有与实参数组相同的起始地址。
6.3.3数组参数的传递Functionf(a%(),xAsInteger)AsLongf=xEndFunctionPrivateSubForm_Click()Dima%(1To10)y=f(a,10)PrintyEndSub………………Dima%(1To10)第29页,共47页,2023年,2月20日,星期六30例6.7如下sum函数和子过程求数组a各元素和、并改变数组各元素值。Functionsum%(x())Dimi%sum=0
Fori=0ToUBound(x)
sum=sum+x(i):x(i)=2*x(i)
NextiEndFunctionPrivateSubCommand1_Click()Dimb(),s%b=Array(1,3,5,7,9)
s=sum(b())Print"调用sum过程后数组b的各元素和为:";sPrint"调用sum过程后数组b的各元素值为:"
Fori=0ToUBound(b)Printb(i);"";
NextiEndSub13579形参数组实参数组第30页,共47页,2023年,2月20日,星期六316.5变量的作用域
过程级变量
在一个过程内用Dim或Static语句 声明的变量,只能在本过程中使用模块级变量
在模块内、任何过程外用Dim、Private语句声明的变量,可被本模块的任何过程访问全局变量
在模块级用Public语句声明的变量,可被应用程序的任何过程或函数访问
第31页,共47页,2023年,2月20日,星期六326.5.1变量的作用域
例如:在下面一个标准模块文件中不同级的变量声明
PublicPaAsinteger
'全局变量
PrivateMbAsstring*10
'窗体/模块级变量
SubF1()
DimFaAsinteger
‘过程级变量
……EndSub
SubF2()
DimFbAsSingle
‘过程级变量
EndSub第32页,共47页,2023年,2月20日,星期六336.5.2静态变量
静态变量程序运行过程中可保留变量的值声明形式:Static变量名
[AS类型]用Dim声明的变量,每次调用过程时重新初始化例6.10比较Dim和Static两者的区别。PrivateSubForm_Click()Staticcount%count=count+1Print"已单击窗体";count;"次"EndSub
Dimcount%第33页,共47页,2023年,2月20日,星期六34PublicaAsInteger'全局变量DimbAsInteger'模块级变量PrivateSubCommand1_Click()
DimcAsInteger'局部变量
StaticdAsInteger'局部变量+静态变量
a=1b=1c=1d=1Printa;b;c;dEndSubPrivateSubCommand2_Click()
DimaAsInteger'局部变量,作用域小的优先于大的变量
a=a+1b=b+1c=c+1d=d+1Printa;b;c;dEndSubd=d+1第34页,共47页,2023年,2月20日,星期六35作业P277实验F:1,2,3复习书上例题第35页,共47页,2023年,2月20日,星期六36上机题解答:Subs(b(),min)Dimi%
min=b(LBound(b))Fori=LBound(b)+1ToUBound(b)
Ifb(i)<minThenmin=b(i)NextiEndSubPrivateSubForm_Click()Dima(1To10),amin,i%'定义时要写上类型a%(1To10),amin%Fori=1To10
a(i)=-Int(Rnd*101+300)Printa(i);NextiCalls(a(),amin)PrintPrint"最小值为";aminEndSub实验F1求数组中最小值第36页,共47页,2023年,2月20日,星期六37上机题解答:Functiongcd(ByValm!,ByValn!)AsIntegerIfm<nThent=m:m=n:n=tr=mModnDoWhiler<>0m=n:n=r:r=mModnLoop
gcd=nEndFunctionPrivateSubcommand1_Click()Dimx!,y!,z!x=Val(Text1)y=Val(Text2)
z=gcd(x,y)Picture1.Printx;y;zEndSub实验F2求最大公约数能去掉ByVal吗第37页,共47页,2023年,2月20日,星期六386.6综合应用
1、数制转换不同进制数之间的转换,可通过编程来实现;也可通过VB提供的内部函数来实现。例6.13编一函数,实现一个十进制整数转换成二至十六任意进制的字符。分析:十进制正整数m转换成r进制数,将m不断除r取余数(若余数超过9,还要进行相应的转换,例如10变成A,11变成B等),直到商为零,以反序得到结果,即最后得到的余数在最高位。第38页,共47页,2023年,2月20日,星期六39综合应用-加密2、加密和解密信息加密有各种方法,最简单的加密方法是将每个字母平移一个位置(称为密钥)。例如,后移5个位置,这时,A→F,B→G…Y→D,Z→E,a→f;解密是加密的逆操作。例6.14编一加密和解密的程序,即将输入的一行字符串中的所有字母加密,加密后还可再进行解密。
第39页,共47页,2023年,2月20日,星期六40WelcomestudWC87IAsc=Asc(C)92+5IAsc>90IAsc=IAsc-26B对取得的一个字符”W”放入变量C中,加密的过程如左所示:C=Chr(IAsc)第40页,共47页,2023年,2月20日,星期六41综合应用-查找3、查找什么是查找:查找是在线性表(在此为数组
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州省安全员-C证(专职安全员)考试题库
- 2025年甘肃建筑安全员C证考试题库
- 珍爱生命-校园行为规范与安全教育班会课件
- 小学心理健康辅导家长会课件
- 《PMC作业指引》课件
- DB61T-稻麦(油)轮作主要病虫害防控技术规范编制说明
- 培训课件-车辆消防安全知识培训
- 单位管理制度展示选集【人力资源管理】十篇
- 单位管理制度展示大全【员工管理】
- 【物理课件】速度改变快慢的描述课件
- 基于STEAM教育的小学德育创新实践研究
- 2024年03月山东烟台银行招考笔试历年参考题库附带答案详解
- 河道综合治理工程施工组织设计
- 安徽省合肥市蜀山区2024-2025学年七年级上学期地理期末模拟练习(含答案)
- 新建设项目施工人员安全教育培训课件
- 品质总监转正述职报告
- 2024年游艇俱乐部会员专属活动策划与执行合同3篇
- 广东省广州市番禺区2023-2024学年八年级上学期期末英语试题
- 《项目管理培训课程》课件
- 2024年企业团购:销售合作协议3篇
- 2024-2025学年八年级语文上学期期末真题复习 专题06 文言文阅读
评论
0/150
提交评论