资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,3.1,有循环变量的,DO,循环结构,3,循环结构程序设计,3.2,重复,DO,循环结构,3.3 DO_WHILE,控制的循环结构,3.4,循环的嵌套,3.5,循环结构程序设计举例,3.1,有循环变量的,DO,循环结构,重复执行一组操作称为循环。算法中构成循环的结构称为循环结构 。,在,FORTRAN,中,实现循环结构的最直接方法就是用,GOTO,语句,但这种方法不符合结构化程序设计的思想,并不值得提倡。,FORTRAN 90,一般有两种方法实现循环控制,:DO_ENDDO,语句和,do While_ENDDO,语句。,格式,:,DO,循环变量,v= e1,e2,e3,循环体,statements,ENDDO,功能,:,对于变量,v,的值从初值,e1,按增量,e3,增加到终值,e2,反复执行,循环体,。,e1,e2,e3,都是算术表达式,e3,的缺省值为,1,。循环变量,v,是代数量,(,整型,/,实型,),。,例: DO I=10,2,-2,print *,I,I*I,ENDDO,循环次数,r=INT(e2-e1+e3)/e3),如果初始值表达式,e1,终止值表达式,e2,增量表达式,e3,中有实型表达式,循环就可能少做一次。循环次数至少为零。,例,:E3 = 0.1,Do x = 0,50,.1,E3,print *,X,ENDDO,0.1,不能精确表示,50.1/0.1,得到,500.9,几,被,INT(),直接截断,循环次数,=500,。,返回,最好用整型变量来控制循环,以避免少做一次的问题。,例,:,X = 0,Do K = 0,500,print *,X X = X+0.1,EndDO,END,Do,循环执行过程,S1:,求表达式,e1,e2,e3,的值,编译系统分别用三个与循环变量,v,相同类型的临时变量,(,不妨记为,v1,v2,v3),来存放其值。,S2:,循环变量,v=v1,S3:,计算循环次数,r=INT(v2-v1+v3)/v3),S4:,若,r 0,则转,S9,S5:,执行循环体,S6:,循环变量,v,增加增量,v3,S7:,循环次数,r,减,1,S8:,转,S4,S9:,循环终端语句后第一条可执行语句。,注意,:,(1),循环变量的值在循环体中可以引用,不能被重新赋值,.,例,:,DO I=1,20,J=I*I,PRINT*,I,J,END,是可以的,.,而,DO I=1,20,I=I*I,PRINT*,I,END,非法,.,(2)E1,E2,E3,的,类型与,V,的类型可以相同,也可以不同,当类型不同时,系统自动将,E1,E2,E3,的类型转换成,V,的类型,.,例,:,DO I=2,5,1,的循环次数为,4.,DO X=2.2,5.4,1.1,的循环次数为,3.,DO I=2.2,5.4,1.1,的循环次数为,4.,(3),正常出口,:,从循环的,ENDDO,语句脱离循环的称为正常出口,否则称为非正常出口,.,脱离循环后循环变量保留脱离时的值,.,例,:,DO I=1,5,J=I*I,END DO,PRINT*,I,J,END,DO I=1,5,IF(I3)GOTO100,J=I*I,END DO,100 PRINT*,I,J,END,输出,6,25,输出,4,9,DO,循环结构命名方式与块,IF,结构相仿,:,DO,循环结构名,:,DO,循环变量,v= e1,e2,e3,循环体,statements,ENDDO,循环结构名,DO,循环结构的命名,例,:,计算,n!,Do,循环的例题,read(*,*) N,f = 1,do I = 2,N,f = f*I,ENDO,Write(*,*) n,f,END,例,:,前,n,个自然数之和,read(*,*) N,S = 0,do I = 1,N,S = S+I,ENDDO,Write(*,*) N,S,END,例,:,输入,100,个数,求其中正数的个数及其平均值。,S = 0;N = 0,Do K = 1,100,Read(*,*) A,IF(A0) Then,N = N+1,S = S+A,End If,ENDDO,If(N0) Print *, N,S/N,End,例,:,求,Fibonacci,数列:,1,,,1,,,2,,,3,,,5,,,8,,,的前,40,个数,.,1 1 2 3 5 8 13,F1 +F2= F,F1 +F2 = F,F1 + F2 = F,程序,为,:,F1=1;F2=1,PRINT*,F1,F2,DO I=3,40,F=F1+F2,PRINT*,F,F1=F2,F2=F,END DO,END,DO I=1,19,F1=F1+F2,F2=F1+F2,END DO,3.2.1,中断语句,(EXIT,CYCLE),3.2,重复,Do,循环结构,EXIT,语句强制退出循环,格式为,:,EXIT DO,循环结构名,可用,IF,语句结合,EXIT,语句有条件地中断循环。,例如:输入一组整数(个数小于,100,),求这组数的偶数个数和偶数之和。当某数大于,9000,时程序结束。程序为:,INTEGER:I,K,N=0,S=0,EXAM1:DO I=1,100,READ*,K,IF(K9000)EXIT EXAM1,IF(MOD(K,2)=0)THEN,N=N+1,S=S+K;ENDIF,ENDDO EXAM1,PRINT*,N=,N,S=,S,END,CYCLE,语句使循环体中在它后面的语句不被执行,而重新执行下一轮循环,格式为,:,CYCLE DO,循环结构名,可用,IF,语句结合,CYCLE,语句有条件地转移循环。,说明:,(,1,),CYCLE,语句的执行将改变循环体的执行顺序,并不终止循环的执行。,(,2,)当执行,CYCLE,语句后,重新执行下一轮循环时,循环变量应增加一个步长。,例如:输入一组数据(,100,个),将大与,0,的数据打印出来。程序为:,IMPLICIT NONE,REAL X,INTEGER I,DO I=1,100,READ*,X,IF(X0)CYCLE,PRINT*,X,ENDDO,END,3.2.2,重复,Do,循环结构,一般形式,:,DO,循环结构名,: DO,循环体,statements,ENDDO,DO,循环结构名,重复,Do,循环结构,一般来说是一个死循环,必须在其循环体内用逻辑,IF,语句结合,EXIT,语句或,GOTO,语句等迫使循环中止。,例,:,判断整数,N,是否素数,Integer n,a,read*,n,a = 2,Do,if(mod(n,a) = 0.or.an/2) exit,A = a+1,enddo,If(a0),M = 10*M+MOD(N,10),N = N/10,End Do,Print *, M,End,例:输入两个正数,M,,,N,,,求其最大公约数。,用辗转相除法。程序为:,INTEGER M,,,N,,,K,,,YS,READ*,,,M,,,N,IF,(,M,N,),THEN,K=M,;,M=N,;,N=K,END IF,YS=MOD,(,M,,,N,),DO WHILE,(,YS/=0,),M=N,;,N=YS,;,YS=MOD,(,M,,,N,),ENDDO,PRINT*,N,END,程序为:,INTEGER,:,N=1,REAL,:,S=1.0,T=1.0,PI=0.0,DO WHILE(ABS(T)=1E-5),T=S/N;PI=PI+T;S=-S;N=N+2,ENDDO,PRINT*,PI=,4*PI,END,例:计算,的近似值,精度要求第,N,项的值小于,10,-5,时结束。,Do,循环是一种块结构,象块,IF,那样,当它的块结构内部又出现,Do,循环时,就构成了,Do,循环的嵌套,。嵌套的层数理论上无限。,3.4,循环的嵌套,循环与块,IF,还可相互嵌套,构成复杂的程序结构。,内外层循环不能用相同的循环变量名。,Do,循环、块,IF,和,CASE,结构都是块结构,无论怎样嵌套,都必须保证块的完整性。不允许交叉嵌套,也不允许从块外转到块内,但可以从块内转出。,嵌套循环的执行顺序当然是由最外层循环开始,逐层推进,这是不言而喻的。事实上,块结构,(,例如块,IF),嵌套的执行顺序都是由最外层开始,逐层推进。只要把较内部的块结构理解为包含它的上一层块结构的一个执行步骤,就能够很好地理解块结构的嵌套及其执行顺序。,3.5,循环结构程序设计举例,例,:,求前,N,个自然数的阶乘的和,read *, N,Sum = 1;F = 1,DO K = 2,N,F = F*K,Sum = Sum+F,ENDDO,Write(*,*) N,Sum,End,例,:“,百鸡问题”,:,公鸡,5,元,/,只,母鸡,3,元,/,只,小鸡,3,只,/,元,100,元如何买,100,只鸡?,设买公鸡,x,只,母鸡,y,只,小鸡,z,只,有,:,x+y+z=100,且,5x+3y+z/3=100,Integer x,y,z,Do X = 0,19,DO Y=0,33,Z=100-X-Y,if(15*x+9*Y+Z=300) Print *, x,y,z,EndDO,ENDDO,END,例,:,求正整数,M,与,N,的最大公约数,Integer M,N,Read(*,*) M,N,Do While(M/=N),IF(MN) THEN,M=M-N,ELSE,N=N-M,End If,End Do;Print *, M,End,例,:,输入,30,个学生的三门考试成绩,计算每个学生的平均成绩,并把大于,85,分的平均成绩打印出来,.,Implicit none,Integer I,j,Real sum,ave,score,Do I=1,30,sum=0,do j=1,3,read*,score,Sum=sum+score,enddo,Ave=sum/3.0,If(ave,=85)print*,ave,Enddo,End,例:求,3,!,+6,!,+9,!,求,I,阶乘的程序段为,T=1.0,DO J=1,I,T=T*J,END DO,求出的,T,值加到,S,上,S=S+T,I,的取值为,3,,,6,,,9,可用,DO,循环,DO I=3,9,3,ENDDO,说明部分为,IMPLICIT NONE,REAL :S=0.0,T,INTEGER I,J,输出为,PRINT*,S=,S,END,程序举例,选择结构和循环结构部分,例,1,:求下列函数值:,Y=,程序为:,READ*,X,IF(X-5).OR.(X= =-1)THEN,Y=0.0,ELSE IF(X0)THEN,Y=1.0/(X+1.0),ELSE IF(X5.0)THEN,Y=1.0/(X+2.0),ELSE IF(X0.0.and.x/=1.0)then,z=10.0,Else if(x*y=1E-4),F=-F,T=F/(K*(K+1),SUM=SUM+T,K=K+1,ENDDO,PRINT*,SUM,END,该,程序把刚小于,10,-4,这项也加到,SUM,中,例,6:,求满足,:,时的,最大,K,值,.,程序为,:,S=0.0,K=0,DO WHILE(S2000),K=K+1,S=S+K*K,ENDDO,PRINT*,K-1,END,例,7:,求,2,到,500,之间的所有亲密数对,.,亲密数对的定义是,:,如果,M,的因子,(,包括,1,但不包括自身,),之和为,N,且,N,的因子之和为,M.,请在下列程序中填上合适的内容,.,DO M=2,500,N=0,DO K=1,if(mod(m,k).eq.0),ENDDO,J=0,DO K=1,,IF(MOD(N,K).EQ.0),ENDDO,IF(,).AND.(M.LE.N)THEN,PRINT*,M,N,END IF,ENDDO,END,此,条件是控制只,输出,MN,这一,对,答案为,:,M/2 (2) N=N+K,(3)N/2 (4) J=J+K,(5) M.EQ.J,例,8:,下列程序的功能是,:,从键盘输入,5,组数,每组有,10,个实数,求出各组中元素绝对值之和的最大者和最小者,.,请在下列程序中填上合适的内容,Real:maxx,=0.0,minn=0.0,Do I=1,5,DO J=1,,,10,READ*,,,X,SUM=SUM+,ENDDO,IF,(,SUM,MAXX,),IF(I= =1),(SUM & MINN)THEN,MINN=SUM,ENDIF,ENDDO,PRINT*,MAXX,MINN,END,答案,:(1)SUM=0.0 (2)ABS(X),(3)MAXX=SUM (4).OR.,例,9:,求,3,到,100,内的全部素数,并统计个数,.,判断一个数,N,是否为素数,可用下列程序段,.,J=SQRT(REAL(N);I=2,DO WHILE(MOD(N,I)/=0.AND.IJ)THEN,PRINT*,N,是素数,K=K+1,END IF,求,3,到,100,内的全部素数,程序为,:,K=0,DO N=3,100,ENDDO,END,
展开阅读全文