条件循环

3.2.1 无循环变量的DO构造

a)    一般形式

这种DO构造形式非常简单,一般形式为:

[构造名:] DO

END DO

不带循环控制变量的DO构造控制机制为:进入DO构造体后,从DO语句下面第一句执行起顺次执行到END DO前的最后一句,再返上来从DO语句下面第一句执行起,重复执行整个DO块。如此反复执行DO块,其间如遇到EXIT语句,就停止执行DO块,退出循环,转向执行END DO下面的语句。对于不带控制变量的DO构造,DO块中必须有EXIT语句,使它停止循环,否则循环将无休无止地一直进行下去,形成死循环。

DO构造也可在自身中再嵌DO构造,例如:

FIRST: DO

1的第一部分

SECOND:    DO

2

END DO SECOND

1的第二部分

END DO FIRST

b)    EXIT语句

许多实际问题中无法预先给定循环次数,而是只给出一个条件,满足此条件时就继续执行循环体,否则退出循环,故有条件循环时循环次数不是固定的。除了可以用GOTO语句跳出循环外(非结构化方法)F90还给出了其它用于条件循环方式的语句。

EXIT语句的作用是停止循环,使控制退出循环结构,因此又称出口语句。它的一般形式是:EXIT [DO构造名]。执行EXIT语句,其功能是导致循环终止。如果语句引用了DO构造名,则它属于该构造,否则属于它所出现的最内层DO构造。对于多层嵌套的DO构造,尤为需要指明是从哪一个构造名的DO构造中退出。如当EXIT指明从第三层结构退出,则第三层与第三层内各层嵌套的DO构造都将被停止执行。

单独使用将导致无条件地终止循环,没有实用意义。为了控制DO结构在满足某种条件时停止循环,通常将EXIT语句与IF语句结合使用,即在DO构造内使用:IF(逻辑表达式) EXIT。当逻辑表达式为真时,EXIT语句被执行,循环终止,否则循环将继续进行。

例:doif((input.eq.'n').or.(input.eq.'y')) exit

write(*,'(a)') 'Enter y or n:'read(*,'(a)') input

end do

例:一个猜数游戏。用随机数产生器产生110之间的一个整数,你猜它,如果猜得太大或太小都会提示,猜对了结束。[e_321_01.f90]

例:求级数的前n项和,但当某项绝对值≤105时,虽未满n项,也因满足精度而不再加入下一项。[e_321_02.f90]

a)    CYCLE语句

CYCLE语句的一般形式为:CYCLE [DO构造名]CYCLE语句的功能是在循环中跳过它下面那部分的DO块,重新返回到块的第一个语句开始执行。运用CYCLE语句,可以在执行循环中某一次迭代时不执行下面的部分语句,使DO结构更为灵活。

CYCLE语句与EXIT语句一样属于特定的DO构造。如果语句引用了DO构造名,则它属于该构造,否则属于它所出现的最内层DO构造。[e_321_03.f90]

3.2.2 DO WHILE语句

F90增强的功能中,增加了DO WHILE语句以支持当型循环。因此,DO构造不仅仅能完成循环次数已知的循环,而且能够完成此数未知的循环。它的一般形式为:[构造名] DO WHILE (逻辑表达式)DO WHILE语句的规则和块IF语句所需满足的的块规则类似。

例:上面的例子中用EXIT语句退出循环等价于

do while ((input.ne.'n').and.(input.ne.'y'))

write(*,'(a)') 'Enter y or n:'read(*,'(a)') input

end do

例:对一个大于或等于3的正整数,判断它是不是一个素数。[e_322_01.f90][e_322_02.f90]

例:求两个整数的最大公约数。[e_322_03.f90][e_322_04.f90]

例:求正弦函数的近似值。[e_322_05.f90]

3.2.3 DO 构造的一般形式

由以上的各种DO循环可归纳为其下的DO构造一般形式:

[构造名:] DO [标号][循环控制]

终止语句

1)    循环控制的形式是:

[,] 循环变量=下界,上界[,增量]

[,] WHILE(逻辑表达式)

(用块中的EXITCYCLE语句进行实际的控制)

2)    终止语句的形式是:

END DO[构造名]

[标号] CONTINUE

[标号] 允许的执行语句

【作业】

[3.1] 用不带循环控制变量的DO构造求下列式(当m1000时停止):

(1)

(2)

(3)

[3.2] ,编程求f(x)的前若干项之和,当相邻两项差的绝对值小于106即可。

[3.3] 用牛顿迭代法求方程x=0附近的根,精度满足时停止迭代,并规定最多迭代50次。牛顿迭代公式为