Fortranでは、回数の決まったくりかえしを表現するのに、DO文を使う。
増田の教材の例文は、次のような構文をよく使う。 ここでは、Fortran 77標準に従ってDO文を記述している。
===== BEGIN loop1.f
PROGRAM doloop
INTEGER kt, nt
REAL t, deltat
*
READ (*,*) nt, deltat
DO 100 kt = 1, nt
t = kt * deltat
write (*,*) kt, t
100 CONTINUE
END
===== END loop1.f
実は、g77やDEC Fortranコンパイラでは、 Fortranの新しい標準(90標準)で認められたDO...END DO構文を使うことができる。 文番号(loop1.fの100)を使わなくてよいので、このほうがすぐれているのだが、 まだすべてのコンパイラで使えるとは限らない。 1996年度以後、わたしの例文では、文番号のない方式を原則にするつもりだが、 両方の方式が混じるかもしれない。
===== BEGIN loop2.f
PROGRAM doloop
INTEGER kt, nt
REAL t, deltat
*
READ (*,*) nt, deltat
DO kt = 1, nt
t = kt * deltat
write (*,*) kt, t
END DO
END
===== END loop2.f
上の例の kt のような制御変数をもたない繰り返し構文もある。 まず、77標準の範囲で同じ仕事内容を表現すると次のようになる。
===== BEGIN loop3.f
PROGRAM doloop
INTEGER kt, nt
REAL t, deltat
*
READ (*,*) nt, deltat
kt = 1
9000 IF (kt .GT. nt) GO TO 9900
t = kt * deltat
write (*,*) kt, t
kt = kt+1
GO TO 9000
9900 CONTINUE
END
===== END loop3.f
90標準の構文を使えば、文番号を使わずに表現できる。
===== BEGIN loop3a.f
PROGRAM doloop
INTEGER kt, nt
REAL t, deltat
*
READ (*,*) nt, deltat
kt = 1
DO WHILE (kt .LE. nt)
t = kt * deltat
write (*,*) kt, t
kt = kt+1
END DO
END
===== END loop3a.f
なお、次のように、ループ終了判定を実数型の変数でおこなうのは 避けたほうがよい。誤差が累積するからである。 loop4a.f のループ内のwrite文をやめ、最後にt, ktの値を出力するよう 修正したものをloop5a.fとしてあるので、 nt, deltat に、たとえば 100, 0.01 を与えてためしてみてほしい。 この例文 loop4a.f、loop5a.f では、 ktは結果として計算しているだけで、ループの制御に関与していない。
===== BEGIN loop4a.f
PROGRAM doloop
INTEGER kt, nt
REAL t, deltat, tfinal
*
READ (*,*) nt, deltat
tfinal = nt*deltat
t = 0.0
kt = 0
DO WHILE (t .LE. tfinal)
t = t + deltat
kt = kt + 1
write (*,*) kt, t
END DO
END
===== END loop4a.f
===== BEGIN loop5a.f
PROGRAM doloop
INTEGER kt, nt
REAL t, deltat, tfinal
*
READ (*,*) nt, deltat
tfinal = nt*deltat
WRITE (*,*) 'final t should be ', tfinal
t = 0.0
kt = 0
DO WHILE (t .LE. tfinal)
t = t + deltat
kt = kt + 1
* write (*,*) kt, t
END DO
WRITE (*,*) 'final t is actually ', t
WRITE (*,*) 'loop count ', kt
END
===== END loop5a.f