第六章循环结构(上)§6.1引言§6.2无循环变量的DO结构§6.3带循环变量的DO结构§6.4DOWHILE结构6.1引言循环的定义计算处理方法和处理过程完全一样,只是数值变化,重复地运行某个语句块。这个语句体被重复执行的情形,称为循环。由于Fortran90中不提倡语句带有标号,也不提倡使用Goto语句,因而排除了用IF语句和goto语句构成循环的情况。这样在循环程序段中均由Do结构实现,其Do结构共有三种形式:1.不带循环变量的DO结构2.带循环变量的DO结构3.DoWHILE结构例1:求S=1+2+3+…+N的值(N由键盘输入N2)。INTEGER::S,N,IS=05READ(*,*)NIF(N=2)GOTO5I=110IF(IN)THENS=S+I;I=I+1GOTO10ENDIFWRITE(*,*)‘S=‘,SEND此种循环fortran90不提倡使用。例2:读入某战士打靶的成绩,计算其平均成绩。INTERGER::S,MARK,IREAL::AVES=0DOI=1,10READ*,MARKS=S+MARKENDDOAVE=S/10.0WRITE(*,*)‘AVE=‘,AVEEND带循环变量的循环结构2.循环结构组成。循环体:需重复处理的语句序列;循环控制机制:根据已知条件判断循环是否继续执行。3.循环的分类:(1)循环次数未知如例1所示(2)循环次数已知如例2所示6.2不带循环变量的DO循环1.无循环变量DO结构的一般形式[结构名:]DO循环体ENDDO[结构名]其中方括号内的内容是可选的。DO语句为入口语句;ENDDO表示DO结构的出口;循环体可以是一条或多条简单可执行语句。也可是IF结构、CASE结构或另一个DO结构。DOREAD*,XSUM=SUM+XPRINT*,SUMENDDO执行过程:从DO语句进入循环,执行读语句、累加、输出;然后遇到ENDDO语句,然后返回循环体的第一条语句,继续执行循环体语句,一直进行下去。该DO结构是一个无休止的的循环,称为死循环要终止该循环必须添加一个EXIT语句。1.EXIT语句:格式:EXIT[DO结构名]作用:停止循环,将控制转移到当前循环或指定结构之外。单独使用将无条件终止循环,一般的用法是有条件的控制循环出口。格式为:IF(逻辑表达式)EXIT[DO结构名]功能:当条件为真时,停止正在进行的循环,将控制转移到EXIT后指定的结构之外,若没有指定结构名,则跳出当前循环。EXIT语句应用举例例6-1求1+1/2+1/3+……+1/N的值。例6-2求一批数中负数的个数及负数的总和。要求数据一个一个地由键盘输入,输入的数据为0时终止循环。带循环变量DO结构的一般形式[DO结构名:]DO,V=E1,E2[,E3]循环体ENDDO[DO结构名]V是循环控制变量,可以是整型或实型。E1是循环控制变量的初始值;E2是循环变量的终止值;E3是循环变量的增量。E1、E2、E3可以是整型、实型的常数、变量或表达式,当为表达式时,其中涉及的变量应具有具体的值。符号可正可负。6.3带循环变量的DO结构执行过程(1)对表达式E1,E2,E3分别求值。默认E3的值为1(2)令V变量被赋值为E1。(3)测试循环次数R,若R=0则跳过循环体,转去执行终端语句后面的第一条语句,若R0,则执行循环体直到循环终端语句。(4)执行终端语句后,V增加一个步长E3,循环次数减1,(5)返回(3)重复执行(3)(4)(1)E2不允许为最大整数值(2)E3不允许为零,否则循环不能终止注意:是判断一个DO语句是否成立的条件(3)DO循环变量在循环体内不能再次定义DOI=3,6I=5!!错误J=J+IENDDO(4)循环变量的初值E1、终值E2和步长E3只是在循环入口有效,进入循环后,它的值与循环次数无关。注意事项注意事项:(5)在带循环变量DO结构中仍可使用EXIT语句。(6)循环正常退出时,V的值超过循环变量的终值。循环非正常退出时,V保持当前值。(7)循环变量在循环体内不能被重新赋值,但是在循环体外则可被重新赋值。(8)在DO结构中包含的IF结构和CASE结构等必须时完整的结构,不允许出现结构的交叉。(9)循环可以不经ENDDO,但是不能从循环体外转入循环体内。DOWHILE结构的一般形式:[结构名:]DOWHILE(逻辑表达式)循环体ENDDO[结构名]循环体DOWHILE判定条件ENDDO相当于DOIF(.NOT.逻辑表达式)EXIT循环体ENDDO6.4DOWHILE结构TFDOWHILE执行过程嵌套DO结构的有关规定:1.各种DO结构都可以嵌套,但必须完整嵌套。2.对于带循环变量的DO结构,并列的DO结构可以用同一个变量名作循环变量,而嵌套的DO循环结构则不能使用相同的循环变量。3.EXIT语句强行终止当前或指定循环。4.可从循环体内跳到循环外,但不能从循环体外跳到循环体内。程序举例补充:循环控制的设计方法:1.关键:找出循环体a)求累加和S=S+Tb)求连乘积T=T*Nc)求XNT=T*Xd)求连加的循环次数S=S+1e)其他S=S+AA=…2.确定循环的初值a)求累加和初值为0或所给数据的第一项b)求连乘积初值为1或所给数据的第一项c)求最大值初值为所给数据的第一项或足够小的量d)求最小值初值为所给数据的第一项或足够大的量注意:赋值语句的位置3.循环次数的选定a)已知累加计算的项数Nb)未知计算项数N,当通项值小于一个值时停止,可取N为一个足够大的值。1.累加和计算例1:求S=2+4+6+…+200的值S=0DON=1,100S=S+2*NEnddoPRINT*,SEND累加和:S新=S原+通项2.被加数不能直接用表达式表示例2:求!100!3!2100321xxxxxes重复:!nxnssA=A*X/N注意:分母不能为零!3.一批数据的处理——顺序查找法例:从1~1000的正整数中,所有3的倍数之和及个数。算法:顺序查找程序:S=0N=0DOI=1,1000IF(MOD(I,3)==0)THENS=S+IN=N+1ENDIFENDDOPRINT*,S,NEND4.嵌套循环例:全校30个班,每班50个学生,每学生三门课程,要求统计并打印出每个班的平均成绩和全校总(平均)成绩ST=0.0A1:DOI=1,30S=0A2:DOJ=1,50READ(*,*)A1,A2,A3B=A1+A2+A3S=S+BENDDOA2A=S/50PRINT*,I,AST=ST+SENDDOA1SA=ST/(50*30)PRINT*,SAEND5.穷举法例:一个口袋中有白球3只,红球3只,黑球6只,任取8只,有多少种取法?INTEGER::X,Y,ZN=0X:DOX=0,3Y:DOY=0,3Z:DOZ=0,6IF((X+Y+Z)==8)N=N+1ENDDOZENDDOYENDDOXPRINT*,NEND!!3!2321nxxxxnxes练习:求以下公式的值:当最后一项绝对值小于1010时停止。例:输入M、N,求最大公约数。程序:INTEGERR,TREAD*,M,NIF(M.LT.N)THENT=M;M=N;N=TENDIF10R=MOD(M,N)IF(R.NE.0)THENM=N;N=R;GOTO10ENDIFPRINT*,NEND请改写为DO循环结构练习:1、输入M、N,求最小公倍数。2、求数列1,1,2,3,5,8……的前30项。(重复:FN=FN-1+FN-2)DO的非整型增值例7:打印出所有的“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身。例如,153是一个“水仙花数”,因为153=13+53+33integer::i,j,k,ndon=100,999i=n/100j=n/10-i*10k=mod(n,10)if(n==i*i*i+j*j*j+k*k*k)print*,nenddoendQUESTION???27