fortran程序设计..第5章.ppt_第1页
fortran程序设计..第5章.ppt_第2页
fortran程序设计..第5章.ppt_第3页
fortran程序设计..第5章.ppt_第4页
fortran程序设计..第5章.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、FORTRAN语言-FORTRAN 77结构化程序设计,第五章 循环结构的实现,重复执行一组指令称为循环操作。在程序中存在两类循环:无条件循环和有条件循环。无条件循环是无休止地执行一个程序段,而有条件循环是在满足一定条件时才执行循环。 经常会遇到循环类型的问题,例如需要对全班学生求平均成绩,求n的阶乘,求 n个数的和等都需要用到循环处理的方法。,5.1 用GOTO语句实现循环,GOTO语句的形式: GOTO 例如:“GOTO 10”表示流程转去标号为10的语句行继续执行。由于GOTO语句破坏了语句顺序执行的正常状态,不符合结构化程序设计原则,因此一般不提倡使用GOTO语句。只有在一个基本结构内

2、部可以使用GOTO语句。利用GOTO语句可以实现循环处理。,例:读入学生的学号和成绩并且打印,无条件循环: 10READ *, NUM, GRADE PRINT *, NUM, GRADE GOTO 10 有条件循环: N=1 10READ *, NUM, GRADE PRINT *, NUM, GRADE N=N+1 IF (N .LE. 5) GOTO 10,5.2 用DO语句实现循环,当需要执行的循环次数为已知时用DO语句实现循环比较方便。例如,上节读5个学生的学号和成绩,要执行READ语句和PRINT语句5次。可以改用DO语句实现: DO 10, N=1, 5, 1 READ *, N

3、UM, GRADE 10PRINT *, NUM, GRADE,5.2.1 循环语句(DO语句)和循环次数的计算,DO循环由一个DO语句和循环体组成: DO 10, I=1, 10, 1(循环语句) J=I*I(循环体) 10 PRINT *, I, J DO语句的一般形式为: 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, 5

4、0.0/2.0, 0.5 DO 200, M=1.5, 12.5, 1.5,5.2.2 循环执行过程,循环执行过程执行以下步骤: 计算表达式e1,e2,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语句),循环

5、终端语句可以是除了GOTO、块IF、ELSE、ELSE IF、END IF、END、STOP和RETURN语句之外的任一可执行语句,如打印语句、赋值语句、输入语句等都可以作为终端语句 非执行语句不能作为循环的终端语句,为了使循环的起止范围清晰,使终端语句与一般执行语句所区别,用CONTINUE语句作为终端语句。 继续语句CONTINUE的形式为: CONTINUE 例如: READ *, A, B CONTINUE PRINT *, A, B DO 20, I=1, 10, 2 PRINT *, I 20CONTINUE,例5.1求5!,INTEGER FACT FACT=1 DO 10, I

6、=1, 5 FACT=FACE*I 10 CONTINUE PRINT *, FACT END,例5.2求1!+2!+N!,READ *, N SUM=0.0 FACT=1.0 DO 100, I=1, N FACT=FACE*I SUM=SUM+FACT 100 CONTINUE PRINT *, SUM END,例5.3一个整数I,求另一个整数J,使I和J在用8位二进制表示时互为逆序。例如I=3,用8位二进制表示为00000011,应求出J=192,其二进制数形式为11000000。即根据b7b1b0得到b0b1b7。,思路: 依次求出b0,b1,b2,b7,然后,将b0*27, b1*2

7、6, , b7*20相加,得到J。 给定I后,用函数MOD(I, 2)即可求出b0,例如MOD(3, 2)的值为1,得b0=1。再将I/2=I得到新的I,如此继续下去,直到求出b7为止。,COBTAIN THE BIT-REVERSE OF I PRINT *, NUMBER TO REVERSE: READ *, I J=0 DO 10, K=1, 8 J=2*J+MOD(I, 2) I=I/2 10CONTINUE PRINT *, REVERSE IS, J END,例5.4求ex=1+x+x2/2!+x3/3!+xn/n!,READ *, N, X TERM=1.0 E=1.0 DO

8、10, I=1, N TERM=TERM*X/I E=E+TERM 10CONTINUE PRINT *, EXP(, X, )=, E END,5.2.5 DO循环的嵌套,在一个DO循环中又完整地包含另一个DO循环,称为DO循环的嵌套。 DO 10, I=1, 10 DO 20, J=1, 5 20 CONTINUE 10 CONTINUE 内循环应当完整地嵌套在外循环之内,内外循环不能交叉。 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

9、 20, J=1, 7, 2 FACT=1.0 DO 10, K=1, J FACT=FACT*K 10 CONTINUE PRINT *, J, !=, FACT 20 CONTINUE END,例5.6例5.4程序可以改用DO循环嵌套实现,READ *, N, X E=1.0 DO 10, I=1, N FACT=1.0 P=1.0 DO 20, J=1, I FACT=FACT*J P=P*X 20CONTINUE TERM=P/FACT E=E+TERM 10CONTINUE PRINT *, EXP(X)=, E END,例5.7打印“九九乘法表”,DO 10, I=1, 9 DO

10、20, J=1, I K=I*J PRINT *, I, *, J, =, K 20 CONTINUE PRINT *, 10 CONTINUE END,例5.8百钱买百鸡问题,公元五世纪末,我国古代数学家张丘建在算经中提出了“百鸡问题”:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”。意为:公鸡每只5元,母鸡3元,小鸡一元三只。100元买100只鸡。 设X为公鸡数,Y为母鸡数,Z为小鸡数。根据题意: X+Y+Z=100 5X+3Y+Z/3=100 - 15X+9Y+Z=300 3个未知数,2个方程式,是一个不定方程,它没有唯一解,而有多组解。对这类问题

11、无法用解析法解,只能将所有可能的X,Y,Z值一个一个地去试,看是否满足上面两个方程式,如满足就是一组解。,原始版:,INTEGER X, Y, Z DO 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 IF 30 CONTINUE 20 CONTINUE 10CONTINUE END,改进版:,INTEGER X, Y, Z DO 10, X=0, 19 DO 20, Y=0, 33 Z=100-X-Y IF

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

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

14、/COUNT PRINT *, COUNT=, COUNT PRINT *, AVERAGE=, AVER END,例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

15、 PRINT *, THE GREATEST COMMON DIVISOR IS , N END,例5.12判断一个数N是否是素数,把N作为被除数,将2INT(SQRT(N)作为除数,若都除不尽,N是素数,否则不是。 READ *, N J=SQRT(REAL(N) I=2 DO 10, WHILE (I .LE. J) .AND. (MOD(N, I) .NE. 0) I=I+1 10CONTINUE IF (I .GT. J) THEN PRINT *, N, IS A PRIME NUMBER. ELSE PRINT *, N, IS NOT A PRIME NUMBER. END IF

16、 END,5.3.2 用块IF和GOTO语句实现当型循环,用块IF和GOTO语句来代替WHILE语句实现当型循环。即用GOTO语句实现“返回”以形成循环,用块IF语句实现“条件判断”以决定是否继续执行循环。这种循环的形式可写为: 标号S1 IF (逻辑表达式) THEN 块1 GOTO S1 END IF,例5.13用块IF和GOTO语句实现例5.9,INTEGER COUNT SUM=0.0 COUNT=0 READ *, SCORE 10IF (SCORE .GE. 0.0) THEN SUM=SUM+SCORE COUNT=COUNT+1 READ *, SCORE GOTO 10 EN

17、D IF AVER=SUM/COUNT PRINT *, COUNT=, COUNT PRINT *, AVERAGE=, AVER END,例5.14用块IF和GOTO语句实现判断N是否是素数,READ *, N J=SQRT(REAL(N) I=2 10IF (I .LE. J) .AND. (MOD(N, I) .NE. 0) THEN I=I+1 GOTO 10 END IF IF (I .GT. J) THEN PRINT *, N, IS A PRIME NUMBER. ELSE PRINT *, N, IS NOT A PRIME NUMBER. END IF END,例5.15

18、用公式2/6=1/12+1/22+1/32+1/N2求的近似值。N由键盘输入,READ *, N SUM=0.0 I=1 10IF (I .LE. N) THEN TERM=1.0/(I*I) SUM=SUM+TERM I=I+1 GOTO 10 END IF PI=SQRT(6.0*SUM) PRINT *, PI=, PI END,5.4 直到型循环的实现,在FORTRAN中实现直到型的方法有2: 用UNTIL语句 用逻辑IF语句,5.4.1 用UNTIL语句实现直到型循环,格式: DO S1,UNTIL (条件) 循环体 标号S1 CONTINUE 注意:UNTIL (条件)虽然写在循环

19、的第一个语句,但它却在执行终端语句时进行判断条件的。,例5.17求5!,T=1.0 I=2 DO 10, UNTIL (I .GT. 5) T=T*I I=I+1 10 CONTINUE PRINT *, T END,例5.18求20002500年之间的所有闰年。若能被4整除,不能被100整除,则输出 是闰年。若能被100整除,又能被400整除,输出是闰年,INTEGER YEAR YEAR=2000 DO 100, UNTIL (YEAR .GT. 2500) IF (MOD(YEAR, 4) .EQ. 0) THEN IF (MOD(YEAR, 100) .NE. 0) THEN PRIN

20、T *, YEAR IS A LEAP YEAR ELSE IF (MOD(YEAR, 400) .EQ. 0) THEN PRINT *, YEAR, IS A LEAP YEAR ELSE PRINT *, YEAR, IS NOT A LEAP YEAR END IF ELSE PRINT *, YEAR, IS NOT A LEAP YEAR END IF Y=Y+1 100 CONTINUE END,5.4.2 用逻辑IF语句实现直到型循环,若不能用UNTIL语句,则可以用逻辑IF语句实现直到型循环。其形式可以表示为: 标号S1 循环体 IF (逻辑表达式) GOTO S1,例5.1

21、9求1-1/2+1/3-1/4+1/99-1/100,INTEGER SIGN SUM=1.0 DENO=2.0 SIGN=1 10SIGN=(-1)*SIGN TERM=SIGN/DENO SUM=SUM+TERM DENO=DENO+1 IF (DENO .LE. 100.0) GOTO 10 PRINT *, SUM END,例5.20判素数,INTEGER W READ *, N W=0 I=2 J=SQRT(REAL(N) 10R=MOD(N, I) IF (R .EQ. 0) THEN W=1 ELSE I=I+1 END IF IF (I .GT. J) .OR. (W .NE.

22、 0) THEN ELSE GOTO 10 END IF IF (W .EQ. 0) THEN PRINT *, N, IS A PRIME NUMBER. ELSE PRINT *, N, IS NOT A PRIME NUMBER. END IF END,例5.21Fibonacci数列问题,问题:某人第一个月有一对兔子,假定到第三个月时这对兔子会产下一对小兔子。以后每月都生一对小兔子。而小兔子生下后到第三个月又会生一对小兔子。以此规律繁殖。显然,第一个月,第二个月时只有一对兔子,第三个月共有两对(生了一对),第四个月有3对(老的再生下一对),第五个月有5对(老的已生2对,小的生1对),如

23、此繁殖下去。 归纳数列的规律:它前两个数为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,21,34,F1=1.0 F2=1.0 PRINT *, F1

24、PRINT *, F2 N=3 F=F1+F2 10 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循环实质上也是一种“当型循环”,它也是“先判断条

25、件”,后执行循环体,但这种“当型循环”的循环条件只能是“当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+2 20 CONTINUE IF (I .GT. J) PRINT *, N 10 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, W DO 10, N=6, 100, 2 DO 20, A=3, N/2, 2 W

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论