例題7 ファイル入力と書式仕様

 次のようなデータファイルがある。このデータはアメダスで観測された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のフローチャートとプログラムの例を示します。

概要

プログラム
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
c Example 7     ファイル入力と書式仕様
c  機械工学科 1年  xxxxxxx  my name
c         Filename = reidai07.f
      real a(24)
      data n/24/
c   気温データを読む
      open(11,file='reidai07.d',status='old')
      read(11,101) (a(i),i=1,n)
      close(11)
      write(*,601) 
      write(*,602) (i,a(i),i=1,n)
c   最高・最低気温、平均気温を求める
      asum=0.0
      amin=99.0
      amax=-99.0
      do 1010 i=1,n
        asum=asum+a(i)
        if(a(i).gt.amax) amax=a(i)
        if(a(i).lt.amin) amin=a(i)
 1010 continue
      av=asum/real(n)
      write(*,603) amax, amin, av
      stop
  101 format(24f4.1)
  601 format( '1996年7月15日の東京の気温'
     *                        /6('   時刻  気温'))
  602 format(6(i4,':00',1x,f5.1))
  603 format(/'  最高気温=',f5.1,'  最低気温=',f5.1
     *                          ,'  平均気温=',f5.1)
      end


 例題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の装置に接続し、status='old' の指定によりファイル reidai07.d が存在することを確認し、読み書きできる状態にします。この操作をファイルを開くといいます。
 8行目のread文はdo型並びで、配列aの1からn(ここでは24)の要素にデータを読み込んでいます。このread文の書式仕様は24行目の文番号101のformat文で(24f4.1) です。4桁の幅で小数点以下1桁の実数型のデータ(f4.1)が24個1レコードに入っていることを意味します。データファイルの内容は次に示すように小数点が記入されていませんが、この書式で a(1)=26.1, a(2)=26.3, ・・・,a(24)=24.8 のように読み込まれます。

データファイルの内容
 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


Fortranの文法参照