第五章 fortran循环结构

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(3) 退出循环后循环变量的值与最后一次循 环时循环变量的值不同,前者比后者多 一个步长。例如: DO K=1,10,2 L=K END DO PRINT *,K,L END 程序的执行结果为: 11 9
例5.1 求
x2 x3 xn y =1+ x + + +L + 2! 3! n!
累加项F的递推式为: Fi=Fi-1*X/I 可用赋值语句F=F*X/I来实现。 READ *,X,N F=1.0 Y=1.0 DO I=1,N F=F*X/I Y=Y+F END DO PRINT *,’Y=’,Y END
第五章 循环结构程序设计
DO语句 DO WHILE语句 循环的嵌套 循环结构的程序设计方法
循环结构
循环结构的基本思想是重复,即利用计 算机运算速度快以及能进行逻辑控制的特 性,重复执行某些语句,以完成大量的计 算要求。
5.1 用DO语句实现循环
例如,当X取1,2,3,…,10时,分别计算sinx 和cosx的值。 INTEGER X DO X=1,10,1 PRINT *,X,SIN(X*1.0),COS(X*1.0) END DO END

INTEGER X DO X=1.2,5.6,2.4 PRINT *,X END DO END 程序执行后的输出结果为: 1 3 5 如果循环变量的步长为0,程序在编译和连接时 都没有问题,但在执行过程中求循环执行次数时 将出现语法错,即进行了除零运算。这是应当避 免的。
计算e1、e2、e3的值 e1→i 计算循环次数r r=0? N 执行循环体 Y
5.4 循环的嵌套
如果一个循环结构的循环体又包括一个循 环结构,就称为循环的嵌套,或称为多重 循环结构。 在设计多重循环时,要特别注意内、外循 环之间的关系,以及各语句放置的位置, 不要搞错。
例5.12 求[100,1000]以内的全部素数。 (1) 判断一个数是否素数。
(2) 利用穷举法将判断一个数是否素数的程序段,对指定范围内的 每一个数都执行一遍,即可求出某个范围内的全部素数。 LOGICAL FLAG DO M=101,1000,2 FLAG=.TRUE. I=2 J=SQRT(REAL(M)) DO WHILE(I<=J.AND.FLAG) IF (MOD(M,I)==0) FLAG=.FALSE. I=I+1 END DO IF (FLAG) THEN PRINT *,M,’ is a prime number’ END IF END DO END
对于循环次数确定的循环问题使用DO循环 是比较方便的。但是,有些循环问题事先 是无法确定循环次数的,只能通过给定的 条件来决定是否继续循环。这时可以使用 DO WHILE语句来实现循环。
5.2.1 DO WHILE循环的一般格式
DO WHILE循环一般格式如下: DO WHILE (逻辑表达式) 循环体 END DO 其中逻辑表达式表示循环的条件,它要用括号括 起来。循环体是在循环过程中被重复执行的语 句组。END DO是循环终端语句,DO WHILE语 句和END DO语句要配合使用。
程序2:用DO WHILE循环实现 IMPLICIT NONE INTEGER M,I,J READ *,M I=2 J=SQRT(REAL(M)) DO WHILE(I<=J.AND.MOD(M,I)/=0) I=I+1 END DO IF (I>J.AND.M>1) THEN PRINT *,M,’ is a prime number’ ELSE PRINT *,m,’ is not prime number’ END IF END
循 行 过 程
5
. . DO 1 环 执 2
i+e3→i r-1→r END DO下面的语句
说明:
(1) 循环体指的是DO语句与END DO语句之
间的语句,因此循环体并不包括DO语 句,执行程序时DO语句也只执行一次。 如果循环参数表达式e1、e2、e3中含 有变量,那么即便在循环体中改变变量 的值,循环参数并不改变。 (2) 在循环体内给循环变量赋值,是不允许 的。
例5.7 求1~100之间的全部奇数之和。
INTEGER :: X=0,Y=0 DO X=X+1 IF (MOD(X,2)==0) THEN CYCLE ELSE IF (X>100) THEN EXIT ELSE Y=Y+X END IF END DO PRINT *,Y END
5.2 用DO WHILE语句实现循环
例5.2 一个整数的因子(不包括该数本身)之和等 于它本身,则称该数为完数。例如6的因子有 1,2,3,且1+2+3=6,因此6是完数。输入一个整 数,判断它是否完数
根据完数的定义,先求整数的因子之和,然后判断该数 本身是否等于因子之和,若是则为完数。
INTEGER M,SUM,I READ *,M SUM=0 DO I=1,M/2 !该循环求因子之和 IF (MOD(M,I)==0) SUM=SUM+I ENDDO IF (M==SUM) THEN PRINT *,M,'是完数' ELSE PRINT *,M,'不是完数' ENDIF END
分析下面的程序:
INTEGER X,Y,Z,K X=1 Y=7 Z=2 DO K=X,Y,Z+1 X=2 Y=Y+X Z=Z*K PRINT *, K ,X,Y,Z END DO END 程序的执行结果为: 1 2 9 4 2 11 7 2 13 2 8 56

INTEGER K DO K=1,5,2 K=K+1 PRINT *,K END DO END 编译时将给出错误信息: error FOR3598: assignment to DO variable K detected between K and =
5.1.1 DO循环一般格式
DO i=e1,e2[,e3] …(循环体) END DO 其中i代表循环变量,它可以是整型或实型 变量。e1、e2、e3称为循环参数表达式, 分别表示循环变量的初值、终值和步长。 循环体是在循环过程中被重复执行的语 句组。
例 求5!
PROGRAM LOOP INTEGER P,K P=1 DO K=5,1,-1 P=P*K END DO PRINT *,P END
程序3:用DO循环和逻辑IF语句的嵌套实现。 IMPLICIT NONE INTEGER M,I,J READ *,M I=2 J=SQRT(REAL(M)) DO IF (MOD(M,I)==0.OR.I>J) EXIT I=I+1 END DO IF (I>J.AND.M>1) THEN PRINT *,M,’ is a prime number’ ELSE PRINT *,m,’ is not prime number’ END IF END
例5.13 已知 F 计算M的值。
ij
= Xi2 + Yj2
Si = ∑Fij
j =1
10
M = ∏Si
i=1
5
Xi = 2,4,6,8,10 Yj = 0.1,0.2,0.3,LL,1.0
分析:该问题要求对5个X值,10个Y值,计算出 50个F值。然后每10个F相加得到一个S值,共得 到5个S值。最后这5个S相乘,得到一个M值。可 以用一个二重循环来计算和输出各值。 每个S值是由10个F值累加得到的。累加前S要 清0。M是由5个S值累乘得到的,累乘前M应置1。 X和Y都是有规律的值,可以由循环变量I,J得到。
5.1.3 与循环有关的控制语句
1.EXIT语句
在循环体内使用EXIT语句,将迫使所在循 环立即终止,即跳出所在循环体,而继续 执行循环结构后面的语句。通常将EXIT语 句与IF语句配合使用,即在循环体中使用 语句: IF (e) EXIT
例5.6 求两个整数a与b的最大 公约数和最小公倍数。
分析:根据例1.7介绍的算法,找出a与b中 较小的一个,则最大公约数必在1与最小整 数的范围内。使用DO语句,循环变量i从较 小整数变化到1。一旦循环控制变量i同时 整除a与b,则i就是最大公约数,然后使用 EXIT语句强制退出循环。求出最大公约数 后,直接应用最小公倍数和最大公约数之 间的关系求出最小公倍数。
例:输出所输入的全部正数, 直到输入负数或零,程序结束。
REAL :: P=1.0 DO WHILE (P>0) PRINT *,P READ *,P END DO END
DO WHILE循环的执行过程
满足循 环条件?
执行循环体
பைடு நூலகம்
END DO下面的语句
例5.8 输入一个整数,输出其位数。
输入的整数存入变量N中,用变量K来统计N的位 数。程序如下: INTEGER :: N,K=0 READ *,N DO WHILE (N>0) K=K+1 N=N/10 END DO PRINT *,'K=',K END
说明
(1)当循环变量变化的步长为1时,表达式e3可以 省略。即DO K=1,10,1与DO K=1,10等价。 (2)如果循环变量和循环参数表达式的类型不一致, 其处理办法与赋值语句一样,先将表达式的最 后结果转换成循环变量的类型,然后再进行处 理。 (3) DO循环的执行次数 r=MAX(INT((e2-e1+e3)/e3) ,0)。
2. CYCLE语句
CYCLE语句用来结束本次循环,即跳过循 环体中尚未执行的语句。在循环结构中, CYCLE语句将使控制直接转向循环条件 测试部分,从而决定是否继续执行循环。 CYCLE语句和EXIT语句的区别在于: CYCLE语句只结束本次循环,而不是终 止整个循环的执行。EXIT语句则是结束 所在循环,跳出所在循环体。
5.3 几种循环组织方式的比较
实现循环结构的三种语句,它们各具特点。 一般而言,事先能确定循环次数的循环问 题用DO循环,而事先不能确定循环次数的 循环问题用DO WHILE循环。但这并不是 绝对的,很多情况下它们是可以相互代替 的。
例5.11 输入一个整数m,判断是否素数。
程序1:用DO循环实现。 IMPLICIT NONE INTEGER M,I,J READ *,M J=SQRT(REAL(M)) DO I=2,J IF (MOD(M,I)==0) EXIT END DO IF (I>J.AND.M>1) THEN PRINT *,M,’ is a prime number’ ELSE PRINT *,m,’ is not prime number’ END IF END
INTEGER A,B,GCD,LCM,T PRINT *,'请输入两个自然数' READ *,A,B IF (A>B) THEN T=A;A=B;B=T END IF DO T=A,1,-1 IF (MOD(A,T)==0.AND.MOD(B,T)==0) THEN PRINT *,'GCD=',T EXIT END IF END DO PRINT *,'LCM=',A*B/T END
设待求项为F,待求项前面的第1项为F1,待求项前面的 第2项为F2。首先根据F1和F2推出F,再将F1作为F2, F作为f1,为求下一项作准备。如此一直递推下去。具 体过程如下: 1 1 2 3 5 第一次 F2 + F1 → F ↓ ↓ 第二次 F2 + F1 → F ↓ ↓ 第三次 F2 +F1 → F
5.5 程序举例
例5.15 已知某球从100m高度自由落下,落地后 反复弹起。每次弹起的高度都是上次高度的一半。 求此球第10次落地后反弹起的高度和球所经过的 路程
分析:用变量H来表示下落的高度,变量R来表示反弹的 高度,变量S来表示小球经过的路程,则H的初值为100, 反弹高度R=H/2。弹起一次小球要经过下降和上升两个 阶段,小球经过的路程为H+R,这个过程如图所示。
例5.3 Fibonacci数列定义如下: F1=1 F2=1 Fn=Fn-1+Fn-2 (n>2) 求Fibonacci数列的前30项。
例5.4 所谓“水仙花数”是指一个三位整数,其各位数字 立方和等于该数本身。例如,153就是一个水仙花数。输 出全部“水仙花数”。
在[100,999]范围内,对所有整数逐一验证 是否符合的条件,输出符合条件的数。这 种方法称为穷举法。
相关文档
最新文档