1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第五讲 循环结构及基本语句,5.1,循环结构概述,对于问题规模较大的重复问题适宜采用循环结构。,如:从键盘输入,50,个数,求,50,个数之和,并输出。,求解算法:求解程序:,(1),初始化:,0.0,sum,。,(2)1,I,。,(3),如果,I50,则执行步骤,(7),。,(4),输入一个数,x,并累加到,sum,中。,(5)I+1,I,。,(6),转步骤,(3),。,(7),输出结果,sum,。,(8),结束。,对于上述算法和程序,不管程序规模多大,长度不变。,Program ex1,sum=0.0,
2、DO I=1,50,1,READ(*,*)x,sum=,sum+x,ENDDO,WRITE(*,*)sum=,sum,END,循环结构分为两类:,循环体的循环次数事先确定,(,如,例,5.1,中循环结构,),这类循环结构称为确定性循环,或称,“,计数型,”,循环,使用计数型循环语句,(,如,DO,循环语句,),实现这类循环结构。,循环次数为:,MAX(,(,终值,-,初值,)/,步长,+1,0),。,循环体的循环次数事先不确定,(,如,例,5.2,中循环结构,),这类循环结构称为非确定性循环,或称,“,条件型,”,循环,使用条件型循环语句,(,如,DO WHILE,循环语句,),实现这类循环结
3、构。条件型循环又分,“,当型,”,循环和,“,直到型,”,循环。,初值,循环变量,v,v,终值,v+,步长,v,假,真,计数型,判定条件,判定条件,循环体,假,真,循环体,假,真,当型,直到型,例,5.1,求,S=1+2+3+,+N,的值,(N,由键盘输入,N2),。,编写程序。,解:求解这一问题,将执行,N-1,次加法运算。,如果将等式写成,S=0+1+2+,+N,则执行,N,次加法运算。,重复问题易采用循环结构实现。,用,S,保存和,用,N,保存最大求和值,用,I,作计数器。编写程序如下:,Program ex2,INTEGER S,N,I,READ(*,*)N,S=0,DO I=1,N,
4、1,S=S+I,EDNDO,WRITE(*,,*,)S=,S,END,例,5.2,读入某班级考试成绩,(,人数不定,),计算其平均成绩,并输出,。,解:由于学生人数不定,所以输入的学生成绩个数不确定,以输入,-1,作为结束标志,(,因为成绩不可能为负数,),从而动态确定学生人数,n,。,平均成绩计算公式是:,av,=(x,1,+x,2,+,+,x,n,)/n,Program ex3,INTEGER sum,n,x,REAL,av,sum=0,n=0,READ(*,*)x,DO WHILE(x/=-1),n=n+1,sum=,sum+x,READ(*,*)x,ENDDO,av,=sum/n,WR
5、ITE(*,,*,),平均成绩为:,av,END,5.2,使用,DO,循环语句实现计数型循环,:DO=,ENDDO,说明:,v,为循环变量,一般为整型变量,用来控制循环次数。,e1,、,e2,和,e3,为表达式,其类型与循环变量类型相同。,e1,代表循环变量,v,的初值,,e2,代表循环变量,v,的终值,,e3,代表循环变量,v,的步长,,e3,可缺省,,e3,缺省指,e3,为,1,。,循环次数计算公式是:,MAX(,(e2-e1)/e3+1,,,0),。,如果,e30,,,则一般要求,e1e2,,,否则循环次数为,0,,即循环体一次也不执行。,如果,e30,,,则一般要求,e1e2,,,否则
6、循环次数为,0,,即循环体一次也不执行。,在循环体中可引用循环变量,v,的值,但不能赋值,即修改它的值。,DO,循环语句执行过程说明:下面,DO,循环语句的循环次数为,5,:,M=1;N=5;L=1,DO I=M,N+5,L+1 !,输出,1,、,3,、,5,、,7,、,9,write(*,*)I,M,N,L,M=M+1;N=N*I;L=2*L+I,ENDDO,程序运行后,输出结果为:,1 1 5 1,3 2 5 3,5 3 15 9,7 4 75 23,9 5 525 53,计算表达式,e1,,,e2,,,e3,e1,v,计算循环次数,r:MAX(INT(e2-e1)/e3+1),,,0),
7、r,r,0,执行循环体,v+e3,v,r-1,r,DO,循环语句下面一条语句,真,假,5.3,使用,DO WHILE,循环语句实现循环,:DO WHILE(),ENDDO,说明:,循环条件可以是关系表达式,也可以是逻辑表达式,但不能是算术表达式或字符表达式。,使用,DO WHILE,语句时要特别注意死循环的产生,要保证循环体中至少有一条对循环控制条件有影响的语句,否则将产生死循环。,循环体,DO WHILE,循环语句在每次循环体执行前都要计算表示循环控制条件的逻辑表达式,其计算结果决定循环体是否继续执行,循环体的执行过程必须对循环控制条件产生影响。,计算表示循环控制条件的逻辑表达式,结果赋予,
8、log,log=.TRUE.,循环语句下面一条语句,真,假,执行循环体,PROGRAM cycle2,sum=0,READ(*,*)x,DO WHILE(0=x.AND.x=9)EXIT,ENDDO,END,!,示例程序二:输出奇数,1,3,5,7,9,I=1,DO WHILE(I=9)EXIT,I=I+2,ENDDO,END,!,示例程序三:输出奇数,1,3,5,7,9,I=1,DO,write(*,*)I,IF(I=9)EXIT,I=I+2,ENDDO,END,CYCLE,功能:,在循环体执行过程中强制性终止本次循环的执行,转循环开始语句,(DO,语句,),执行。只能在,DO,和,DO W
9、HILE,循环语句内使用,CYCLE,语句。,DO I=2,5,write(*,(1X,,,I3)I,IF(I3)CYCLE,write(*,(1X,I3)I,END DO,Write(*,*),结束!,END,!,执行结果:,2 2 3 3 4 5,5.6,特殊,DO,循环语句与,EXIT,语句,:DO,ENDDO,说明:,特殊,DO,循环语句必须与,EXIT,语句配合使用。,使用特殊,DO,循环语句可使循环变得短小、简洁、清晰。,执行过程:,(1),按顺序依次执行循环体语句。,(2),循环执行过程中,若满足循环结束条件,则执行,EXIT,语句退出循环。,(3),无条件转,(1),。,循环体
10、循环体,:DO,ENDDO,说明:,特殊,DO,循环语句必须与,EXIT,语句配合使用。,使用特殊,DO,循环语句可使循环变得短小、简洁、清晰。,执行过程:,(1),按顺序依次执行循环体语句。,(2),循环执行过程中,若满足循环结束条件,则执行,EXIT,语句退出循环。,(3),无条件转,(1),。,(,示例,),循环体,Program,INTEGER M,,,N,,,R1,,,R2,,,R3,,,gcd,,,lcm,Write(*,*),输入两个自然数:,READ(*,*)M,N,R1=M;R2=N,DO,IF(R2=0)EXIT,R3=MOD(R1,R2)!,求,R1,除以,R2,的余数
11、R1=R2;R2=R3,END DO,gcd,=R1;lcm=M*N/,gcd,Write(*,(1X,I3,和,I3,的最大公约数为:,I3)M,N,gcd,Write(*,(1X,I3,和,I3,的最小公倍数为:,I3)M,N,lcm,END,5.7,循环嵌套,前面介绍的循环结构和循环语句都是一层循环,许多实际问题的求解算法和程序往往具有多重循环结构。,多重循环结构称为循环嵌套,循环嵌套是指在一个循环结构或循环语句的循环体中又含有循环结构或循环语句。对于,n,层循环嵌套称为,n,重循环。嵌套的循环层数原则上不限,但不易太多。,计数型、当型、直到型循环结构都可相互嵌套,DO,语句、,DO
12、WHILE,语句、特殊,DO,循环语句都可相互嵌套。根据实际问题的求解需要决定循环嵌套的形式和层数。,如果有,n,重循环,且循环次数分别为,r,1,、,r,2,、,、,r,n,则一般最内层循环体的循环总次数为:,r,1,r,2,r,n,。,一层循环,二层循环,二层循环,三层循环,三层循环,四层循环,例,5.8,求,。,解:求解这一问题的算法结构具有,“,计数型,”,循环结构与,“,计数型,”,循环结构嵌套的二重循环结构。程序中用两个,DO,循环语句嵌套来实现二重循环结构。,Program,INTEGER:i,,,j,,,fac,fac_sum,=0,!,循环嵌套,DO i=1,10,!,用外层
13、循环控制求和次数,fac,=1,DO j=1,i,!,用内层循环控制阶乘,fac,=,fac,*j,ENDDO,fac_sum,=,fac_sum+fac,ENDDO,Write(*,*),前,10,个自然数的阶乘和,=,fac_sum,END,!,赋值语句,fac,=,fac,*j,被,执行,55,次,!赋值语句,fac_sum,=,fac_sum+fac,被,执行,10,次,例,5.12,根据下面泰勒级数求,x,的正弦值,。,解:,我们已经熟悉,FORTRAN 90,提供的,SIN(x),、,COS(x),、,EXP(x),等内部函数,我们可直接使用这些内部函数计算正弦、余弦、指数等值。那
14、么这些函数是如何计算的呢?一般都是通过其泰勒级数计算。下面我们不用内部函数,自己编写程序计算正弦,值,然后与内部函数计算值进行比较。,遇到这类问题,必须将泰勒级数用通项公式表示,然后得出迭代公式。,其中:,n=1,2,3,。,设:,T,n,=(-1),n+1,x,2n-1,/(2n-1)!=T,n-1,(-1)x,2,/(2n-2)(2n-1),n=1,2,3,sinx,T,1,+T,2,+,+T,n,T,n+1,10,-7,10,-7,决定了计算精度。,上述计算问题变成了一个求和问题,可用一个,DO WHILE,语句实现。,根据分析,设计算法,编写程序,。,PROGRAM Sin_x,PAR
15、AMETER(pi=3.14159278,,,eps,=1E-7),INTEGER,:,n=1,,,maxterms,=10,REAL x,,,T,,,sinx,WRITE(*,,,“,(A),”,,,ADVANCE=,NO,),输入一个度数值:,READ(*,*)x,x=x*pi/180,!,转换为弧度值,T=,x;sinx,=T,DO WHILE(ABS(T),eps).AND.(n,eps)THEN,write(*,*),发散级数,不能得到结果。,ELSE,write(*,*),程序计算得到的正弦值:,,,sinx,write(*,*)FORTRAN 90,内部函数值:,,,SIN(x)
16、END IF,END,计算,T,和,sinx,将,x,转换为弧度,开始,不满足精度吗,?,真,假,结束,输入,x,n+1,n,初始化,T,和,sinx,判定收敛或发散,并输出相应结果,输入数据:,输入一个度数值:,45,输出结果为:,程序计算得到的正弦值:,0.7071068,Fortran 90,内部函数值:,0.7071068,1,输入,x,值,(,x,1),按下列公式计算,s,。,精度要求,5,位有效数字,最后一项,10,-5,。编写程序实现之。,2,输入,x,用迭代法按下列迭代公式求的值。初始值,y,0,=x,精度要求,4,位有效数字。编写程序实现之。,P194,页,9,,,10,题,5.8,习题,






