版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第八章常用算法的程序设计举例第一章算法第二章计算机和计算机程序第四章逻辑运算和选择结构第五章循环结构的实现第六章Fortran的数据结构第七章数据的输入、输出第三章Fortran语言程序设计初步2第五章循环结构的实现循环操作:重复执行一组指令(或一个程序段)循环分类:无条件的循环有条件的循环35.1用GOTO语句实现循环例:打印30个学生的学号和成绩
N=1100READ(*,*)NUM,GRADE
WRITE(*,*)NUM,GRADEN=N+1 IF(N.LE.30)GOTO100
END输入NUM,GRADE打印NUM,GRADE直到
GOTO语句破坏了语句顺序执行的正常状况,不符合结构化原则,因此一般不提倡使用GOTO语句!GOTO<标号>属于直到型循环45.2用DO语句实现循环
DO
10N=1,30
READ(*,*)NUM,GRADE10WRITE(*,*)NUM,GRADE
END
DO语句循环体DO
s[,]v=e1,e2[,e3]循环终端语句标号循环变量循环变量初值循环变量终值循环变量增量5DO语句几点说明:1.e1、e2、e3可以是常数、变量或表达式DO
s[,]v=e1,e2[,e3]2.e1、e2、e3的值可以正或负,
e1、e2的值可以为0,e3的值不应为03.脱离循环的条件:循环变量沿变化的方向超过终值DO10,T=5.0,25.0,0.5DO10,T=C,50.0/2.0,0.5C=5.064.循环次数计算公式为:r=INT((e2-
e1+e3)/e3)5.如果v的类型和
e1、e2、e3的类型不一致,先将e1、e2、e3的类型化成v的类型,然后处理6.如果计算出循环次数r<0时,按r=0处理,即一次也不执行循环DO20,I=1,10,2循环次数:r=INT((10-
1+2)/2)=INT(5.5)=5次DO20,X=1.5,3.6,1.2循环次数:r=INT((3.6-
1.5+1.2)/1.2)=2循环次数:r=INT((3-
1+1)/1)=3DO10,I=10,1,2循环次数:r=INT((1-
10+2)/2)=-3避免使用实型的循环变量!用整型的循环变量时,计算出的循环次数是绝对正确的!7DO
循环执行过程计算e1、e2、e3的值计算循环次数:r=INT((e2-
e1+e3)/e3)当r>0循环体语句DO循环属于当型循环
DO
s[,]v=e1,e2[,e3]……s……适用范围:循环次数已知DO语句循环体8循环终端语句&继续语句(CONTINUE语句)循环终端语句循环体中带有语句标号的最后一个语句定义:
DO
10I=1,5020K=I*110PRINT*,I,K
循环体规定:下列语句不能作为DO循环的终端语句:9逻辑IF语句可作为DO循环的终端语句,但其内嵌语句不能是上述控制语句!
DO
10I=1,50K=I*1
PRINT*,I,K
10IF(K.GT.500)GOTO100GOTO语句,
DO语句,
STOP语句,
END语句,ENDIF语句,块IF语句,ELSE语句,ELSEIF语句,等10继续语句(CONTINUE语句)CONTINUE形式:作用:将流程转移到逻辑上的下一个操作
DO
20,I=1,10,2PRINT*,I
20
CONTINUE
优点:1.循环范围清晰,易识别;2.使一般可执行语句不再作为终端语句,仅执行其语句本身功能;3.不用记哪些语句不能作终端语句11DO
循环的一些规定1.循环变量可以在循环体中被引用,但不应再被赋值;2.循环变量的初值、终值和步长值在执行循环体期间不能改变;
DO
20,N=1,100M=2*NPRINT*,M
20
CONTINUE
DO
20,N=1,100N=2*NPRINT*,N
20
CONTINUE
DO
20,I=K,J,MK=2*KJ=J+1M=M/2PRINT*,K,J,M
20
CONTINUE
123.可以用转移语句从循环体内转到循环体外,也可以在循环体内转移,但不允许从循环外转到循环内;4.正常出口&非正常出口;
DO
10,I=1,100……
IF(I*I.GE.500)GOTO100
……
10
CONTINUE
……100
PRINT*,I,I*I非正常出口正常出口13DO
循环的嵌套(多重循环)一个循环体内又完整的包含另一个循环结构注意事项:1.嵌套循环的各层不允许使用同一个变量名作为循环控制变量;
DO20I=1,5……
DO10I=2,10,2 ……10CONTINUE
……20CONTINUE 143.嵌套DO循环中,可以共用一个循环终端语句;2.对于任何形式的循环,都不允许循环的交叉;
DO10I=1,5
DO20J=1,3 M=I*J10 CONTINUE20 CONTINUE
DO10I=1,10……
DO20J=0,20,2 ……20CONTINUE10CONTINUE
DO10I=1,10……
DO10J=0,20,2 ……10CONTINUE 4.可以从内层循环根据需要将控制转到外层循环,但不允许从外层循环将控制转到内层循环15C 打印九九表
do10i=1,9
do20j=1,9 k=i*j
write(*,*)i,'*',j,'=',k20
continue
write(*,*)10
continue endC 百钱买百鸡C 100元钱买100只鸡C 公鸡5元/只C 母鸡3元/只C 小鸡1元/3只
integerx,y,z
do10x=0,19
do20y=0,33 z=100-x-y
if(15*x+9*y+z.eq.300)$write(*,*)x,y,z20
continue10 continue end165.3当型循环的其他实现方法1.dowhile语句* 统计平均成绩
integercount sum=0.0 count=0
read(*,*)score
do10while(score.ge.0.0) sum=sum+score count=count+1
read(*,*)score10
continue aver=sum/count
write(*,*)'count=',count
write(*,*)'average=',aver
end17* 辗转相除求最大公约数
integerm,n,r,t
read(*,*)m,n
if(m.lt.n)then t=m m=n n=t
end
if r=mod(m,n)
do10while(r.ne.0) m=n n=r r=mod(m,n)10
continue
write(*,*)'Thegreatest',
$'commondivisoris',n
end
182.用块IF和GOTO语句实现当型循环C 判断n是否为素数
read(*,*)n j=sqrt(real(n)) i=2
do10while((i.le.j).and.
$(mod(n,i).ne.0)) i=i+110
continue
if(i.gt.j)then
write(*,*)n,'is',
$'aprimenumber'
else
write(*,*)n,'isnot',
$'aprimenumber'
end
if
endC 判断n是否为素数
read(*,*)n j=sqrt(real(n)) i=210
if((i.le.j).and.(mod(n,i).ne.0))then i=i+1
goto10
end
if
if(i.gt.j)then
write(*,*)n,'is',
$'aprimenumber'
else write(*,*)n,'isnot',
$'aprimenumber'
end
if
end19* 统计平均成绩
integercount sum=0.0 count=0
read(*,*)score
do10while(score.ge.0.0) sum=sum+score count=count+1
read(*,*)score10
continue aver=sum/count
write(*,*)'count=',count
write(*,*)'average=',aver
end* 统计平均成绩
integercount sum=0.0 count=0
read(*,*)score10
if(score.ge.0.0)then sum=sum+score count=count+1
read(*,*)score
goto10
end
if aver=sum/count
write(*,*)'count=',count
write(*,*)'average=',aver
end20*用π2/6≈1/12+1/22+...+1/n2,求π值
read(*,*)n sum=0.0 i=110
if(i.le.n)then term=1.0/(i*i) sum=sum+term i=i+1
goto10
end
if pi=sqrt(6.0*sum)
write(*,*)'pi=',pi
end213.用READ语句和GOTO语句实现当型循环自学!5.4直到型循环的实现用逻辑if语句可实现直到型循环。C求1-1/2+1/3+...+1/99-1/100的值
integersign sum=1.0 deno=2.0 sign=110 sign=(-1)*sign term=sign/deno sum=sum+term deno=deno+1
if(deno.le.100)goto10
write(*,*)sum
end22C 判断n是否为素数
logicalw
integerr
read(*,*)n w=.true. i=2 j=sqrt(real(n))10 r=mod(n,i)
if(r.eq.0)then w=.false.
else i=i+1
end
if
if((i.le.j).and.w)goto10
if(w)then
write(*,*)n,'is',
$'aprimenumber'
else
write(*,*)n,'isnot',
$'aprimenumber'
end
if
endC 判断n是否为素数
read(*,*)n j=sqrt(real(n)) i=2
do10while((i.le.j).and.
$(mod(n,i).ne.0)) i=i+110
continue
if(i.gt.j)then
write(*,*)n,'is',
$'aprimenumber'
else
write(*,*)n,'isnot',
$'aprimenumber'
end
if
end23CFibonacci数列问题C1,1,2,3,5,8,13,21,34...
f1=1.0 f2=1.0
write(*,*)f1
write(*,*)f2 n=3 f=f1+f210
write(*,*)f f1=f2 f2=f f=f1+f2 n=n+1
if((n.le.30).and.(f.le.1e5))goto10
end245.5几种循环形式的关系和比较1.DO循环用来处理已确定循环次数的问题。其他循环即可以处理已知循环次数的问题,也可以处理不确定循环次数的问题。对事先知道确定循环次数的问题,用DO循环比较方便。2.DO循环实质上也是一种“当型循环”。3.几种形式的循环可以互相转换,或者说,同一个问题可用任一种循环来处理。4.各种循环可以互相嵌套。但必须一个循环完整的包含在另一个循环之内。25C打印3~100间的素数
do10n=3,100,2 j=sqrt(real(n)) i=220
if((i.le.j).and.
$(mod(n,i).ne.0))then i=i+1
goto20
end
if
if(i.gt.j)write(*,*)n10
continue
end26ENDDO语句(Fortran90)
DO
20,I=1,10,2PRINT*,I
20
CONTINUE
DO
I=1,10,2PRINT*,IENDDO
do10while(score.ge.0.0) sum=sum+score
read(*,*)score10
continue
do
while(score.ge.0.0) sum=sum+score
read(*,*)score
enddo
27CYCLE和EXIT语句(Fortran90)CYCLE命令略过循环的程序模块中,在CYCLE命令后面的所有程序代码,直接跳回循环的开头来进行下一次循环。
programex
implicitnone
integerdest,floor
parameter(dest=9)
dofloor=1,dest
if(floor==4)cycle
write(*,*)floor
enddo
end假设某百货公司共有9层楼,但电梯在4层不停,试写一个程序来仿真百货公司中电梯从1楼爬升至9楼时灯号显示情况。EXIT的功能是可以直接“跳出”一个正在运行的循环。28署名的循环(Fortran90)
programex
implicitnone
integeri,joutter:doi=1,3inner:doj=1,3
write(*,*)'(',i,',',j,')'
enddoinner
enddooutterend
loop1:doi=1,3loop2:doj=1,3
if(i==3)exitloop1!跳离loop1循环
if(j==2)cycleloop2!直接做下一次的loop2循环
write(*,*)'(',i,',',j,')'
enddoloop2
enddoloop129上机目的:1.掌握用DO语句和DOWHILE语句实现循环的方法。2.熟悉其他当型和直到型循环的实现方法。3.掌握在程序设计中用循环的方法实现各种算法(如穷举法、迭代、递推等)上机内容:1.调试课本中的所有程序;2.习题第4、8题。30
DO
10,A=2.5,-1.6,-0.5
<循环体>
10
CONTINUE
1.在下列程序段中,循环体被执行的次数为练习题(选择)A)1B)2C)4D)9解:没有任何说明,隐含A为实型,根据计算公式r=INT((-1.6-2.5+(-0.5))/(-0.5))=931
DO
10,K=2.5,-1.6,1.5
<循环体>
10
CONTINUE
2.在下列程序段中,循环体被执行的次数为A)0B)3C)4D)无穷大解:没有任何说明,隐含K为整型,首先将三个循环参数转换为整型量2,-1,1,根据计算公式r=INT((-1-2+1)/1)=-2<0,即循环次数为0。32
DO
10K=5,1,-1M=0
DO20J=K,5M=M+K*J
20
CONTINUE
10
CONTINUE
WRITE(*,*)M
END3.阅读下列FORTRAN77程序A)120B)15C)140D)135上述程序运行后,输出的M值为33解:这是一个双重循环。在外循环的循环体中,每次都对M清零,因此只考虑外循环的最后一次循环中所执行的内循环。外循环最后一次循环的K为1,最后一次执行的循环体相当于右图:M=1+2+3+4+5=15
DO
10K=5,1,-1M=0
DO20J=K,5M=M+K*J
20
CONTINUE
10
CONTINUE
WRITE(*,*)M
ENDM=0
DO20J=1,5M=M+J
20
CONTINUE
34
DO
10I=1,2S=0.0
DO10J=1,3S=S+I+J10
CONTINUE
WRITE(*,*)S
END4.阅读下列FORTRAN77程序A)21.0B)9.0C)12.0D)6.0上述程序运行后,输出的S值为35解:这是一个双重循环。内外循环共用一个CONTINUE语句。由于外循环的循环体中每次都对S清零,因此,只有在最后一次执行内循环时S的累加结果才是最后输出的结果。S=(2+1)+(2+2)+(2+3)=1236
S=0.0DO
10I=1,2DO10J=1,3S=S+I+J10
CONTINUE
WRITE(*,*)S
END5.阅读下列FORTRAN77程序A)21.0B)9.0C)12.0D)6.0上述程序运行后,输出的S值为37解:这个程序和上个题目的根本区别是:在双重循环的外面给S清零。因此,将对两次外循环执行时的I和J的值进行累加,即S=[(1+1)+(1+2)+(1+3)]+[(2+1)+(2+2)+(2+3)]=9+12=2138DO
10T=1.5,10.5,1.5DO10I=1,10<循环体>10
CONTINUE
6.在下列的双重循环中,内层的循环体执行的总次数为A)10B)40C)30D)70解:外循环执行的次数为r1=INT((10.5-1.5+1.5)/1.5)=7内循环执行的次数为r2=INT((10-1+1)/1)=10因此,内层循环体共执行7×10=70(次)39DO
10A=-1.6,3.2,-1.6DO10K=1,3,2<循环体>10
CONTINUE
7.在下列的双重循环中,内层的循环体执行的总次数为A)3B)2C)0D)5解:外循环执行的次数为r1=INT((3.2-(-1.6)+(-1.6))/(-1.6))=-2<0即外循环一次也不执行,因此,内层循环体也一次不执行40DO
10I=1,10DO20J=1,3……10
CONTINUE
20
CONTINUE
8.下列循环中,正确的是D)DO
10I=1,10
DO10I=2,5,2……10
CONTINUE
DO
1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论