ループは同じ処理を何回も繰り返すこと.いかにもコンピュータらしい動きである.
ループには,最初から繰り返しの回数が決まっているカウンタループと,条件が整ったときに繰り返しを追える(その回数は最初からは分からない)条件ループとがある.
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のようにする.
後ろに何もつけないDO文というものがある.
do !! ....... end do
これではいつまでたってもループが終わらないではないかと思うかもしれない.そのとおり.どこかでループを飛び出す部分が必要である.
DOループを飛び出す文,それがEXIT文である.
前の例題を,今度は0または負の数が入力されるまで繰り返すプログラムに改造する
これで分かるとおり,EXIT文は,今いるDOブロックのEND DO文の次の行に制御をうつす.
これとは別に,今いるDOブロックの最初のDO文に制御をうつす(END DO文自体に制御をうつすとも言える)のがCYCLE文である.途中で繰り返し処理を切り上げて次の繰り返しに入る場合に使う.
後ろに何もついていない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