先週はプログラムの流れ(上から下へ)を変える1つの手段として、条件分岐
(IF文)と数値計算を行なうに当たって非常に重要となる誤差の話をしました。
今日はプログラムの流れを変えるもう1つの重要な方法、”繰り返し”と
それに加えて”配列”の話をします。単純作業を繰り返しやらせる、という
意味においてやっと計算機を使っている、という気にさせてくれるかもしれま
せん。
implicit real(a-h,o-z) real sum, avg, max, min, data integer i, num parameter (num = 10) c read(5,'(f10.5)') data sum = data max = data min = data c do i = 2 , num read(5,'(f10.5)') data sum = sum + data if( max .lt. data ) max = data if( min .gt. data ) min = data end do c avg = sum / real(num) c write(6,'(a,f10.3,a,f10.3,a,f10.3)') $ 'average = ', avg, ' maximum = ', max, ' minimum = ', min c end
また DO 文を使うにあたって注意してもらいたい点は、 ”DO 文の変数は必ず整数型を使う”ということです。例えば、”1 から 100 まで 0.2ずつ増加させる”としたかった場合、
real a ..... do a = 1 , 100 , 0.2 ..... end doとしたとします。普通に考えれば問題なさそうなのですが、計算機の内部表現は "0.2"がきっちり 0.2 であるのではなく、保証されている桁数の範囲内において 0.2 であるのです。つまり変数 a が real と宣言されているのなら、8桁しか 保証されておらず、それ以下の桁に対して誤差が蓄積されていきます。これは 非常に都合が悪い。どうするのが正解かと言うと
integer i real a ..... do i = 10 , 1000 , 2 a = real(i)/10.0 ..... end doとすればよいのです。
implicit real(a-h,o-z) real data(1000), work integer num, i, j c read(5,'(i5)') num read(5,'(5f10.5)') (data(i) , i = 1 , num) c do i = 1 , num-1 do j = i+1 , num if( data(i) .gt. data(j) ) then work = data(j) data(j) = data(i) data(i) = work end if end do end do c write(6,'(5f10.5)') (data(i), i = 1 , num) c end