例題3)合計と割合(%)  配列と繰り返し 簡単な書式仕様

 次のような1ヶ月分の家計の支出データがある。

家計支出データ
支出費目金額(円)
食費55,210
住居費87,000
水道・光熱費12,650
被服費23,400
保健医療費5,200
理容衛生費3,220
交際費15,000
交通・通信費13,610
教育費0
教養娯楽費3,925
その他16,790

このデータの支出費目数と各費目の金額を読み込んで、各費目の支出合計に対する割合(パーセント)を計算するプログラムを作成する。

 この例題の処理手順(アルゴリズム)を次に示します。

  • 支出費目数を読み込む。
  • 各費目の金額を読み込む。
  • 支出合計を計算する。
  • 各費目について、支出合計に対する割合(パーセント)を計算し、支出金額と割合を出力する。
  • 終わり。

 このデータの例では、各費目の金額が費目の数だけ並んでいます。このように一連のデータを扱う場合は配列を使用するとプログラムが作成しやすくなります。次に 1次元配列を使用したプログラムの例を示します。

1次元配列を使用したプログラム例
プログラム
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
c Example 3a 合計と割合(%) 1次元配列と繰り返し
c  建築学科 2年  xxxxxxx  my name
c234567890  File = reidai3a.f
      integer a(20),kei,n,i
      real  per
      data  kei/0/
c データを読み込む
      write(*,*) '支出費目数を入力する'
      read(*,*)  n
      write(*,*) n,' 費目の金額を入力する'
      read(*,*)  (a(i),i=1,n)
c 合計の計算
      do  20  i=1, n
        kei=kei+a(i)
   20 continue
c  割合の計算(%)と出力
      do  30  i=1, n
        per=real(a(i))/real(kei)*100.0
        write(6,*) i,a(i),per
   30 continue
      write(6,*) n, kei
      end


 このプログラムで使用されている主な文を説明します。

4行目       integer a(20),kei,n,i

 integer文を用いて、寸法が 1から 20 の配列 a と変数 kei、n、i を整数型と定義します。

5行目       real  per

 real文を用いて、変数 per を実数型と定義します。

6行目       data  kei/0/

 data文を用いて、変数 kei に初期値ゼロを設定します。

9行目       read(*,*)  n

 read文を用いて、変数 n に標準入力装置(ここではキーボード)からデータを読み込みます。この例では n は支出費目数です。

11行目      read(*,*) (a(i),i=1,n)

 read文を用いて、配列 a の1番目から n 番目の要素( a(1)からa(n) )にデータを読み込みます。 (a(i), i=1,n ) do形並びといいます。

13行目       do  20  i=1, n
14行目         kei=kei+a(i)
15行目    20 continue

 13行目から15行目が費目の合計を求める部分です。合計は、a(1)+a(2)+a(3)+・・・+a(n) ですが、n の値が大きくなると、この式では記述しきれなくなります。そこで次のように考えます。

   kei=0         keiの初期値をゼロとしておく
   kei=kei+a(1)  i=1の時  kei=0+a(1)           右辺のkeiの値はゼロ
   kei=kei+a(2)  i=2の時  kei=a(1)+a(2)        右辺のkeiの値はa(1)
   kei=kei+a(3)  i=3の時  kei=a(1)+a(2)+a(3)   右辺のkeiの値はa(1)+a(2)
       :
   kei=kei+a(n)  i=nの時  kei=a(1)+a(2)+・・・+a(n)   右辺のkeiの値はa(1)+a(2)+・・・+a(n-1)

 これを do文を使用して13行目から15行目までのように記述します。doは、do文の次の文から、do文で指定された文番号を持つ文(端末文)までの範囲を do変数(ここでは i)の指示にしたがって繰り返します。
 13行目のdo文では、繰り返しの範囲を示す文(端末文)の文番号(ここでは 20)と、do変数 i に doの制御(ここでは1から順に n まで繰り返すこと)を記述しています。この例では、doの端末文(行番号20を持つ文)は15行目の 20 continueですから、14行目の文 kei=kei+a(i)を do変数 i について1から n まで繰り返すことになります。

17行目       do  30  i=1, n
18行目         per=real(a(i))/real(kei)*100.0
19行目         write(6,*) i,a(i),per
20行目    30 continue

 17行目から20行目は、各支出費目について割合(%)を計算し結果を出力する部分です。17行目のdo文で、20行目の文番号30のcontinue文までを do変数 i について1から n まで繰り返すことを記述しています。
 18行目では割合を計算しています。i番目の支出費目a(i)を支出合計keiで割り、100.0をかけて%にしています。式の結果を変数perに格納します。割合を実数(小数点以下まで)で求めたいので、整数型であるa(i)とkeiの値を実数型の値に変換してから割り算します。整数値を実数値に変換するにはreal関数を用います。real関数はFortranが用意している関数(組込み関数)です。
 19行目では支出費目の番号(変数i)、金額(配列要素a(i))、割合(変数per)を、標準出力装置に自由書式で出力しています。

21行目       write(6,*) n, kei

 write文で、支出費目の数(変数n)と支出合計(変数kei)を標準出力装置に自由書式で出力しています。

 このプログラムを翻訳し実行してみます。実行時には、まずディスプレイに文字列「支出費目数を入力する」を表示してデータの入力を待っていますので、支出費目数を入力します。次に入力した費目数と文字列「 費目の金額を入力する」を表示してデータの入力を待っていますので、費目の金額を順番にカンマ , か空白で区切って入力します。

 装置番号6(ここではディスプレイ)に出力される実行結果は、

 1 55210 23.3935719
 2 87000 36.8636246
 3 12650 5.36005592
 4 23400 9.91504383
 5 5200 2.20334315
 6 3220 1.36437786
 7 15000 6.35579777
 8 13610 5.76682711
 9 0 0.00000000
 10 3925 1.66310036
 11 16790 7.11425591
 11 236005

となります。自由書式では見やすく列を揃えて出力することはできません。出力の形式を整えるには書式仕様を定義する必要があります。





例題3a) のプログラムを、データの支出費目数と各費目の金額をファイル(ファイル名reidai3.dat)から読み込むように修正する。

 プログラムの例とデータファイルの内容を示します。

プログラム例 3b)
プログラム
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
c Example 3b 合計と割合(%) 1次元配列と繰り返し
c            ファイル入力 書式仕様
c  建築学科 2年  xxxxxxx  my name
c234567890  File = reidai3b.f
      integer a(20),kei,n,i
      real  per
      data  kei/0/
c データを読み込む
      open(11,file='reidai3.dat',status='old')
      read(11,*)  n
      read(11,*)  (a(i),i=1,n)
      close(11)
c 合計の計算
      do  20  i=1, n
        kei=kei+a(i)
   20 continue
c  割合の計算(%)と出力
      do  30  i=1, n
        per=real(a(i))/real(kei)*100.0
        write(6,101) i,a(i),per
   30 continue
      write(6,101) n, kei
  101 format(i5,i8,f6.1)
      end
データファイルの内容
プログラム
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
   11
  55210
  87000
  12650
  23400
   5200
   3220
  15000
  13610
      0
   3925
  16790


 例題3a)のプログラムを修正した部分を説明します。

 データをキーボードから入力する部分をファイルから入力するようにします。

 9行目       open(11,file='reidai3.dat',status='old')
10行目       read(11,*)  n
11行目       read(11,*)  (a(i),i=1,n)
12行目       close(11)

 9行目はopen文です。データファイル(ファイル名 reidai3.dat)を装置番号11の装置に接続し、status='old' の指定によりファイル reidai3.dat が存在することを確認し、読み書きできる状態にします。この操作をファイルを開くといいます。
10行目は装置番号11に接続されたファイル(ここでは reidai3.dat)の先頭行のデータ数を整変数 n に読み込みます。続いて11行目で配列 a の要素にデータの個数だけ整数値を読み込みます。
 12行目はclose文です。データの読み込みが終わりましたので、ファイルと装置番号11との接続を切り離します。この操作をファイルを閉じるといいます。

20行目       write(6,101) i,a(i),per
23行目   101 format(i5,i8,f6.1)

 20行目のwrite文では出力結果を見やすくするため、書式を指定しています。
write文の並びの i,a(i),per を文番号101 の format文の書式仕様にしたがって標準出力装置に出力します。まず、並びの先頭の整変数 i を i5(5桁の右詰)で、次に整数型配列要素 a(i) を i8(8桁の右詰)で、次に実変数 per を f6.1(6桁の幅を取って小数点以下1桁までを右詰)で出力します。

22行目       write(6,101) n, kei

 22行目のwrite文で、支出費目の数(変数n)と支出合計(変数kei)を文番号101 の format文の書式仕様にしたがって標準出力装置に出力します。

 プログラムを翻訳し実行してみます。実行時にファイルreidai3.datが必要です。このリンクreidai3.datを右クリックし表示されたメニューの、「対象をファイルに保存」を選び各自のプログラムと同じ場所(フォルダ)にそのファイル名のまま保存します。ファイルの内容を確認したい時は秀丸エディタで開きます。

 装置番号6(ここではディスプレイ)に出力される実行結果は、

    1   55210  23.4
    2   87000  36.9
    3   12650   5.4
    4   23400   9.9
    5    5200   2.2
    6    3220   1.4
    7   15000   6.4
    8   13610   5.8
    9       0   0.0
   10    3925   1.7
   11   16790   7.1
   11  236005

となります。





Fortranの文法参照