第5章-设计循环结构程序_第1页
第5章-设计循环结构程序_第2页
第5章-设计循环结构程序_第3页
第5章-设计循环结构程序_第4页
第5章-设计循环结构程序_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

第5章设计循环结构程序1循环结构又称重复结构。本章主要介绍:逻辑表达式For/Next语句Do/Loop语句While/Wend语句循环的嵌套使用。2循环结构是根据条件来决定某段代码是否重复执行。循环结构中一种常用的流程可以表示如图:条件满足就执行a块程序段然后再进行条件判别如果满足条件,则继续执行a块程序段直到条件不满足,才执行a块后面的程序。5.1概述3其中的a程序块段称为循环体。条件使用逻辑表达式。循环的另一种形式是把判断条件放在循环体之后。4循环结构中有两个基本问题需要考虑:(1)条件必须明确,能使循环过程正常结束(2)循环体内,必要时可改变控制循环的条件改变可能导致循环结束改变也可能导致循环进入无休止的状态(死循环)。5循环有两种类型:计数控制控制累计执行循环体的次数次数已到则结束循环如1+2+3+…+100或98+96+94+…+4+2事态控制由某些条件决定循环结束。如计算一系列正整数之和,遇负数停止循环。也可以在一个循环过程中同时使用这两种类型6【例5-1】设计一个判断素数的程序。若不是素数,要求分解为a*b的形式控件:1个文本框和1个命令按钮事件:命令按钮的Click。首先要了解什么是素数。素数是指除了1和自身外,不能被其它整数整除的正整数。判断A是否为素数的基本方法是:将A分别除以2、3、……、A-1,若都不能整除,则它为素数。判断A被i整除可以采用表达式:AModi=0或:A/i=A\i或:A/i=Int(A/i)5.2判断素数7OptionExplicit

PrivateSubCommand1_Click()

DimAAsLong,iAsInteger'A存放要判断的数。i取值为2~A-1

DimFlagAsBoolean'Flag作素数标志,False时,表示不是素数

A=Val(Text1.Text)

Flag=True'先设A是素数,当A<2或能被i整除时,再置为False

IfA<2Then

Flag=False'A<2,不是素数

Else

i=2

DoWhilei<=A-1

IfAModi=0ThenFlag=False:ExitDo'A能被i整除,则不是素数

i=i+1

Loop

EndIf

IfFlagThen

MsgBoxA&"是素数",,"信息"

Else'A表示成两数之积

MsgBoxA&"不是素数"&Chr(13)&A&"="&i&"*"&A/i,,"信息"

EndIf

EndSub5.2判断素数----程序8说明:程序中,也可以不设标志变量,在最后判断i是否超过终值A-1,若超过终值则表示直到循环完成,还没遇到一个能被整除的整数,即它是素数;否则它就不是素数。当A能被其中一个i整除时,A肯定不是素数,所以没有必要再测试下一个i,因此使用ExitDo退出循环。在使用ExitDo退出循环的时候,没有改变i的值,故A能被该i整除,即A可以表示成A=i*(A/i)。事实上只要判断A能否被2、3、……、Sqr(A)整除即可。9逻辑运算使用逻辑运算符VB提供了多个逻辑运算符,有:非(Not)、与(And)、或(Or)异或(Xor)、等价(Eqv)、蕴含(Imp)。1.基本格式Not为一元运算符,其它均为二元运算符。格式:

Not表达式表达式1逻辑运算符表达式2(除Not外)一个逻辑表达式可用一个或多个逻辑运算符。如:A>0AndB>0AndC>02.数据类型逻辑运算的数据及结果均为布尔类型。5.3进行逻辑运算103.运算方式

4.优先级115.逻辑表达式举例(1)设变量Name1的值为“王小华”、变量Addr的值为“上海”,则

表达式:Name1=“王小华”OrAddr="杭州"值:True表达式:Name1=“王小华”AndAddr="沪"值:False(2)写出数学表达式0<x<10对应的VB表达式。

VB表达式应为:x>0Andx<1012(3)描述Name1的值不等于“王小华”的表达式。该表达式可写为:

Name1<>"王小华"或:NotName1="王小华"(4)X=3、Y=4、Z=5,求表达式X>2XorY<0OrZ>X+1的值。

执行次序如图所示,最终值为False。13闰年的条件是:能被4整除,但不能被100整除;或能被400整除。设变量Y存放年份,则该逻辑表达式应为:YMod4=0AndYMod100<>0OrYMod400=0【例5-2】设计程序,要求对文本框的年份判断是否为闰年,并在标签中显示相应的信息。14程序代码如下:

OptionExplicit

PrivateSubCommand1_Click()

DimYAsInteger

IfCommand1.Caption="闰年判断"Then'闰年判断

Y=Val(Text1.Text)

IfYMod4=0AndYMod100<>0OrYMod400=0Then

Label1.Caption="是闰年"

Else

Label1.Caption="不是闰年"

EndIf

Command1.Caption="清除"

Else'清除

Text1.Text="":Label1.Caption="":Command1.Caption="闰年判断"

Text1.SetFocus

EndIf

EndSub5.3进行逻辑运算-闰年判断155.4.1For/Next语句使用For/Next语句可以方便地实现计数循环For/Next由For语句、循环体、Next语句组成。格式:

For循环控制变量=初值To终值[Step步长]

[循环体]

Next[循环控制变量]5.4使用For/Next循环语句161.执行过程

(1)将初值送至循环控制变量

(2)判断循环控制变量的值是否超过终值:若未超过终值,执行步骤(3);超过终值执行步骤(5)。

(3)执行循环体。

(4)遇到Next,使循环控制变量加上步长再送入循环控制变量中,转步骤(2)。

(5)循环终止,执行Next语句后面的语句。

注意:其中“超过终值”不一定是大于终值。172.关于格式省略“Step步长”则默认为“Step1”。初值、终值、步长分别控制循环变量的起始值、终止值和增量。For和Next必须成对出现。Next后若有循环控制变量,则必须与For中的相同。建议Next后不要省略循环控制变量,以有利于阅读程序183.关于循环体循环体是一条或多条语句可以包括分支结构和循环结构可以写成一行或多行。循环体中可以引用循环控制变量,也可以不引用。但不要随便修改循环控制变量的值,以防引起循环混乱。4.强行终止死循环使用Ctrl+Break可以暂停程序运行再使用VB工具栏上的“结束”按钮终止程序执行。19【例5-3】输入10个非负整数,求所有偶数之和。

假定存放和的变量为Sum,先让Sum=0。然后可采用以下方法:

将第1个数送入A,如果A是偶数,则让Sum加上A,否则Sum不变。

……

将第10个数送入A,如果A是偶数,则让Sum增加A,否则Sum不变。

最终得到的Sum就是和。由此可见,每步都做着同样的工作,即:

将第i个数送入A,如果A是偶数,则让Sum增加A,否则Sum不变。

20

OptionExplicit

PrivateSubCommand1_Click()'输入10个非负整数,求偶数和。

DimSumAsLong,iAsInteger

DimAAsInteger

Sum=0'赋初值,注意位置

Fori=1To10

A=Val(InputBox("请输入第"&i&"个数:","输入非负整数"))

IfAMod2=0ThenSum=Sum+A

Nexti

MsgBox"Sum="&Sum

EndSub

一个好的程序,应该为自己用于累加、累乘等的变量赋初值。21【例5-4】求表达式值。x、n由键盘输入。这是一个求和的例子。它由n项构成,能表示成Sum=Sum+Item的形式第i项等于第i-1项乘以X/(i+1),即Item=Item*X/(i+1)故循环体可由Item=Item*X/(i+1)和Sum=Sum+Item构成。初值问题:Sum初值为0,Item初值应为1。

为防止溢出,Item和Sum声明为双精度型。

程序运行结果:

当X=6,N分别为1、2、3时,其和分别为3、9、18。22PrivateSubCommand1_Click()

DimSumAsDouble,ItemAsDouble,iAsInteger

DimNAsInteger,XAsDouble

N=Val(InputBox("请输入项数:"))

X=Val(InputBox("X="))

Sum=0:Item=1

Fori=1ToN

Item=Item*X/(i+1)

Sum=Sum+Item

Nexti

MsgBox"x/2!+x^2/3!+...="&Sum,,"信息"

EndSub235.4.2ExitFor语句循环中,中途退出循环,称为跳出循环。跳出For/Next循环的语句就是ExitFor。跳出循环后,将执行Next语句后面的语句。ExitFor语句一般往往与If语句合用。如:

IfA>=2Then'素数判断

Fori=2ToInt(Sqr(A))

IfAModi=0ThenExitFor'A能被i整除,不是素数,退出For循环

Nexti

Ifi>Int(Sqr(A))Then'表示A不能被2~Int(Sqr(A))中的数整除

PrintA;"是素数"

Else'此时表示程序运行是通过ExitFor转出来的

PrintA;"不是素数"

EndIf

Else

PrintA;"不是素数"

EndIf245.5.1Do/Loop语句对只知道循环终止条件,可采用Do/Loop循环For/Next语句可改写成Do/Loop循环,反之则不然。Do/Loop语句有五种表示形式,它们的格式为:

5.5使用Do/Loop循环语句251.执行过程

(1)对格式一和二,VB将先判断条件,再执行循环体。

(2)对格式三和四,先执行循环体,再判断条件。循环体至少执行一次。

(3)对用While的语句,当条件满足(True)时,执行循环体。

(4)对用Until的语句,当条件不满足(False)时,执行循环体。

(5)格式五的循环体内必须存在ExitDo语句,否则会出现死循环。

若程序运行出现死循环,同样可用CtrlBreak暂停程序执行。262.关于格式

(1)条件一般应为关系或逻辑表达式,一般应有变量。

(2)Do和Loop必须成对出现3.关于循环体循环体是一条或多条语句可以包括分支结构和循环结构。可以写成一行或多行。循环体中应有改变循环条件的语句,以避免出现死循环。27PrivateSubCommand1_Click()

DimNAsInteger,ResultAsDouble

DimiAsInteger

N=Val(InputBox("n="))

Result=1

Fori=1ToN

Result=Result*i

Nexti

MsgBoxN&"!="&Result

EndSub0PrivateSubCommand2_Click()

DimNAsInteger,ResultAsDouble

DimiAsInteger

N=Val(InputBox("n="))

Result=1:i=1

DoWhilei<=N

Result=Result*i

i=i+1

Loop

MsgBoxN&"!="&Result

EndSubPrivateSubCommand3_Click()

DimNAsInteger,ResultAsDouble

DimiAsInteger

N=Val(InputBox("n="))

Result=1:i=1

DoUntili>N

Result=Result*i

i=i+1

Loop

MsgBoxN&"!="&Result

EndSubPrivateSubCommand4_Click()

DimNAsInteger,ResultAsDouble

DimiAsInteger

N=Val(InputBox("n="))

Result=1:i=1

Do

Result=Result*i

i=i+1

LoopWhilei<=N

MsgBoxN&“!=”&Result

EndSub5.5.1Do/Loop语句-编程序:求n!28【例5-6】在文本框中输入两个整数,求它们的最大公约数和最小公倍数。求最大公约数可用辗转相除法。该方法的基本思想是使用带余除法:(1)A除以B,得余数为R1;(2)若R1=0,则B为最大公约数。

若R1≠0,则B赋值给A,R1赋值给B,求余数R2;

若R2≠0,则继续以上步骤。29(3)经过有限(n+1)步后,Rn+1=0。这时A和B的最大公约数是Rn。最小公倍数为A*B/Rn。该算法循环次数未知,但循环条件已知:余数不为0。因此适用于Do/Loop语句编程。其循环体为:把上一个B作为新的A,把上一个余数作为新的B,求出新余数。305.5.1Do/Loop语句—求最大公约数和最小公倍数PrivateSubCommand1_Click()

DimAAsLong,BAsLong,RAsLong

A=Val(Text1.Text)

B=Val(Text2.Text)

R=AModB

DoWhileR<>0

A=B:B=R

R=AModB

Loop

MsgBox"最大公约数="&B

MsgBox"最小公倍数="&Val(Text1.Text)*Val(Text2.Text)/BEndSub

如果s在两个文本框中分别输入351和675,单击命令按钮后,得出最大公约数为27,最小公倍数为8775。31【例5-7】编程:输入一批非负数,当输入负数时,表示输入结束。求这批非负数据的最大值、最小值和平均值。由于输入的个数不确定,故应采用Do/Loop语句。本题关键在于如何设置最大值、最小值的初值。32PrivateSubCommand1_Click()

DimXAsInteger,MinAsInteger,MaxAsInteger

DimNAsInteger,AverageAsSingle'N作为计数,存放项数

X=Val(InputBox("X=")):Max=X:Min=X'最大最小值初值

N=0:Average=0

DoWhileX>=0

IfX>MaxThenMax=X

IfX<MinThenMin=X

N=N+1

Average=Average+X'Average暂存数据和,最后再除N

X=Val(InputBox("X="))'从第2个开始输入

Loop

IfN<>0ThenAverage=Average/N

Print"Max=";Max,"Min=";Min,"Average=";Round(Average,3)EndSub当输入23、41、35、61、12、1、7、-1后,运行结果:Max=61Min=1Average=25.714335.5.2ExitDo语句ExitDo是跳出Do/Loop循环的语句跳出循环后,将执行Loop语句后面的语句。ExitDo语句同样也往往与If语句合用如求阶乘的程序片断为:

N=Val(InputBox("n="))

Result=1:i=1

Do

Result=Result*i

i=i+1:Ifi>NThenExitDo

Loop

MsgBoxN&"!="&Result34While/Wend语句的作用与DoWhile条件/循环体/Loop相同。格式:

While条件

[循环体]

Wend执行过程:先计算条件的值,若条件的值为True,执行循环体,否则执行Wend语句后面的语句。While和Wend必须成对出现循环体中必须要有设法改变循环条件的语句While/Wend语句没有对应的跳出语句。5.6使用While/Wend循环语句35【例5-8】编程:求π的值。有关π的级数公式为:要求逐项累加,直到最后一项<0.0000001时,求π。因没有确定项数,故可用Do/Loop或While/Wend可设一个变量Sign作为各项的符号,在循环中让Sign=-Sign,可以达到一次正、一次负的目的。为达到较为精确的值,变量大多声明为双精度型36本例中变量Pi、Sum、Item、N、Precision分别存放π、累计和、项值、项中分母值和精度。PrivateSubCommand1_Click()

DimPiAsDouble,SumAsDouble,ItemAsDouble

DimNAsLong,PrecisionAsDouble,SignAsInteger

N=1:Item=1/N:Sum=0:Sign=1

Precision=Val(InputBox(“请输入精度:”,“输入数据”,“0.0000001”))

WhileItem>=Precision

Sum=Sum+Sign*Item

N=N+2

Item=1/N

Sign=-Sign

Wend

Pi=4*Sum

Print“π=”;Pi

EndSub

在单击命令按钮后,若精度用缺省值0.0000001,则显示=3.1415924535898。37循环结构中可以嵌套循环当循环体中包含了循环时,称为循环嵌套,或称为多重循环。循环体中包含的循环语句可以与外循环相同,也可以不同。嵌套一层称为二重循环。多重循环中遇到ExitFor(Do),只能跳出当前一层循环。5.7如何实现多重循环控制38【例5-9】窗体上显示3~100之间的所有素数。每行显示5个。前面的例子中判断A是否为素数是一重循环。现让A分别等于3、5、7、……、97、99就可以了。为了每行显示5个,设置一个计数变量Count。PrivateSubCommand1_Click()

DimAAsInteger,iAsInteger,CountAsInteger

Count=0'素数个数计数变量

Print"以下数据为素数:"

ForA=3To99Step2

Fori=2ToInt(Sqr(A))

IfAModi=0ThenExitFor'被整除

Nexti

Ifi>Int(Sqr(A))Then

Count=Count+1:PrintA,

IfCountMod5=0ThenPrint'换行

EndIf

NextA

EndSub39【例5-10】

在窗体上如图图案,它由“*”组成。分析:上三角形中,第I行有I个,可使用循环:ForJ=1ToI:Print"*";:NextJ因每行起点不同,而且一行结束后要换行,所以在J循环的前后各有一Print。这样的行有7行,故外循环使I从1至7。下三角形,操作过程与上三角相似40PrivateSubCommand1_Click()

DimIAsInteger,JAsInteger

Cls

ForI=1To7

PrintSpc(20-I);'打印时空20-i格

ForJ=1ToI

Print"*";

NextJ

Print'用于换行

NextI

ForI=6To1Step-1

PrintSpc(20-I);

ForJ=1ToI

Print"*";

NextJ

Print

NextI

EndSub

5.7如何实现多重循环控制-显示图案415.8.1递推法【例5-11】

有一个数列,前两项是1、1,第三项是前二项之和,以后每一项都是前二项之和。即为:1、1、2、3、5、8、13、21,34……。要求输出该数列的前30项。该数列又称斐波那契数列。由“兔子问题”引发这是一个递推问题所谓递推关系是指一串函数之间的关系,它把每一个函数表示为前k个函数的线性组合。本题中k=2。解决递推问题必须具备两个条件:

(1)

有初始值,如F1=1、F2=1

(2)

存在递推关系。如Fn=Fn-1+Fn-2(n>2)在程序中一般设置二或三个变量就可以了。程序中用F1、F2、F3表示三个数,在循环中,它们不断用新值代替旧值。这种操作称为迭代,5.8程序举例42程序代码如下:

PrivateSubCommand1_Click()

DimF1AsLong,F2AsLong,F3AsLong

DimiAsInteger

Cls

F1=1:F2=1

PrintF1,F2,

Fori=3To30

F3=F1+F2

PrintF3,

IfiMod4=0ThenPrint'每行显示4个数

F1=F2:F2=F3'用新值代替旧值

Next

EndSubF1和F2始终作为前两个数,F3作为新产生的数因第24个月兔子数已超过32767对,故变量声明为Long435.8.2穷举法【例5-12】

我国古代数学家在《算经》中出了一道题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”即:当时用100元钱买100只鸡,其中公鸡每只5元,母鸡每只3元,小鸡3只1元,问可买公鸡、母鸡、小鸡各多少只?设公鸡X只,母鸡Y只,小鸡Z只,列出方程式:

X+Y+Z=100

5X+3Y+Z/3=1002个方程求3个未知数,无法用代数方法求解可将X、Y、Z分别为0~100的每一种可能性都去试一下,如符合,则就是其中的一种购买方案。列举所有可能的方案,找出符合要求的,这样的算法称为穷举法。44可测试方案分别为: 0、0、0;0、0、1;……;0、0、100;1、0、0;1、0、1;……;1、0、100;……;100、100、0;100、100、1;……;100、100、100事实上当X和Y确定时,Z可以用100-X-Y求得,因此可以把三重循环改为二重循环。

PrivateSubCommand1_Click()

DimXAsInteger,YAsInteger,ZAsInteger

Print"公鸡","母鸡","小鸡"

ForX=0To100

ForY=0To100

Z=100-X-Y

If5*X+3*Y+Z/3=100ThenPrintX,Y,Z

NextY

NextX

EndSub事实上X和Y的循环可分别为0到20和0到33455.8.3求水仙花数【例5-13】

求数100~999所有满足:数X=数X个位、十位、百位的立方和。如:153=1*1*1+5*5*5+3*3*3说明:该程序主要是能分出个位、十位、百位PrivateSubCommand1_Click()

DimiAsInteger

DimN1AsInteger,N2AsInteger,N3AsInteger

Fori=100To999

N1=i\100 '求百位

N2=(i-N1*100)\10 '求十位

N3=iMod10 '求个位

Ifi=N1^3+N2^3+N3^3Then '计算水仙花数

Printi;"=";N1;"^3+";N2;"^3+";N3;"^3"

EndIf

Next

EndSub

465.8.4验证哥德巴赫猜想【例5-14】

输入一个大于等于6的偶数,将它分解为两个素数之和。对每一个大于等于6的偶数N都可表示成:N=3+(N-3)、N=4+(N-4)、N=5+(N-5)、……、N=(N-3)+3,即A、B的范围为3~N-3由于大于2的偶数不是素数,处理前可以去掉这些数,由于3+(N-3)和(N-3)+3是一致的,故A的范围为3~N/2,B=N-A。程序设计思路:当输入一个大于等于6的偶数N后,让A在3~N/2的奇数范围内循环,若A是素数,则求出B=N-A,再判断B是否为素数,若B也是素数,则输出A和B。47PrivateSubCommand1_Click()

DimAAsLong,BAsLong,NAsLong,iAsInteger,jAsInteger

Do'该循环是为了必须获得一个大于等于6的偶数

N=Val(InputBox("请输入一个大于6的偶数"))

Print"输入的数为"&N

LoopWhileN/2<>N\2OrN<6

ForA=3ToN/2Step2'步长为2是只判断偶数

Fori=2ToSqr(A)'判断A是否为素数

IfAModi=0ThenExitFor

Nexti

Ifi>Sqr(A)Then'若A是素数

B=N-A'求出B

Forj=2ToSqr(B)'判断B是否也为素数

IfBModj=0ThenExitFor

Nextj

Ifj>Sqr(B)Then'若B也是素数

Pri

温馨提示

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

评论

0/150

提交评论