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

下载本文档

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

文档简介

1第6章

循环结构程序设计本章要点:For...Next循环While...EndWhile循环Do...Loop循环循环的嵌套循环结构程序应用举例2引言在程序中,如果需要重复相同或相似的操作步骤,则可以用循环结构来实现。使用循环结构的程序可以用很少的代码来方便地处理大量的重复性操作。一个循环结构应由以下两部分组成:循环体:规定要重复执行的语句序列。循环体可以重复执行0次到若干次。循环控制部分:用于规定循环的重复条件或重复次数,同时确定循环范围。要使计算机能够正常执行某循环,需要由循环控制部分限制循环的执行次数,使循环在执行有限次数后退出。3For循环变量=初值To终值[Step步长]语句组1[ExitFor][ContinueFor]语句组2Next[循环变量]6.1

For…Next循环结构1.格式

2.功能:

如流程图所示:初值循环变量循环变量值超过终值?执行循环体循环变量+步长循环变量Next之后的语句TF43.说明1)循环变量、初值、终值和步长都应为数值型。2)步长可正可负,也可以省略。如省略,则默认为1。步长>0时,则“初值”必须小于或等于“终值”,否则不能执行循环体内的语句;步长<0时,则“初值”必须大于或等于“终值”,否则不能执行循环体内的语句。3)ExitFor语句用于退出循环体,执行Next语句之后的语句。4)ContinueFor语句用于将控制权立即转移到For语句,继续下一轮循环。5)Next语句中的“循环变量”必须与For语句中的“循环变量”一致,也可以省略。5例:判断以下程序段的执行结果。

DimiAsIntegerFori=5To1Step-1Debug.Print(i*i)NextiDebug.Print(i)例:判断以下程序段的执行结果。

DimK,XAsIntegerX=6ForK=1To10Step-2X=X+KNextKDebug.Print(Str(K)&Str(X))25169410166【例6-1】求1+2+3+…+N的值累加分析:累加器(变量)初始化

Sum=0重复执行:

Sum=Sum+I

(I=1,2,…,N)

(循环体)F0

Sum,1

II>N?I+1

ISum+I

SumT输入N输出Sum流程图:7设计界面:TextBox1Button1TextBox2运行界面:8PrivateSubButton1_Click(…)HandlesButton1.ClickDimN,IAsInteger,SumAsLongN=Val(TextBox1.Text)'输入累加总项数

Sum=0

'设累加和初值为0

ForI=1ToN

Sum=Sum+I

'和值=和值+累加项

NextITextBox2.Text=Sum'输出累加结果EndSub代码设计:9思考:1.求12+22+32+42+…2.求13+33+53+…+(2n-1)33.求1-3+5-7+…+(-1)n+1(2n-1)4.求5.求10练习:输入N值,求1×2×3×…×N(即N!)累乘分析:

初始化:Fact=1

循环体:Fact=Fact×I(I=1,2,3…N)代码设计:

DimN,IAsInteger,FactAsLongN=Val(TextBox1.Text)'输入累乘总项数

Fact=1

'设乘积初值为1

ForI=1ToN

Fact=Fact*I

'乘积=乘积×累乘项

NextITextBox2.Text=Fact'输出累乘结果11思考:1.求1×3×5×7……(共N项)。2.求:3.求:12【例6-2】生成斐波那契(Fibonacci)数列的前N项,N由用户指定。斐波那契数列如下:

1,1,2,3,5,8,13,…

即从第三项起每一项是其前两项之和。分析:生成斐波那契数列的方法如下:1)首先给出第一项、第二项的值1和1,本题中设A=1,B=1,输出当前A、B。2)求下一个数C,即C=A+B,输出C,然后将B和C保存到变量A、B中,取代原来的A、B,即使用A=B,B=C实现。3)重复步骤2),直到输出所有的数。13流程图:F1

A,1

BI>N-2?I+1

IA+B

CT输出A,BB

A,C

B1

I输出C输入N14设计界面:运行界面:TextBox115代码设计:PrivateSubTextBox1_Click(…)HandlesTextBox1.ClickDimA,B,C,NAsIntegerN=Val(InputBox("请输入项数"))

A=1:B=1

TextBox1.Text=Str(A)&""&Str(B)&""

ForI=1ToN-2

C=A+BTextBox1.Text=TextBox1.Text&Str(C)&""

A=B

B=C

NextIEndSubTextBox1.AppendText(Str(C)&"")16思考:1.在文本框中显示1到500之间所有能被3整除的数,每行显示10个数。2.在文本框中显示1到指定N之间所有能被3和7同时整除的数。3.在文本框中显示00~3600之间的正弦和余弦值,每隔20求一组值。17练习:如何分析For循环程序的执行结果1.下列程序段的执行结果为【】。

DimI,GI=0ForG=10To19Step3I=I+1NextGDebug.Print(Str(I)&Str(G))G?I10>19?21313>19?11616>19?31919>19?42222>19?G+步长182.下列程序段的执行结果为【】。

DimI,X,Y,FX=1Y=1ForI=1To3F=X+YX=YY=FDebug.Print(F)NextII?FXY打印1>3?2>3?2122I=23233I=3I=43>3?53554>3?I+步长:196.2While...EndWhile循环结构问题:求12+22+32+42+…大于某数N的最小值,N由用户指定。特点:已知循环条件、未知循环次数,用While...EndWhile循环结构实现较方便1.格式:

While条件

[语句组]

[ExitWhile]

[语句组]

EndWhile2.功能:

F条件?语句组T20【例6-3】求12+22+32+…大于某数N的最小值,N由用户指定。界面设计:TextBox1TextBox2Button121代码设计:本题是一个累加问题,但累加次数未知,难以用For循环来实现,但可以很方便地使用While...EndWhile循环实现。设:累加和S=0,累加项I=0循环条件为S<=N循环体:I=I+1

S=S+I^2当S大于N时退出循环,这时S的值即为大于N的最小值22流程图:TS≤NI+1

IF输入NS+I2

S0

S,0

I输出S23PrivateSubButton1_Click(…)HandlesButton1.ClickDimI,N,SAsIntegerN=Val(TextBox1.Text)'输入NI=0:S=0'初始化,用S保存累加和

WhileS<=N'当S小于或等于N时进入循环体

I=I+1S=S+I*I'累加

EndWhileTextBox2.Text=S'输出和值SEndSub代码设计:思考:求12+22+32+42+…小于某数N的最大值246.3Do…Loop循环结构1.格式格式一:

DoWhile

条件[语句组1]

[ExitDo][语句组2]Loop格式二:

DoUntil

条件[语句组1]

[ExitDo][语句组2]Loop条件?循环体TFF条件?循环体T2.功能25格式:格式三:Do[语句组1]

[ExitDo][语句组2]LoopWhile

条件格式四:Do[语句组1]

[ExitDo][语句组2]LoopUntil

条件条件?循环体TF功能:条件?循环体TF263.说明1)四种格式的区别:使用“While条件”与使用“Until条件”的区别。“条件”写在Do之后与写在Loop之后的区别。格式一、二:循环可能一次都不执行。格式三、四:至少要先执行一次循环体。2)ExitDo语句用于退出循环体,执行Loop语句之后的语句。3)可以在Do语句和Loop语句之后都没有条件,这时循环体内必须有ExitDo语句:

Do[语句组1]…ExitDo[语句组2]Loop27【例6-4】求直至最后一项的值≤10-4为止。分析:用Sum表示累加和,初值:Sum=0

重复:Sum=Sum+Term用Term表示每一项,则Term=1/(N*N)用N表示1,3,5,7,…初值:N=1

重复:N=N+2归纳:初始化:N=1,Sum=0重复:Term=1/(N*N),Sum=Sum+Term,N=N+2循环终止条件:Term<=0.000128流程图:FTerm<10-41/(N*N)

TermTSum+Term

Sum1

N,0

Sum输出SumN+2

N29界面设计:TextBox1Button130代码设计:PrivateSubButton1_Click(…)HandlesButton1.Click

DimNAsInteger,Term,SumAsDoubleN=1:Sum=0DoTerm=1/(N*N)Sum=Sum+TermN=N+2

LoopUntilTerm<=0.0001TextBox1.Text=sumEndSub31练习:如何分析Do循环程序的执行结果。1.下列程序段的执行结果为【】。

DimN,JN=0J=1

DoUntilN>2N=N+1J=J+N*(N+1)

LoopDebug.Print(Str(N)&Str(J))N>2?NJ打印:321FF1329F321T322.下列程序段的执行结果为【】。DimA,BA=0B=1DoA=A+BB=B+1LoopWhileA<10Debug.Print(Str(A)&Str(B))A:B:A<10?打印:1053123T64T10T5F336.4循环的嵌套如果在一个循环体内又包含一个完整的循环,则称为循环的嵌套。根据嵌套的循环层数不同,又可以有二层循环、三层循环等。多层循环的执行过程是,外层循环每执行一次,内层循环就要从头开始执行一轮,如:

ForI=1To9

ForJ=1To9Debug.Print(Str(I)&Str(J))

NextJNextI34【例6-5】打印九九乘法表。设计界面:运行界面1:运行界面2:TextBox135代码设计1:PrivateSubTextBox1_Click(…)HandlesTextBox1.ClickDimI,JAsInteger,SAsString

ForI=1To9

ForJ=1To9S=Format(I)&"×"&Format(J)&"="&_LSet(I*J,4)TextBox1.Text=TextBox1.Text&S

NextJTextBox1.Text=TextBox1.Text&vbCrLf'换行

NextIEndSub36代码设计2:PrivateSubTextBox1_Click(…)HandlesTextBox1.ClickDimI,JAsInteger,SAsString

ForI=1To9

ForJ=1ToIS=Format(I)&"×"&Format(J)&"="&_LSet(I*J,4)TextBox1.Text=TextBox1.Text&S

NextJTextBox1.Text=TextBox1.Text&vbCrLf'换行

NextIEndSub37使用嵌套循环需要注意:1)各种类型的循环结构也可以互相嵌套。嵌套时,内层循环必须完全嵌套在外层循环之内。例如,以下的嵌套都是允许的:ForI=1To10...ForJ=1To20...NextJ...NextIDo...ForJ=1To20...NextJ...LoopWhileI<=1038ForI=1To10...WhileJ<=20...EndWhile...NextIDo...DoWhileJ<=20...Loop...LoopUntilI>1039ForI=1To10...ForJ=1To20...NextI...NextJDo...ForJ=1To20...LoopWhileI<=10...NextJ以下嵌套是不允许的,因为内层循环没有完全嵌套在外层循环之内。402)当多层For...Next循环的Next语句连续出现时,Next语句可以合并成一条。例如,以下两个三重循环的写法是完全等价的。写法一:ForI=1To10...ForJ=1To20...ForK=1To30...NextKNextJNextI写法二:ForI=1To10...ForJ=1To20...ForK=1To30...NextK,J,I注意先后次序413)在多层循环中如果用ExitDo或ExitFor退出循环,要注意只能退出ExitDo或ExitFor语句所对应的循环。例如:F=1ForI=1To10

ForJ=1To10F=F*I*JIfF>1000ThenExitFor

NextJDebug.Print(F)F=1NextI42I=1:F=1DoWhileI<=10

ForJ=1To10F=F*I*JIfF>1000ThenExitDo

NextJDebug.Print(F)F=1I=I+1LoopDebug.Print(F)434)嵌套循环应选用不同的循环变量;并列的循环可以使用相同的循环变量,例如:ForI=...ForJ=......NextJ...ForJ=......NextJNextI44【例6-6】编程序求:

1+(1+2)+(1+2+3)+…+(1+2+3+…+N)

N由用户输入。界面设计:TextBox1TextBox2Button145代码设计:Sum1=0ForJ=1ToISum1=Sum1+JNextJPrivateSubButton1_Click(…)HandlesButton1.ClickDimN,I,JAsInteger,Sum1,SumAsLongN=Val(TextBox1.Text)Sum=0

ForI=1ToN求:Sum1=1+2+…+ISum=Sum+Sum1NextI

TextBox2.Text=SumEndSub46练习:分析多重循环程序的执行结果1.DimA,B,I,JA=0:B=0ForI=-1To-2Step-1

ForJ=1To2B=B+1

NextJA=A+1NextIDebug.Print(Str(A)&Str(B)&Str(I)&Str(J))答案:24-33I:J:B:-11223-21A:1…I+步长:-2J+步长:32472.DimX,YAsShort

ForX=5To1Step-1

ForY=1To6-XTextBox1.AppendText("*")

NextYTextBox1.AppendText(vbCrLf)

NextX答案:***************486.5循环结构程序应用举例【例6-7】用梯形法求函数f(x)=x2+12x+4在[a,b]区间的定积分。分析:定积分的几何意义:…梯形法:…49界面设计:TextBox1TextBox2TextBox3TextBox4Button150代码设计:PrivateSubButton1_Click(…)HandlesButton1.ClickDimA,B,H,X,F1,F2,AreaI,AreaAsSingleDimN,IAsIntegerA=Val(TextBox1.Text)B=Val(TextBox2.Text)N=Val(TextBox3.Text)H=(B-A)/NX=AArea=0'Area用于存放梯形面积的累加和

F1=X^2+12*X+4'F1为梯形的上底51

ForI=1ToNX=X+HF2=X^2+12*X+4'F2为梯形的下底

AreaI=(F1+F2)*H/2'计算第I个小梯形面积

Area=Area+AreaI

'累加梯形面积

F1=F2'把当前梯形的下底作为下一个梯形的上底

NextITextBox4.Text=AreaEndSub52【例6-8】已知某乡镇企业现有产值和年增长率,试问多少年后,该企业的产值可以翻一番。翻一番后实际产值是多少?分析:

P—现有产值

R—年增长率

Y—年数

V—增长后的产值,初始值为P累乘:V=P(1+R)(1+R)…退出循环条件V>=2P53流程图:输出年份Y输出产值VF产值V≥2PP

V,0

YTV(1+R)

VY+1

Y输入现有产值P输入年增长率R54界面设计:TextBox1TextBox2TextBox3Button1TextBox455代码设计:PrivateSubButton1_Click(…)HandlesButton1.ClickDimP,R,VAsSingle,YAsIntegerP=Val(TextBox1.Text)'输入现有产值

R=Val(TextBox2.Text)/100'输入年增长率

V=P:Y=0

DoUntilV>=2*PY=Y+1V=V*(1+R)

LoopTextBox3.Text=YTextBox4.Text=Format(V,"0.00")EndSub56【例6-9】给出两个正整数,求它们的最大公约数和最小公倍数。分析:求最大公约数可以用辗转相除法实现:1)以M作被除数,N作除数,求余数R。2)如果R不为零,则将除数N做为新的被除数M,将余数R做为新的除数N,再进行相除,得到新的余数R。3)如果R仍不等于0,则重复上述步骤(2)。如果R为零,则这时的除数N就是最大公约数。最小公倍数为两个数的积除以它们的最大公约数。57求最大公约数的算法流程图:输出最大公约数NFR≠0求M除以N的余数RT求M除以N的余数RN

M,R

N输入M,N58界面设计:TextBox1TextBox2TextBox3TextBox4Button1Button2将Button2的Enabled属性设置为False59求最大公约数代码如下:DimNAsInteger'定义变量N为模块级变量PrivateSubButton1_Click(…)HandlesButton1.ClickDimM,RAsIntegerM=Val(TextBox1.Text)N=Val(TextBox2.Text)R=MModN'求M除以N的余数R

DoWhile

R<>0

M=N'将除数N做为新的被除数MN=R'将余数R做为新的除数NR=MModN'求M除以N的余数R

LoopTextBox3.Text=NButton2.Enabled=TrueEndSub60求最小公倍数代码如下:PrivateSubButton2_Click(…)HandlesButton2.ClickTextBox4.Text=Val(TextBox1.Text)*_

Val(TextBox2.Text)/NEndSub61【例6-10】输入某个正整数N(N≥3),判断N是否是素数。分析:用N除以2到之间的全部整数,如果都除不尽,则N是素数,否则N不是素数。算法:首先设K=,然后用循环实现用N除以2~K之间的任一整数I,当遇到整除时,退出循环,这时的I值必然小于或等于K;如果N不能被2~K之间的任一整数I整除,则在完成最后一次循环之后,I的值为K+1。因此在退出循环之后可以根据I的值来决定N是否是素数。如果I<=K,则说明N是素数,否则N不是素数。62流程图:输出“不是素数”

K输入N2

II≤K?N能被I整除?I≤K?输出“是素数”

I+1

ITFTFTF63界面设计:TextBox1TextBox2Button164代码设计:ImportsSystem.MathPublicClassForm1PrivateSubButton1_Click(…)HandlesButton1.ClickDimN,K,IAsIntegerN=Val(TextBox1.Text):K=Int(Sqrt(N)):I=2

DoWhileI<=K

IfNModI<>0ThenI=I+1'不能整除,I值累加1

Else

ExitDo

'整除,退出循环

EndIf

LoopIfI<=KThenTextBox2.Text="不是素数"Else_TextBox2.Text="是素数"EndSubEndClass65*【例6-11】用牛顿迭代法求方程在x=π附近的一个实根,精度要求:|xn+1-xn|≤10-4分析:牛顿迭代法的几何解释:牛顿迭代公式:xk+1=xk-f(xk)/f'(xk)66界面设计:PictureBox1Button167代码设计:ImportsSystem.MathPublicClassForm1PrivateSubButton1_Click(…)HandlesButton1.ClickDimX,X1,FX,FX1AsSingle,NAsIntegerX=PIN=0'N用于保存迭代次数

DoFX=Sin(X)-X/2'求f(x)FX1=Cos(X)-0.5'求f'(x)X1=X'保存当前根

X=X-FX/FX1

'求下一个根

N=N+1

LoopUntilAbs(X1-X)<0.0001

MsgBox("方程的根为:"&Format(X,"0.0000")_&vbCrLf&"迭代次数为:"&Str(N))EndSubEndClass68【例6-12】利用以下公式求π的近似值:要求精度为|Sn+1-Sn|<ε分析:这是一个累乘问题,首先找出乘积各项的规律。设第i项的分母为Pi,第i+1项的分母为Pi+1,则设前i项的积为Si,前i+1项的积为Si+1,则:69界面设计:TextBox1Button1TextBox270代码设计:PrivateSubButton1_Click(…)HandlesButton1.Click

'Eps表示精度ε,S用于保存累乘结果DimEps,P,S,S1AsDoubleEps=Val(TextBox1.Text)P=0S=2

DoP=Math.Sqrt(2+P)S1=S

S=S*2/P

LoopUntilMath.Abs(S1-S)<EpsTextBox2.Text=SEndSub71【例6-

温馨提示

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

评论

0/150

提交评论