《fortran程序设计..第5章.ppt》由会员分享,可在线阅读,更多相关《fortran程序设计..第5章.ppt(46页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、FORTRAN语言-FORTRAN 77结构化程序设计第五章 循环结构的实现 l重复执行一组指令称为循环操作。在程序中存在两类循环:无条件循环和有条件循环。无条件循环是无休止地执行一个程序段,而有条件循环是在满足一定条件时才执行循环。l经常会遇到循环类型的问题,例如需要对全班学生求平均成绩,求n的阶乘,求 n个数的和等都需要用到循环处理的方法。5.1 用GOTO语句实现循环 GOTO语句的形式:GOTO 例如:“GOTO 10”表示流程转去标号为10的语句行继续执行。由于GOTO语句破坏了语句顺序执行的正常状态,不符合结构化程序设计原则,因此一般不提倡使用GOTO语句。只有在一个基本结构内部可
2、以使用GOTO语句。利用GOTO语句可以实现循环处理。例:读入学生的学号和成绩并且打印无条件循环:10READ*,NUM,GRADEPRINT*,NUM,GRADEGOTO 10有条件循环:N=110READ*,NUM,GRADEPRINT*,NUM,GRADEN=N+1IF(N.LE.5)GOTO 105.2 用DO语句实现循环 当需要执行的循环次数为已知时用DO语句实现循环比较方便。例如,上节读5个学生的学号和成绩,要执行READ语句和PRINT语句5次。可以改用DO语句实现:DO 10,N=1,5,1READ*,NUM,GRADE 10PRINT*,NUM,GRADE5.2.1 循环语句
3、(DO语句)和循环次数的计算 DO循环由一个DO语句和循环体组成:DO 10,I=1,10,1(循环语句)J=I*I(循环体)10 PRINT*,I,JDO语句的一般形式为:DO 标号,循环变量=初值,终值,步长 s v =e1,e2,e3循环次数可以从循环初值、终值和步长计算出来:r=INT(e2-e1+e3)/e3)例如:DO 10,I=1,10,2DO 20,N=1,5 DO 100,X=1.2,2.4,0.2DO 150,T=2.5*2,50.0/2.0,0.5 DO 200,M=1.5,12.5,1.5 5.2.2 循环执行过程 循环执行过程执行以下步骤:计算表达式e1,e2,e3的
4、值,并将它们转换成循环变量的类型。将初值e1赋予循环变量v。计算应循环的次数r。检查循环次数,若r=0或r0,则执行循环体。执行终端语句时循环变量v增值,即v=v+e3。循环次数r减1。返回步骤4,重复执行步骤4、5、6、7。从以上流程图和上述步骤可知,终端语句的作用,除了完成该语句本身的功能,还有两个作用:(1)使循环变量v增值e3,(2)使循环次数r减1。5.2.3 循环终端语句和继续语句(CONTINUE语句)l循环终端语句可以是除了GOTO、块IF、ELSE、ELSE IF、END IF、END、STOP和RETURN语句之外的任一可执行语句,如打印语句、赋值语句、输入语句等都可以作为
5、终端语句l非执行语句不能作为循环的终端语句为了使循环的起止范围清晰,使终端语句与一般执行语句所区别,用CONTINUE语句作为终端语句。继续语句CONTINUE的形式为:CONTINUE例如:READ*,A,BCONTINUEPRINT*,A,B DO 20,I=1,10,2 PRINT*,I20CONTINUE例5.1求5!INTEGER FACTFACT=1DO 10,I=1,5FACT=FACE*I10 CONTINUEPRINT*,FACTEND例5.2求1!+2!+N!READ*,NSUM=0.0FACT=1.0DO 100,I=1,N FACT=FACE*I SUM=SUM+FAC
6、T100 CONTINUEPRINT*,SUMEND例5.3一个整数I,求另一个整数J,使I和J在用8位二进制表示时互为逆序。例如I=3,用8位二进制表示为00000011,应求出J=192,其二进制数形式为11000000。即根据b7b1b0得到b0b1b7。思路:依次求出b0,b1,b2,b7,然后,将b0*27,b1*26,b7*20相加,得到J。给定I后,用函数MOD(I,2)即可求出b0,例如MOD(3,2)的值为1,得b0=1。再将I/2=I得到新的I,如此继续下去,直到求出b7为止。C OBTAIN THE BIT-REVERSE OF IPRINT*,NUMBER TO REV
7、ERSE:READ*,IJ=0DO 10,K=1,8 J=2*J+MOD(I,2)I=I/210CONTINUEPRINT*,REVERSE IS,JEND例5.4求ex=1+x+x2/2!+x3/3!+xn/n!READ*,N,XTERM=1.0E=1.0DO 10,I=1,NTERM=TERM*X/IE=E+TERM10CONTINUEPRINT*,EXP(,X,)=,EEND5.2.5 DO循环的嵌套在一个DO循环中又完整地包含另一个DO循环,称为DO循环的嵌套。DO 10,I=1,10 DO 20,J=1,5 20 CONTINUE 10 CONTINUE内循环应当完整地嵌套在外循环之
8、内,内外循环不能交叉。DO 10,I=1,10 DO 20,J=1,5 10 CONTINUE 20 CONTINUE例5.5求1!,3!,5!,7!C CALCULATES 1!,3!,5!,7!DO 20,J=1,7,2 FACT=1.0 DO 10,K=1,J FACT=FACT*K10 CONTINUE PRINT*,J,!=,FACT20 CONTINUEEND例5.6例5.4程序可以改用DO循环嵌套实现READ*,N,XE=1.0DO 10,I=1,NFACT=1.0P=1.0DO 20,J=1,I FACT=FACT*J P=P*X20CONTINUETERM=P/FACTE=E
9、+TERM10 CONTINUEPRINT*,EXP(X)=,EEND例5.7打印“九九乘法表”DO 10,I=1,9 DO 20,J=1,IK=I*JPRINT*,I,*,J,=,K20 CONTINUEPRINT*,10 CONTINUEEND例5.8百钱买百鸡问题公元五世纪末,我国古代数学家张丘建在算经中提出了“百鸡问题”:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”。意为:公鸡每只5元,母鸡3元,小鸡一元三只。100元买100只鸡。设X为公鸡数,Y为母鸡数,Z为小鸡数。根据题意:X+Y+Z=1005X+3Y+Z/3=100-15X+9Y+Z=3
10、003个未知数,2个方程式,是一个不定方程,它没有唯一解,而有多组解。对这类问题无法用解析法解,只能将所有可能的X,Y,Z值一个一个地去试,看是否满足上面两个方程式,如满足就是一组解。原始版:INTEGER X,Y,ZDO 10,X=0,100 DO 20,Y=0,100 DO 30,Z=0,100 IF(X+Y+Z).EQ.100)THEN IF(15*X+9*Y+Z.EQ.300)PRINT*,X,Y,Z END IF30 CONTINUE20 CONTINUE10CONTINUEEND改进版:INTEGER X,Y,ZDO 10,X=0,19 DO 20,Y=0,33 Z=100-X-Y
11、 IF(15*X+9*Y+Z.EQ.300)PRINT*,X,Y,Z20 CONTINUE10CONTINUEEND5.3 当型循环的实现 lDO循环用来处理循环次数确定的情况是比较方便的。但是在处理的问题中,有许多是事先无法确定循环次数的,而是只给出一个条件,满足此条件时就继续执行循环体,若不满足,则循环停止。例如统计得分并计算平均成绩的程序。事先不知道有多少人得分,只能用SCORE的值来控制循环是否继续:当SCORE=0,表示输入了一个正常的成绩,应该统计和处理;当SCORE2)初始条件为:F1=1(n=1)F2=1(n=2)解上述Fibonacci数列的思路是:从F1,F2推出下一个数F
12、。再将原来的F2作为F1,原来的F作为F2再推出新的F,如此一直推下去。1,1,2,3,5,8,13,21,34 F1=1.0 F2=1.0 PRINT*,F1 PRINT*,F2 N=3 F=F1+F210 PRINT*,F F1=F2 F2=F F=F1+F2 N=N+1 IF(N.LE.30).AND.(F.LE.1E5)GOTO 10 END5.5 几种循环形式的关系和比较(一)DO循环用来处理已确定循环次数的问题。WHILE循环和UNTIL循环既可用来处理已知循环次数的循环问题,也可用来处理不确定循环次数的问题。对事先已确定循环次数的问题,用DO循环比较方便,它能使循环变量自动增值,
13、不需用户写逻辑表达式,只需写出循环变量的初值、终值和步长即可,使用方便。(二)DO循环实质上也是一种“当型循环”,它也是“先判断条件”,后执行循环体,但这种“当型循环”的循环条件只能是“当r不等于0”。(三)几种形式的循环可以互相转换,或者说,同一个问题可用任一种循环来处理。例如求5!,即可以用DO循环处理,也可用UNTIL循环处理。(四)各种循环可以互相嵌套。但必须一个循环完整地包含在另一个循环之内。例5.22求3-100之间的全部素数。由于3以上的素数必然是奇数,而且奇数的因子只能是奇数 DO 10,N=3,100,2 J=SQRT(REAL(N)I=3 DO 20 WHILE(I.LE.
14、J).AND.(MOD(N,I).NE.0)I=I+220 CONTINUE IF(I.GT.J)PRINT*,N10 CONTINUE END例5.23验证哥德巴赫猜想。哥德巴赫提出一个不小于6的偶数必定能表示为两个素数之和。例如:6=3+3,8=3+5,10=3+7将6100之间的全部偶数表示为两个素数之和。思路:一个数N,可分解为A和B两个数,分别检查A和B是否素数,如都是,则为一组解。如A不是素数,就不必再检查B是否素数。先从A=3开始,检验A和B(B=N-A)是否素数。然后使A+2=A,再检验A,B是否素数,直到A=N/2为止。INTEGER N,A,B,WDO 10,N=6,100
15、,2 DO 20,A=3,N/2,2W=0J=SQRT(REAL(A)I=3DO 30,WHILE(I.LE.J).AND.(W.EQ.0)IF(MOD(A,I).EQ.0)THENW=1 ELSEI=I+2 END IF30CONTINUEIF(W.EQ.0)THEN B=N-A W=0 J=SQRT(REAL(B)I=3 DO 40,WHILE(I.LE.J).AND.(W.EQ.0)IF(MOD(B,I).EQ.0)THEN W=1ELSE I=I+2END IF40 CONTINUE IF(W.EQ.0)PRINT*,N,=,A,+,BEND IF20 CONTINUE10 CONTI
16、NUE END习题l求1-1/2+1/3-1/4+1/5-+1/99-1/100。l求1/(1*2)+1/(2*3)+1/(3*4)+1/(n(n+1),n=20。l用/2=(2*2/(1*3)*(4*4/(3*4)*(2*n)2/(2*n-1)*(2*n+1),求的近似值,设n=100。l用台劳多项式sinx=x/1-x3/3!+x5/5!-x7/7!+(-1)n-1*x2*n-1/(2*n-1)!求sinx的近似值。l求100200间能被3或7整除的各自然数。l找出100999之间的所有“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身,例如,153=13+53+33,故153是水仙花数。l求Sn=a+aa+aaa+的值(aaa.a为n个a)。a,n由键盘输入,a的值为1-9之间的一个数。l打印由1,2,3,4这四个数字组成的所有可能的四位数,并统计它们的个数(允许出现各位数字相同的数,如111,2222)。l1989年我国有11亿人口,如果人口增长率分别为1%,1.5%,2%,2.5%,3%,问从1989年起经过几年人口会翻一番?l输入10个学生的成绩,要求打印出成绩最高者和最低者的成绩,以及总平均成绩。