当前位置:首页 >> 理学 >>

第四章 循环结构程序设计(大学FORTRAN程序课件)


第四章 循环结构程序设计
DO语句 DO WHILE语句 循环的嵌套 循环结构的程序设计方法

循环结构
循环结构的基本思想是重复,即利用计 算机运算速度快以及能进行逻辑控制的特 性,重复执行某些语句,以完成大量的计 算要求。

4.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

4.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

说明
(1)当循环变量变化的步长为1时,表达式e3可以 省略。即DO K=1,10,1与DO K=1,10等价。 (2)如果循环变量和循环参数表达式的类型不一致, 其处理办法与赋值语句一样,先将表达式的最 后结果转换成循环变量的类型,然后再进行处 理。 (3) DO循环的执行次数 r=MAX(INT((e2-e1+e3)/e3) ,0)。


INTEGER X DO X=1.2,5.6,2.4 PRINT *,X END DO END 程序执行后的输出结果为: 1 3 5 如果循环变量的步长为0,程序在编译和连接时 都没有问题,但在执行过程中求循环执行次数时 将出现语法错,即进行了除零运算。这是应当避 免的。

计算e1、e2、e3的值 e1→i

4

. . DO 1 循 环 2 执 行 过 程

计算循环次数r
r=0? Y

N
执行循环体 i+e3→i r-1→r END DO下面的语句

说明:

(1) 循环体指的是DO语句与END DO语句之

间的语句,因此循环体并不包括DO语 句,执行程序时DO语句也只执行一次。 如果循环参数表达式e1、e2、e3中含 有变量,那么即便在循环体中改变变量 的值,循环参数并不改变。 (2) 在循环体内给循环变量赋值,是不允许 的。

分析下面的程序:
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 =

(3) 退出循环后循环变量的值与最后一次循 环时循环变量的值不同,前者比后者多 一个步长。例如: DO K=1,10,2 L=K END DO PRINT *,K,L END 程序的执行结果为: 11 9

例4.1 求

y ? 1? x ?

x

2

?

x

3

?? ?

x

n

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

例4.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

例4.3 Fibonacci数列定义如下: F1=1 F2=1 Fn=Fn-1+Fn-2 (n>2) 求Fibonacci数列的前30项。

设待求项为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

例4.4 所谓“水仙花数”是指一个三位整数,其各位数字 立方和等于该数本身。例如,153就是一个水仙花数。输 出全部“水仙花数”。

在[100,999]范围内,对所有整数逐一验证 是否符合的条件,输出符合条件的数。这 种方法称为穷举法。

4.1.3 与循环有关的控制语句
1.EXIT语句

在循环体内使用EXIT语句,将迫使所在循 环立即终止,即跳出所在循环体,而继续 执行循环结构后面的语句。通常将EXIT语 句与IF语句配合使用,即在循环体中使用 语句: IF (e) EXIT

例4.6 求两个整数a与b的最大 公约数和最小公倍数。
分析:根据例1.7介绍的算法,找出a与b中 较小的一个,则最大公约数必在1与最小整 数的范围内。使用DO语句,循环变量i从较 小整数变化到1。一旦循环控制变量i同时 整除a与b,则i就是最大公约数,然后使用 EXIT语句强制退出循环。求出最大公约数 后,直接应用最小公倍数和最大公约数之 间的关系求出最小公倍数。

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

2. CYCLE语句
CYCLE语句用来结束本次循环,即跳过循 环体中尚未执行的语句。在循环结构中, CYCLE语句将使控制直接转向循环条件 测试部分,从而决定是否继续执行循环。 CYCLE语句和EXIT语句的区别在于: CYCLE语句只结束本次循环,而不是终 止整个循环的执行。EXIT语句则是结束 所在循环,跳出所在循环体。

例4.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

4.2 用DO WHILE语句实现循环
对于循环次数确定的循环问题使用DO循环 是比较方便的。但是,有些循环问题事先 是无法确定循环次数的,只能通过给定的 条件来决定是否继续循环。这时可以使用 DO WHILE语句来实现循环。

4.2.1 DO WHILE循环的一般格式
DO WHILE循环一般格式如下: DO WHILE (逻辑表达式) 循环体 END DO 其中逻辑表达式表示循环的条件,它要用括号括 起来。循环体是在循环过程中被重复执行的语 句组。END DO是循环终端语句,DO WHILE语 句和END DO语句要配合使用。

例:输出所输入的全部正数, 直到输入负数或零,程序结束。
REAL :: P=1.0 DO WHILE (P>0) PRINT *,P READ *,P END DO END

DO WHILE循环的执行过程
满足循 环条件?

执行循环体

END DO下面的语句

例4.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

4.3 几种循环组织方式的比较
实现循环结构的三种语句,它们各具特点。 一般而言,事先能确定循环次数的循环问 题用DO循环,而事先不能确定循环次数的 循环问题用DO WHILE循环。但这并不是 绝对的,很多情况下它们是可以相互代替 的。

例4.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

程序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

程序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

4.4 循环的嵌套
如果一个循环结构的循环体又包括一个循 环结构,就称为循环的嵌套,或称为多重 循环结构。 在设计多重循环时,要特别注意内、外循 环之间的关系,以及各语句放置的位置, 不要搞错。

例4.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

例4.13 已知 F

ij

?

Xi ?Yj
2

2

Si ?

?F
j ?1

10

ij

M ?

?S
i ?1

5

i

X i ? 2 , 4 , 6 ,8 ,10

计算M的值。

Y j ? 0 . 1, 0 . 2 , 0 . 3 , ? ? ,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得到。

4.5 程序举例

例4.15 已知某球从100m高度自由落下,落地后 反复弹起。每次弹起的高度都是上次高度的一半。 求此球第10次落地后反弹起的高度和球所经过的 路程
分析:用变量H来表示下落的高度,变量R来表示反弹的 高度,变量S来表示小球经过的路程,则H的初值为100, 反弹高度R=H/2。弹起一次小球要经过下降和上升两个 阶段,小球经过的路程为H+R,这个过程如图所示。
100

50

25

0

INTEGER N REAL H,S,R H=100 S=0 DO N=1,10 R=H/2 S=S+H+R H=R ENDDO PRINT *,”H=”,H,”S=”,S END 运行结果如下: H= 9.765625E-02S=

299.707000

例4.16 用牛顿迭代法求方程 f(x)=2x3-4x2+3x-7=0在x=2.5附近的实根, 直到满足|xn-xn-1|≤10-6 为止。
牛顿迭代公式为:
x n ? x n ?1 ? f ( x n ?1 ) f ?( x n ?1 ) ( n ? 1, 2 , ? )

关于迭代初值x0的选取问题,理论上可以证明, 只要选取满足条件f(x0)f’’(x0)>0的初始值x0,就 可保证牛顿迭代法收敛。当然迭代初值不同,迭 代的次数也就不同。

例4-17 求f(x)在[a,b]上的定积分。
分析:求一个函数f(x)在[a,b]上的定积分,其几 何意义就是求曲线y=f(x)与直线x=a,x=b, y=0所围成的图形的面积。为了求得图形面积, 先将区间[a,b]分成n等分,每个区间的宽度为 h=(b-a)/n,对应地将图形分成n等分,每个小 部分近似一个小曲边梯形。近似求出每个小曲 边梯形面积,然后将n个小曲边梯形的面积加 起来,就得到总面积,即定积分的近似值。n 越大,近似程度越高。这就是函数的数值积分 方法。

近似求每个小曲边梯形的面积的常用方法

(1)用小矩形代替小曲边梯形,求出各个小矩形面积, 然后累加。此种方法称为矩形法。 (2)用小梯形代替小曲边梯形,此种方法称为梯形法。 (3)用抛物线代替该区间的f(x),然后求出抛物线与 x=a+(i-1)h,x=a+ih,y=0围成的小曲边梯形面积,此 种方法称为辛普生法。

以梯形法为例:
第一个小梯形的面积为: s
1

?

f (a ? h) ? f (a ) 2

?h

s2 第二个小梯形的面积为: ?

f (a ? 2h) ? f (a ? h) 2

?h

第i个小梯形的面积为:s

i

?

f ( a ? ih ) ? f ( a ? ( i ? 1) h ) 2

?h

…… 第n个小梯形的面积为: s ? f ( b ) ?
n

f ( a ? ( n ? 1) h ) 2

?h

本质上讲这是一个累加问题。

例1.18 利用蒙特卡洛法(Monte-Carlo method)求π的近似值。
分析:蒙特卡洛法是一种通过模拟随机事件的发生进行 统计实验的技术。它往往涉及到大量运算,用它进行问 题求解不使用计算机是不可思议的。 蒙特卡洛法可用来求定积分,其步骤如下: (1)先用一个长为b-a、高为c的矩形,把s围在内。 (2)产生n个均匀分布在矩形框内的随机点(x,y),即x在 [a,b]区间均匀分布,y在[0,c]区间均匀分布。 (3)统计落入欲求面积内的随机点的个数m。 m (4)由n ? c ? ( b - a ) 计算所求面积的近似值。其中c·(b-a) m 为矩形面积, 为落在欲求面积的范围内的概率。n愈大, n 计算愈精确。

例4.19
某些分子和分母都是两位数的真分数,分 子的个位数与分母的十位数相同,而且奇 怪的是:如果把该分数的分子的个位数和 分母的十位数同时去掉,所得结果正好等 于原分数约分后的结果。例如,试求所有 满足上述条件的真分数。

分析
我们先把条件归纳为下面四点: (1) 分子和分母原为两位数; (2) 真分数; (3) 分子的个位数与分母的十位数相同; (4) 把分子的个位数和分母的十位数同时划去, 分数值不变。 考虑到分子和分母原为两位数,可以把分子和分 母看成从10到99这90个数中每次取两个数的组 合,对每一种组合验证条件(2)、(3)、(4)。


相关文章:
更多相关标签: