过程学时理论学时上机_第1页
过程学时理论学时上机_第2页
过程学时理论学时上机_第3页
过程学时理论学时上机_第4页
过程学时理论学时上机_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

关于过程学时理论学时上机2过程的引入:

使同类的操作不重复编写,写一次多次用把一项复杂的工作分成简单的功能块,分而治之过程:

完成一段独立功能,可供其他过程使用(调用)。调用过程:

调用其他过程的过程调用过程:调用Sprg1调用Sprg1调用Sprg2子过程:Sprg1子过程:Sprg2第2页,共47页,星期六,2024年,5月3

常用过程分类:Sub过程Function过程事件过程自定义子过程

内部函数(标准函数)自定义函数过程第3页,共47页,星期六,2024年,5月46.1函数过程的定义和调用

引例6.1已知多边形各条边的长度和对角线的长度,计算多边形的面积。计算多边形面积,可将多边形分解成若干个三角形。计算三角形面积的公式如下:x,y,z为三角形的三边长第4页,共47页,星期六,2024年,5月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页,星期六,2024年,5月66.1.2函数过程的定义

在窗体、模块等的代码窗口把插入点放在所有现有过程之外,直接输入函数过程。定义函数过程的形式如下:Public

全局函数过程,可被程序任何模块调用Private

仅供本模块中的其它过程调用函数名命名规则同变量名的命名规则形参只能是变量或数组名(),仅表示参数的个数、类型,无值[Public|Private]Function函数名(形参列表)[As类型]

变量声明语句块

函数名=表达式EndFunction形参名1[As类型],形参名2[As类型],…必须要有第6页,共47页,星期六,2024年,5月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页,星期六,2024年,5月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页,星期六,2024年,5月9实验C2

PrivateSubCommand1_Click()Dimx!x=Val(Text1)Ifx<10Theny=30ElseIfx>=10Andx<50Theny=2.5*xElseIfx>=50Theny=2*x

ify>150theny=150EndIfprintyEndSub第9页,共47页,星期六,2024年,5月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页,星期六,2024年,5月116.1.2函数过程的定义

定义函数过程的形式如下:[Public|Private]Function函数名(形参列表)[As类型]

变量声明语句块

函数名=表达式EndFunction形参名1[As类型],形参名2[As类型],…必须要有第11页,共47页,星期六,2024年,5月PublicFunctiongcd(m%,n%)AsIntegerEndFunction例6.2编一求最大公约数的函数过程Ifm<nThent=m:m=n:n=tr=mModnDoWhiler<>0m=n:n=r:r=mModnLoopgcd=n第12页,共47页,星期六,2024年,5月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页,星期六,2024年,5月14Functionsum(m,n)EndFunction练习:编一个计算m到n的和的函数过程,使用该函数求1+2+3+…+100的和,并输出s=0Fori=mTons=s+iNextisum=sPrivateSubForm_Click()Printsum(1,100)EndSub第14页,共47页,星期六,2024年,5月15例6.3编一函数,统计字符串中汉字的个数。分析:字符以Unicode码存放,每个汉字和英文是一个字符、占有两个字节汉字的机内码最高位为1,若利用Asc函数求其码值为小于0(以补码表示)西文字符的最高位为0,Asc函数求其码值为大于0第15页,共47页,星期六,2024年,5月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页,星期六,2024年,5月176.2子过程的定义和调用

6.2.1引例例6.4编一过程,对image1控件进行移动,通过参数Tag的值(1或-1)决定移动方向。

该过程不是为了计算获得某个结果,而是进行对控件移动的处理。

以下情况使用函数过程存在不便:不是为了获得某个函数值,而是为了某种功能的处理。要获得多个结果。VB中提供了使用更灵活的子过程。第17页,共47页,星期六,2024年,5月186.2.2子过程的定义

格式:Sub子过程名[(参数列表)]

局部变量或常数定义语句

[ExitSub]

语句EndSub子过程名、形参与函数过程中对应项的规定相同子过程名无值,所以也没有类型,也不能在子过程内对子过程名赋值第18页,共47页,星期六,2024年,5月

子过程与函数过程的区别一般若程序有一个返回值时,用函数过程直观;当有多个返回值时,习惯用子过程函数过程必须有返回值,函数名有类型子过程名没有值,过程名没有类型,不能在子过程体内对子过程名赋值形参个数的确定:通过形参,过程从主调程序获得初值,或将计算结果返回给主调程序注意:不要将过程中所有变量均作为形参如:求最大公约数的函数过程参数确定形参没有具体的值,只代表参数的个数、位置和类型gcd%(m%,n%)如:求最大公约数的子过程参数确定gcd(m%,n%,result%)而变量t作为临时变量,不必作为形参第19页,共47页,星期六,2024年,5月子过程的调用是一句独立的调用语句,有两种形式:

Call子过程名[(实参列表)]

或者

子过程名

[实参列表]用Call关键字时,若有实参,则实参必须用圆括号括起,无实参圆括号可省略。注意:若实参要获得子过程的返回值,则实参只能是变量(与形参同类型的简单变量、数组名),不能是常量、表达式,也不能是控件名。

6.2.3子过程的调用如:求最大公约数的子过程定义Sub

gcd(m%,n%)……EndSub这里的n既用于获得初值,也用于将最大公约数返回。判断下面那种调用正确gcd12,16×Dimm%,n%m=12n=16gcdm,n√第20页,共47页,星期六,2024年,5月例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页,星期六,2024年,5月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页,星期六,2024年,5月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页,星期六,2024年,5月246.3参数传递

6.3.1形参与实参在参数传递中,一般是按位置传送,与参数名没有关系。如:在调用标准函数时,用户根本不知道形参名,只要关心形参的个数、类型、位置。见下面Mid函数形式:

Mid(字符串$,起始位%,取几位%)

调用语句:s=Mid("ThisisVB",9,2)

则s中的结果为“VB”。第24页,共47页,星期六,2024年,5月256.3.2传地址(ByRef)与传值(ByVal)传址方式:当调用一个过程时,它将实参的地址传递给形参。因此在被调过程体中对形参的任何操作都变成了对相应实参的操作,实参的值就会随过程体内对形参的改变而改变。传值方式:当调用一个过程时,系统将实参的值复制给形参,实参与形参断开了联系。在过程体内对形参的任何操作不会影响到实参。第25页,共47页,星期六,2024年,5月26例6.6传地址与传值形参获得实参的值形参获得实参的地址实参必须是同类型的变量名(包括简单变量、数组名),不能是常量、表达式。第26页,共47页,星期六,2024年,5月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页,星期六,2024年,5月28传地址与传值方式选择

要将被调过程中的结果返回给主调程序,则形参必须是---

不希望过程修改实参的值,则应选用(),减少各过程间的关联。形参是数组是地址传递。传址方式传值方式第28页,共47页,星期六,2024年,5月形参是数组要以数组名加圆括号表示,不要给出维数下/上界;在过程中通过Lbound()/Ubound()函数确定每维的上界。实参是数组要给出数组名(可以不加圆括号)。当数组作为参数传递时,系统将实参数组的起始地址传给过程,使形参数组也具有与实参数组相同的起始地址。

6.3.3数组参数的传递Functionf(a%(),xAsInteger)AsLongf=xEndFunctionPrivateSubForm_Click()Dima%(1To10)y=f(a,10)PrintyEndSub………………Dima%(1To10)第29页,共47页,星期六,2024年,5月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页,星期六,2024年,5月316.5变量的作用域

过程级变量

在一个过程内用Dim或Static语句 声明的变量,只能在本过程中使用模块级变量

在模块内、任何过程外用Dim、Private语句声明的变量,可被本模块的任何过程访问全局变量

在模块级用Public语句声明的变量,可被应用程序的任何过程或函数访问

第31页,共47页,星期六,2024年,5月326.5.1变量的作用域

例如:在下面一个标准模块文件中不同级的变量声明

PublicPaAsinteger

'全局变量

PrivateMbAsstring*10

'窗体/模块级变量

SubF1()

DimFaAsinteger

‘过程级变量

……EndSub

SubF2()

DimFbAsSingle

‘过程级变量

EndSub第32页,共47页,星期六,2024年,5月336.5.2静态变量

静态变量程序运行过程中可保留变量的值声明形式:Static变量名

[AS类型]用Dim声明的变量,每次调用过程时重新初始化例6.10比较Dim和Static两者的区别。PrivateSubForm_Click()Staticcount%count=count+1Print"已单击窗体";count;"次"EndSub

Dimcount%第33页,共47页,星期六,2024年,5月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页,星期六,2024年,5月35作业P277实验F:1,2,3复习书上例题第35页,共47页,星期六,2024年,5月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页,星期六,2024年,5月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页,星期六,2024年,5月386.6综合应用

1、数制转换不同进制数之间的转换,可通过编程来实现;也可通过VB提供的内部函数来实现。例6.13编一函数,实现一个十进制整数转换成二至十六任意进制的字符。分析:十进制正整数m转换成r进制数,将m不断除r取余数(若余数超过9,还要进行相应的转换,例如10变成A,11变成B等),直到商为零,以反序得到结果,即最后得到的余数在最高位。第38页,共47页,星期六,2024年,5月39综合应用-加密2、加密和解密信息加密有各种方法,最简单的加密方法是将每个字母平移一个位置(称为密钥)。例如,后移5个位置,这时,A→F,B→G…Y→D,Z→E,a→f;解密是加密的逆操作。例6.14编一加密和解密的程序,即将输入的一行字符串中的所有字母加密,加密后还可再进行解密。

第39页,共47页,星期六,2024年,5月40WelcomestudWC87IAsc=Asc(C)92+5IAsc>90IAsc=IAsc-26B对取得的一个字符”W”放入变量C中,加密的过程如左所示:C=Chr(IAsc)第40页,共47页,星期六,2024年,5月41综合应用-查找3、查找什么是查找:查找是在线性表(在此为数组)中,根据指定的关键值,找出

温馨提示

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

评论

0/150

提交评论