条件循环
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语句被执行,循环终止,否则循环将继续进行。
例:do;if((input.eq.'n').or.(input.eq.'y')) exit
write(*,'(a)') 'Enter y or n:';read(*,'(a)') input
end do
例:一个猜数游戏。用随机数产生器产生1-10之间的一个整数,你猜它,如果猜得太大或太小都会提示,猜对了结束。[e_321_01.f90]
例:求级数 的前n项和,但当某项绝对值≤10-5时,虽未满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(逻辑表达式) 或
无 (用块中的EXIT和CYCLE语句进行实际的控制)
2) 终止语句的形式是:
END DO[构造名] 或
[标号] CONTINUE 或
[标号] 允许的执行语句
【作业】
[3.1] 用不带循环控制变量的DO构造求下列式(当m≥1000时停止):
(1)
(2)
(3)
[3.2] 设 ,编程求f(x)的前若干项之和,当相邻两项差的绝对值小于10-6即可。
[3.3] 用牛顿迭代法求方程 在x=0附近的根,精度满足 时停止迭代,并规定最多迭代50次。牛顿迭代公式为 。