次のようなデータファイルがある。このデータはアメダスで観測された1996年7月15日の東京の気温で1時から24時まで1時間ごとに測定されたものである。書式仕様は(24f4.1)でファイル名はreidai07.dである。 261 263 264 258 256 261 268 274 286 301 307 309 310 318 310 307 287 278 265 266 265 254 253 248 このデータを読み込んで最高気温、最低気温、平均気温を計算し出力するプログラムを作成する。 |
例題6では、データをキーボードから入力しましたが、例題7ではファイルから読み込みます。データの平均だけでなく、最大値と最小値も求めます。 例題7のフローチャートとプログラムの例を示します。
例題7のプログラム例について説明します。 4行目と5行目は宣言文です。 4行目 real a(24) 5行目 data n/24/ 4行目は型宣言文で、寸法が 1から 24 の実数型の配列 a を定義しています。5行目はdata文を用いて、変数 n に 24 を設定しています。24は1日分の気温データの個数です。 7行目から9行目はファイルからデータを読み込む部分です。 7行目 open(11,file='reidai07.d',status='old') 8行目 read(11,101) (a(i),i=1,n) 9行目 close(11) 7行目はopen文です。open文では、データファイル(ファイル名 reidai07.d)を装置番号11の装置に接続し、 データファイルの内容 261 263 264 258 256 261 268 274 286 301 307 309 310 318 310 307 287 278 265 266 265 254 253 248 9行目はclose文です。データの読み込みが終わったら、close文により、ファイルと装置番号11との接続を切り離します。この操作をファイルを閉じるといいます。 10行目と11行目は読み込んだデータを出力する部分です。 10行目 write(*,601) 11行目 write(*,602) (i,a(i),i=1,n) 10行目と11行目のwrite文で参照しているformat文は25行目から27行目 です。 25行目 601 format( '1996年7月15日の東京の気温' 26行目 * /6(' 時刻 気温')) 27行目 602 format(6(i4,':00',1x,f5.1)) 10行目のwrite文には並びはありませんが、文番号601のformat文の書式にしたがって、まず、文字列 1996年7月15日の東京の気温を出力してから行を変えて文字列 時刻 気温を6回出力します。11行目write文はdo型並びで i と a(i) を i について1からn(ここでは24)まで、文番号602のformat文の書式にしたがって出力します。 6(i4,':00',1x,f5.1) は( )の中を1行につき6回繰り返すという指定です。まず i=1 について、変数 i をi4(4桁の幅に右詰で)、次に文字列「:00」を出力して1桁移動し、配列要素a(i)を f5.1(5桁の幅に小数点以下1桁まで)出力します。次に i=2 について、同様に変数iと配列要素 a(i) を出力します。i=6 まで6回繰り返します。出力すべき並びがまだ残っていますので行を変えて並びがなくなるまで繰り返します。ここでは4行出力されることになります。
13行目から21行目は平均気温、最高気温、最低気温を求める部分です。 13行目 asum=0.0 14行目 amin=99.0 15行目 amax=-99.0 16行目 do 1010 i=1,n 17行目 asum=asum+a(i) 18行目 if(a(i).gt.amax) amax=a(i) 19行目 if(a(i).lt.amin) amin=a(i) 20行目 1010 continue 21行目 av=asum/real(n) この13行目から21行目のうち平均気温を求める部分を抜き出してみます。 13行目 asum=0.0 16行目 do 1010 i=1,n 17行目 asum=asum+a(i) 20行目 1010 continue 21行目 av=asum/real(n) 平均気温を求めるには、まず asum を 0 にしてから、asum に配列要素 a(i) を i について1からnまで(do文)加え合計を求めます。次にasumをデータの個数nで割ります。このとき整数nを実数に変換します。 最高気温を求める部分を次に示します。 15行目 amax=-99.0 16行目 do 1010 i=1,n 18行目 if(a(i).gt.amax) amax=a(i) 20行目 1010 continue 最高気温を求めるには、最大値を求める変数 amax にまず、データがとりうる値よりも小さい値を設定しておきます。次に各配列要素を amax と比較し配列要素の方が大きければその値を amax に代入します。これをすべての配列要素について行えば、最終的にデータの最大値が amax に求められていることになります。 最低気温を求める部分は次になります。 14行目 amin=99.0 16行目 do 1010 i=1,n 19行目 if(a(i).lt.amin) amin=a(i) 20行目 1010 continue 最低気温を求めるには、最小値を求める変数 amin にまず、データがとりうる値よりも大きい値を設定しておきます。次に各配列要素を amin と比較し配列要素の方が小さければその値を amin に代入します。これをすべての配列要素について行えば、最終的にデータの最小値が amin に求められていることになります。 22行目のwrite文では最高気温、最低気温、平均気温を出力します。 22行目 write(*,603) amax, amin, av このwrite文では書式仕様を用いています。このwrite文で参照しているformat文は28行目と29行目の文番号603の文です。 28行目 603 format(/' 最高気温=',f5.1,' 最低気温=',f5.1 29行目 * ,' 平均気温=',f5.1) まず文字列 最高気温=に続けて最高気温 amax を f5.1(5桁の幅に小数点以下1桁まで)出力し、同様に最低気温、平均気温を出力します。 例題7の出力結果は次のようになります。 1996年7月15日の東京の気温 時刻 気温 時刻 気温 時刻 気温 時刻 気温 時刻 気温 時刻 気温 1:00 26.1 2:00 26.3 3:00 26.4 4:00 25.8 5:00 25.6 6:00 26.1 7:00 26.8 8:00 27.4 9:00 28.6 10:00 30.1 11:00 30.7 12:00 30.9 13:00 31.0 14:00 31.8 15:00 31.0 16:00 30.7 17:00 28.7 18:00 27.8 19:00 26.5 20:00 26.6 21:00 26.5 22:00 25.4 23:00 25.3 24:00 24.8 最高気温= 31.8 最低気温= 24.8 平均気温= 27.8 |