fortran程序设计第5章.ppt

上传人:小飞机 文档编号:5431297 上传时间:2023-07-06 格式:PPT 页数:46 大小:236.99KB
返回 下载 相关 举报
fortran程序设计第5章.ppt_第1页
第1页 / 共46页
fortran程序设计第5章.ppt_第2页
第2页 / 共46页
fortran程序设计第5章.ppt_第3页
第3页 / 共46页
fortran程序设计第5章.ppt_第4页
第4页 / 共46页
fortran程序设计第5章.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《fortran程序设计第5章.ppt》由会员分享,可在线阅读,更多相关《fortran程序设计第5章.ppt(46页珍藏版)》请在三一办公上搜索。

1、FORTRAN语言-FORTRAN 77结构化程序设计,第五章 循环结构的实现,重复执行一组指令称为循环操作。在程序中存在两类循环:无条件循环和有条件循环。无条件循环是无休止地执行一个程序段,而有条件循环是在满足一定条件时才执行循环。经常会遇到循环类型的问题,例如需要对全班学生求平均成绩,求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 10,5.2 用DO语句实现循环,当需要执行的循环次数为已知时用DO语句实现循环比较方便。例如,上节读5个学生的学号和成绩,要执行READ语句和PRINT语句5次。可以改用DO语句实现:DO 10,N=1,5,1READ*,NUM,GRADE 10PRINT*,NUM,GRADE,5.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,

4、e3的值,并将它们转换成循环变量的类型。将初值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语句),循环终端语句可以是除了GOTO、块IF、ELSE、ELSE IF、END IF、END、STOP和RETURN语句之外的任一可执行语句,如打印语句、赋值语句、输入语句等都

5、可以作为终端语句非执行语句不能作为循环的终端语句,为了使循环的起止范围清晰,使终端语句与一般执行语句所区别,用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

6、=SUM+FACT100 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为止。,COBTAIN THE BIT-REVERSE OF IPRINT*,NUM

7、BER TO REVERSE: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,)=,EEND,5.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*X20CONT

9、INUETERM=P/FACTE=E+TERM10CONTINUEPRINT*,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+

10、3Y+Z/3=100-15X+9Y+Z=3003个未知数,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,

11、19 DO 20,Y=0,33 Z=100-X-Y IF(15*X+9*Y+Z.EQ.300)PRINT*,X,Y,Z20 CONTINUE10CONTINUEEND,5.3 当型循环的实现,DO循环用来处理循环次数确定的情况是比较方便的。但是在处理的问题中,有许多是事先无法确定循环次数的,而是只给出一个条件,满足此条件时就继续执行循环体,若不满足,则循环停止。例如统计得分并计算平均成绩的程序。事先不知道有多少人得分,只能用SCORE的值来控制循环是否继续:当SCORE=0,表示输入了一个正常的成绩,应该统计和处理;当SCORE0,则表示数据结束,不再执行循环体,程序进行结束处理。可以用不同方

12、法实现“当型”循环。有不少计算机系统提供了DO WHILE语句,能很方便地实现当型循环,但FORTRAN 77标准并未规定有此语句,只能用块IF或逻辑IF语句来实现“当型”循环。,5.3.1 用WHILE语句实现当型循环,WHILE语句的格式:DO 标号,WHILE(逻辑表达式)循环体 标号 CONTINUE,例5.9统计若干个学生的得分并计算平均成绩,INTEGER COUNTSUM=0.0COUNT=0READ*,SCOREDO 10,WHILE(SCORE.GE.0.0)SUM=SUM+SCORECOUNT=COUNT+1READ*,SCORE10CONTINUEAVER=SUM/COU

13、NTPRINT*,COUNT=,COUNTPRINT*,AVERAGE=,AVEREND,例5.11输入两个正整数M和N,求其最大公约数,用辗转相除法来求最大公约数。例如,27和6,先用27除以6,余数为3。由于余数不等于0,再将6作为被除数,3作为除数,再求余数,此时余数为0,则除数3就是最大公约数。,INTEGER M,N,R READ*,M,N IF(M.LT.N)THEN T=M M=N N=T END IF R=MOD(M,N)DO 10,WHILE(R.NE.0)M=N N=R R=MOD(M,N)10 CONTINUE PRINT*,THE GREATEST COMMON DIV

14、ISOR IS,N END,例5.12判断一个数N是否是素数,把N作为被除数,将2INT(SQRT(N)作为除数,若都除不尽,N是素数,否则不是。READ*,NJ=SQRT(REAL(N)I=2DO 10,WHILE(I.LE.J).AND.(MOD(N,I).NE.0)I=I+110CONTINUEIF(I.GT.J)THEN PRINT*,N,IS A PRIME NUMBER.ELSE PRINT*,N,IS NOT A PRIME NUMBER.END IFEND,5.3.2 用块IF和GOTO语句实现当型循环,用块IF和GOTO语句来代替WHILE语句实现当型循环。即用GOTO语句实

15、现“返回”以形成循环,用块IF语句实现“条件判断”以决定是否继续执行循环。这种循环的形式可写为:标号S1 IF(逻辑表达式)THEN 块1 GOTO S1 END IF,例5.13用块IF和GOTO语句实现例5.9,INTEGER COUNTSUM=0.0COUNT=0READ*,SCORE10IF(SCORE.GE.0.0)THEN SUM=SUM+SCORE COUNT=COUNT+1 READ*,SCORE GOTO 10END IFAVER=SUM/COUNTPRINT*,COUNT=,COUNTPRINT*,AVERAGE=,AVEREND,例5.14用块IF和GOTO语句实现判断N

16、是否是素数,READ*,NJ=SQRT(REAL(N)I=210IF(I.LE.J).AND.(MOD(N,I).NE.0)THEN I=I+1 GOTO 10END IFIF(I.GT.J)THEN PRINT*,N,IS A PRIME NUMBER.ELSE PRINT*,N,IS NOT A PRIME NUMBER.END IFEND,例5.15用公式2/6=1/12+1/22+1/32+1/N2求的近似值。N由键盘输入,READ*,NSUM=0.0I=110IF(I.LE.N)THEN TERM=1.0/(I*I)SUM=SUM+TERM I=I+1 GOTO 10END IFPI

17、=SQRT(6.0*SUM)PRINT*,PI=,PIEND,5.4 直到型循环的实现,在FORTRAN中实现直到型的方法有2:用UNTIL语句用逻辑IF语句,5.4.1 用UNTIL语句实现直到型循环,格式:DO S1,UNTIL(条件)循环体 标号S1 CONTINUE注意:UNTIL(条件)虽然写在循环的第一个语句,但它却在执行终端语句时进行判断条件的。,例5.17求5!,T=1.0I=2DO 10,UNTIL(I.GT.5)T=T*II=I+110 CONTINUEPRINT*,TEND,例5.18求20002500年之间的所有闰年。若能被4整除,不能被100整除,则输出 是闰年。若能

18、被100整除,又能被400整除,输出是闰年,INTEGER YEAR YEAR=2000 DO 100,UNTIL(YEAR.GT.2500)IF(MOD(YEAR,4).EQ.0)THENIF(MOD(YEAR,100).NE.0)THENPRINT*,YEAR IS A LEAP YEARELSE IF(MOD(YEAR,400).EQ.0)THENPRINT*,YEAR,IS A LEAP YEARELSEPRINT*,YEAR,IS NOT A LEAP YEAREND IF ELSEPRINT*,YEAR,IS NOT A LEAP YEAR END IF Y=Y+1100 CONT

19、INUE END,5.4.2 用逻辑IF语句实现直到型循环,若不能用UNTIL语句,则可以用逻辑IF语句实现直到型循环。其形式可以表示为:标号S1 循环体IF(逻辑表达式)GOTO S1,例5.19求1-1/2+1/3-1/4+1/99-1/100,INTEGER SIGNSUM=1.0DENO=2.0SIGN=110SIGN=(-1)*SIGNTERM=SIGN/DENOSUM=SUM+TERMDENO=DENO+1IF(DENO.LE.100.0)GOTO 10PRINT*,SUMEND,例5.20判素数,INTEGER WREAD*,NW=0I=2J=SQRT(REAL(N)10R=MO

20、D(N,I)IF(R.EQ.0)THEN W=1ELSE I=I+1END IFIF(I.GT.J).OR.(W.NE.0)THENELSE GOTO 10END IFIF(W.EQ.0)THEN PRINT*,N,IS A PRIME NUMBER.ELSE PRINT*,N,IS NOT A PRIME NUMBER.END IFEND,例5.21Fibonacci数列问题,问题:某人第一个月有一对兔子,假定到第三个月时这对兔子会产下一对小兔子。以后每月都生一对小兔子。而小兔子生下后到第三个月又会生一对小兔子。以此规律繁殖。显然,第一个月,第二个月时只有一对兔子,第三个月共有两对(生了一对

21、),第四个月有3对(老的再生下一对),第五个月有5对(老的已生2对,小的生1对),如此繁殖下去。归纳数列的规律:它前两个数为1,1,从第三个数开始每个数是其前面两个数之和,即1,1,2,3,5,8,13,21,34,。请编程打印出此数列的前面若干个数,使每一个数都不超过100000,如果到第30个数仍未超过10万,则打印30个数即可。,递推关系式为:Fn=Fn-1+Fn-2(n2)初始条件为:F1=1(n=1)F2=1(n=2)解上述Fibonacci数列的思路是:从F1,F2推出下一个数F。再将原来的F2作为F1,原来的F作为F2再推出新的F,如此一直推下去。,1,1,2,3,5,8,13,

22、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 END,5.5 几种循环形式的关系和比较,(一)DO循环用来处理已确定循环次数的问题。WHILE循环和UNTIL循环既可用来处理已知循环次数的循环问题,也可用来处理不确定循环次数的问题。对事先已确定循环次数的问题,用DO循环比较方便,它能使循环变量自动增值,不需用户写逻辑表达式,只需写出循环变量的初值、终值和步长即可,使用方便。(二)DO循环实质上也是一

23、种“当型循环”,它也是“先判断条件”,后执行循环体,但这种“当型循环”的循环条件只能是“当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.J).AND.(MOD(N,I).NE.0)I=I+220 CONTINUE IF(I.GT.J

24、)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,2 DO 20,A=3,N/2,2W=0J=SQRT(REAL(A)I=3DO 30,W

25、HILE(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 CONTINUE END,习题,求1-1/2+1/3-1/4+1/5-+1/99-1/100。求1/

26、(1*2)+1/(2*3)+1/(3*4)+1/(n(n+1),n=20。用/2=(2*2/(1*3)*(4*4/(3*4)*(2*n)2/(2*n-1)*(2*n+1),求的近似值,设n=100。用台劳多项式sinx=x/1-x3/3!+x5/5!-x7/7!+(-1)n-1*x2*n-1/(2*n-1)!求sinx的近似值。求100200间能被3或7整除的各自然数。找出100999之间的所有“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身,例如,153=13+53+33,故153是水仙花数。求Sn=a+aa+aaa+的值(aaa.a为n个a)。a,n由键盘输入,a的值为1-9之间的一个数。打印由1,2,3,4这四个数字组成的所有可能的四位数,并统计它们的个数(允许出现各位数字相同的数,如111,2222)。1989年我国有11亿人口,如果人口增长率分别为1%,1.5%,2%,2.5%,3%,问从1989年起经过几年人口会翻一番?输入10个学生的成绩,要求打印出成绩最高者和最低者的成绩,以及总平均成绩。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号