第3章:プログラムの要素(続)


ループ

ループは同じ処理を何回も繰り返すこと.いかにもコンピュータらしい動きである.

ループには,最初から繰り返しの回数が決まっているカウンタループと,条件が整ったときに繰り返しを追える(その回数は最初からは分からない)条件ループとがある.


カウンタ・ループ(Fortran編)

Fortranのカウンタループは,今も昔もDO文を使う.1からNまでの数の積(つまりN!)を求める方法は次のとおり.


このように,「DO」から「END DO」までが一つのDOブロックで,この間を繰り返す.繰り返しの回数は,「DO カウンタ変数=最初,最後」のように表す.ループの中では,カウンタ変数(この場合i)が1,2,......,nまで変わりながら,全部でn回このブロックを繰り返す.

DOブロックの中は正しくインデント(字下げ)すること.

「1から100までの奇数」というループはどうするか?これは

do i=1, 100, 2
  !! .......
end do
のようにする.


条件ループ・1

後ろに何もつけないDO文というものがある.

do
  !! .......
end do

これではいつまでたってもループが終わらないではないかと思うかもしれない.そのとおり.どこかでループを飛び出す部分が必要である.

DOループを飛び出す文,それがEXIT文である.

前の例題を,今度は0または負の数が入力されるまで繰り返すプログラムに改造する


これで分かるとおり,EXIT文は,今いるDOブロックのEND DO文の次の行に制御をうつす.

これとは別に,今いるDOブロックの最初のDO文に制御をうつす(END DO文自体に制御をうつすとも言える)のがCYCLE文である.途中で繰り返し処理を切り上げて次の繰り返しに入る場合に使う.


条件ループ・2

後ろに何もついていないDO文は,ループがかならず一回は実行されるという特徴をもつ.それを避けるためにはDOブロックの先頭にIFとEXITを置けばいいのだが,なんだかそれではカッコわるい(笑).

そこで,後ろにWHILE節がついたDO文というものもある.

これは各繰り返しの開始時にループEXIT判定を行うものである.

同じ例題を,DO WHILEを用いて書き直してみる:


もっとも,これはプログラムとしては不自然(笑).

もう少し自然な例を出そう.DO WHILEは収束計算に便利である.たとえば,平方根を求める例題.s<-- ( s + x/s ) / 2の繰り返しにより,sが√xに漸近(収束)してゆくことを用いて,こんな風に書ける


実行結果例

% ./a.out
input positive real number : 5
 answer=2.23606873
input positive real number : 12
 answer=3.46410179
input positive real number : 100
 answer=10.
input positive real number : 36.9
 answer=6.07453728
input positive real number : 0
 bye!
AGATASHI