
Fortran95第11章 基本计算(三)循环控制结构.docx
14页第11章 基本计算(三)循环控制结构上章讨论的控制结构的特点是通过判别条件来对结构内的块进行选择,所对应的算法结构,最简单的例子,就是解一元二次方程,在输入方程所以的参数值之后,需要首先计算一个判别式,然后根据判别式的值,再选择使用哪个公式,也就是计算的途径,才能够给出最终的解在本章所讨论的控制结构的特点则是针对结构内的块进行多次的重复运算,每完成一次运算,都判别一下是否需要把此次运算结果作为输入,再进行一次运算这种控制结构所对应的算法结构,一个最简单的例子,就是求级数的部分和我们知道对于具有通项表达式的级数,求它的部分和的每一项,总是需要进行同样的运算过程,如果使用按照序列形式排列的程序结构,那么需要计算多少项,就需要写下多少条语句,把它们顺序排列下来,才能做到程序走一遍即完成计算这样的算法设计显然是没有利用运算过程里所表现的循环结构,如果使用一种控制结构与循环过程对应,让程序的运行能够重复表示通项公式的表达式计算,就能够用一个表达式代替所有项的表达式,显然更加合理例 11-1】 设有一个级数: 31/nix如果要求级数在 N=K 时的值,如果一定要使用序列结构的程序,那么在程序当中肯定会出现如下 K 个表达式顺序排列的情形:…I=1SUM=1/I**3I=2SUM=SUM+1/I**3I=3SUM=SUM+1/I**3…I=KSUM=SUM+1/I**3由于这 K 个表达式是一样的,因此如果使用如下的一个控制结构,只需要使用一个表达式赋值语句,就可以表示整个循环运算过程:…SUM=0.0DO I=1,KSUM= SUM+1/I**3END DO上面的控制结构,就是本章所要讨论的 DO 结构。
实际上这是一种基本的计算过程,为很多重要算法的实现提供了基础FORTRAN 语言提供用来进行循环控制的主要结构就是 DO 结构,因此本章主要讨论的就是 DO 结构最后还会简略的讨论有关分支转移的实现问题,尽管它们不属于循环控制,但是由于在现代结构性编程风格的要求下,这种分支转移是一种过时的方式,因此简略地附加在本章后面11.1 DO 结构DO 结构包含 0 个或多个语句或结构,它们在 DO 结构的其他部分的控制下进行重复运行这些被重复运算的语句或结构构成一个循环,DO 结构控制了该循环的运行次数DO 结构的运行分为如下步骤:● 如果 DO 结构由一个 DO 变量控制,那么决定循环次数的该表达式的值首先需要计算出来;● 然后决定循环部分是否运行;● 如果运行循环部分,则完成循环后,更新 DO 变量,再进入第二个步骤;如果不需要运行循环部分,则退出该 DO 结构,进入程序的后续部分其中对于 DO 结构的循环部分的控制方式有 3 种:● 利用一个循环变量从初始 DO 语句开始,以确定的方式增长(也可能是负方向增长),该变量作为一个循环计数器,它的取值变化的次数标记了循环的次数;● 利用 WHERE 条件;● 使用简单 DO 结构,或者称为“永远 DO”。
显然这种方式需要一个可执行语句来终止 DO 结构,例如 EXIT 语句,可以用来退出循环从 DO 结构的整体构造来看,DO 结构分为两种形式:● DO 结构块;DO 结构本身构成一个块结构,总是使用一个 END DO 语句或 CONTINUE 语句来终止 DO 结构的运行 ● 非块 DO 结构非块 DO 结构本身不构成一个块状结构,它或者使用一个作用语句或结构来终止该 DO 结构的运行,或者与其他 DO 结构共享一个终止语句这两种形式具有相同的功能,都可以使用 DO WHERE 与“永远 DO”的循环形式,但是非块 DO 结构属于早期 FORTRAN 版本的遗留物,是在还不重视结构化编程的时代的产物,因此是过时的表达方式,现代 FORTRAN 语言不提倡使用下面是一个 DO 结构块的例子例 11-2】DO I=1,NSUM=SUM+X(I)END DO下面是执行与上例同样的计算任务的非块 DO 结构的例子例 11-3】 DO 100 I=1,N100 SUM=SUM+X(I)11.1.1 DO 结构块的形式DO 结构块就是使用不与其他 DO 结构共享的 END DO 语句或 CONTINUE 语句作为终止语句的 DO 结构。
它的一般句法形式(R817)为:[do-construct-name:] DO [label][loop-control][execution-part-construct]…[label] END DO其中循环控制(loop-control) 的句法形式 (R821)为:[ ,]scalar-integer-variable-name = &scalar-integer-expression,scalar-integer-expression & [ ,scalar-integer-expression][ ,]WHILE(scalar-logical-expression)其中 END DO 语句的句法形式(R824) 为:END DO [do-construct-name]CONTINUE 其中在可选的结构名称加关键词 DO 后面的语句称为 DO 语句;关键词 END DO 后面的语句称为 END DO 语句;关键词 CONTINUE 后面的语句称为 CONTINUE 语句DO 结构的一般规则如下:● DO 结构里循环控制里的 DO 变量,必须是整型的标量命名变量● 整个 DO 结构块如果有一个结构名称,那么它必须同时出现在 DO 语句和 END DO语句里面,而不能只出现在其中之一里面。
● 如果 DO 语句里面不包含标签,那么 END DO 语句里面也不能包含标签;如果 DO语句里面包含标签,那么 END DO 语句必须使用同样的标签注意 DO 结构块里的终止语句绝对不能与其他 DO 结构共享,因此 END DO 语句的标签绝对不能在别的地方被引用如果终止语句其他 DO 结构共享了,则属于非块 DO 结构● DO 结构里面可选的标签既可以使用自由源码形式也可以使用固定源码形式下面给出一些不同形式的 DO 结构的例子例 11-4】SUM=0.0DO I=1,NSUM=SUM+(-1)**N*(1/N**2)END DO这个例子里面的 DO 变量是 I例 11-5】FOUND=.FALSE. I=0DO WHILE(.NOT.FOUND.AND.I MAX_ITERS ) EXITX0 = X1NO_ITERS=NO_ITERS+1END DO这个 DO 结构里面使用 IF 语句例 11-7】INNER_PROD=0.0DO 100 I=1,10INNER_PROD=INNER_PROD+X(I)*Y(I)100 CONTINUE这个例子里面使用了 CONTINUE 语句。
例 11-8】LOOP: DO I=1 , NY(I)=A*X(I)+Y(I)END DO LOOP在这个例子里面给出了 DO 结构名称11.1.2 非块 DO 结构的形式非块 DO 结构的终止语句总是使用标签,并且采取如下两种情形 :● 一个非块 DO 结构的终止语句是与其他的 DO 结构共享的;● 非块 DO 结构的终止语句本身是一个结构或作用语句,而不是 END DO 语句或CONTINUE 语句具有这样的终止语句的 DO 结构,就不能形成一个块结构,这导致它是一种过时的表述方式非块 DO 结构的句法形式(R826)为:action-terminated-do-constructouter-shared-do-construct其中作用语句终止 DO 结构(action-terminated-do-construct)的句法形式(R827)为:[do-construct-name:]DO label [loop-control][execution-part-construct]…label action-statement其中可外部共享 DO 结构(outer-shared-do-construct) 的句法形式(R830)为:[do--construct-name:]DO label [loop-control][execution-part-construct]…label shared-termination-do-construct其中可共享终止 DO 结构(shared-termination-do-construct)的句法形式(R831)为:outer-shared-do-constructinner-shared-do-construct其中可内部共享 DO 结构(inner-shared-do-construct) 的句法形式(R832)为:[do-construct-name:]DO label [loop-control][execution-part-construct]…label action-statement其 中 用 来 退 出 作 用 语 句 终 止 DO 结 构 (action-terminated-do-construct)的 作 用 语 句 称 为 终 止DO 作 用 语 句 ; 用 来 退 出 可 内 部 共 享 DO 结 构 (inner-shared-do-construct)的 作 用 语 句 称 为 终 止DO 共 享 语 句 ; 所 有 这 些 用 来 终 止 非 块 DO 结 构 的 语 句 或 结 构 形 式 , 包 括 终 止 DO 作 用 语 句 ,终 止 DO 共 享 语 句 , 终 止 DO 共 享 结 构 , 都 称 为 DO 终 止 , 或 DO 结 构 的 终 止 语 句 。
非块 DO 结构的一般规则如下:● 一个终止 DO 作用语句不能是任何形式的如下语句:CONTINUE 语句;GO TO 语句;RETURN 语句;STOP 语句;EXIT 语句;CYCLE语句;END 语句● 终止 DO 作用语句和相应的 DO 语句必须具有相同的标签● 一个终止 DO 共享语句不能是任何形式的如下语句:GO TO 语句; RETURN 语句;STOP 语句;EXIT 语句;CYCLE 语句;END 语句● 终止 DO 共享语句和相应的所有共享它的 DO 语句必须具有相同的标签● DO 结构里面可选的标签既可以使用自由源码形式也可以使用固定源码形式下面给出一些不同形式的非块 DO 结构的例子:【例 11-9】PROD=1.0DO 20 I=1,N20 PROD=PROD*P(I)【例 11-10】DO 20 I=1,NDO 20 J=1,N20 HILBERT(I,J)=1.0/REAL(I+J)这个例子里面包含 DO 语句的嵌套结构例 11-11】FOUND=.FALSE.I=0DO 20 WHILE(.NOT.FOUND.AND.Ie2 并且 e3>0;● e1=0.01)DO WHILE 结构的运行非常简单:首先计算逻辑表达式,如果为真,则运行循环部分;如果为假,则退出该 DO 结构。
例 11-16】SUM=0.0I=0DO WHILE (I<5)I=I+1SUM=SUM+IEND DO上面的循环执行 5 次,最后得到 SUM=15.0,I=5 3. 简单 DO 结构的运行也可以在 DO 结构里面不使用任何循环控制,而是直接使用终止语句,即 DO 范围里面的语句总是循环执行,除非 DO 范围里面的某条终止语句在一定条件下被执行简单 DO 结构的一般形式就是:DO [label ]【例 11-17】DO READ*,DATAIF(DATA<0) STOPCALL PROCESS(DATA)END DO在这个例子里面,一直到 DATA 读入。












