例題5 数を数える(カウント)

次のプログラムを作成する。
 はじめに3つの実数の値を読み込んで、その平均を求める。次に新たに実数値を読み込んで、読み込んだ実数値と先に求めた平均値との差を求め表示する。また読み込んだ実数値の個数と、そのうち平均値との差が正の個数、負の個数を数え、最後にそれぞれの個数を表示する。

 例題5のフローチャートとプログラムの例を示します。

プログラム
 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 5     数を数える(カウント)
c  機械工学科 1年  xxxxxxx  my name
c         Filename = reidai05.f
      real a1,a2,a3,asum,av,a
c   3つの実数の平均を求める
      write(*,*) ' 実数を3つ入力する'
      read(*,*) a1,a2,a3
      asum=a1+a2+a3
      av=asum/3.0
      write(*,*) ' a= ',a1,a2,a3,' 平均 ', av
c  平均との差を求める 数える
      i=0
      j=0
      k=0
 1001 continue
      write(*,*) ' 実数を入力する'
      read(*,*,end=9001) a
      i=i+1
      s=a-av
      write(*,*) '実数値=',a,'  平均との差',s
      if(s.gt.0.0) j=j+1
      if(s.lt.0.0) k=k+1
      go to 1001
 9001 continue
      write(*,*) 
      write(*,*) '入力した実数値の個数  ',i
      write(*,*) '平均との差が正の個数  ',j
      write(*,*) '平均との差が負の個数  ',k
      stop
      end


 例題5のプログラム例について説明します。

 プログラム全体の大きな流れは例題4と同じです。

 このプログラムでは、新たに実変数s(平均との差),整変数i(実数値の入力数を数える変数),j(平均との差が正になる個数を数える変数),k(平均との差が負になる個数を数える変数)を使用しています。

            real s
            integer i,j,k

の型宣言文を記述するところですが、これらの変数は暗黙の型宣言の定義を満たしているので型宣言は必要ありません(これまでの例で記述してきた4行目の型宣言文も無くても構いません)。

 次に、入力した実数の個数を数える部分に注目してみましょう。そのために挿入された行は

12行目         i=0
   と
18行目         i=i+1

で、この部分に関係するプログラムの流れは次のようになっています。

               i=0 
     ┌→ 1001 continue
     │         : 
     │        i=i+1
     │         :
     └──    go to  1001 

 12行目の i=0 で初めに変数i の値をゼロにしておきます。18行目の i=i+1 は変数i の値に 1 を加えて、変数i に代入するという意味で、結果として変数i の値が1つ増えます。繰り返しのループの中で i=i+1 が実行されるたびに 実行された回数がカウントされていることになります。実数値が入力されると必ずこの文が実行されるので、実数値の入力個数を数えていることになります。

 今度は、入力した実数値と平均との差が正の場合の個数を数える部分に注目してみましょう。そのために挿入された行は

13行目         j=0
   と
21行目         if(s.gt.0.0) j=j+1

で、この部分に関係するプログラムの流れは次のようになっています。

               j=0 
     ┌→ 1001 continue
     │         : 
     │        if(s.gt.0.0) j=j+1   ←論理if文
     │         :
     └──    go to  1001 

 13行目の j=0 で初めに変数j の値をゼロにしてから21行目の if(s.gt.0.0) j=j+1 を実行します。実数値の入力個数はループの中を通過する件数を無条件に数えればよかったのですが、今度は「平均値との差が正の時」という条件がついています。この条件を満たしている時だけ j=j+1 を実行するようにするため、21行目の論理if文を用いています。( )の中の論理式 s.gt.0.0 が真(すなわち 変数s > 0 )の時、実行文 j=j+1 を実行します。

 実数値と平均との差が負の場合の個数を数える部分の考え方は、正の個数を数える場合と同様で、そのために挿入された行は

14行目         k=0
   と
22行目         if(s.lt.0.0) k=k+1

です。この部分に関係するプログラムの流れは

               k=0 
     ┌→ 1001 continue
     │         : 
     │        if(s.lt.0.0) k=k+1   ←論理if文
     │         :
     └──    go to  1001 

となります。

論理if文 による判断の詳細はFortranの文法を参照してください。

 実数値の入力が終わり(入力ファイルが終了)になったら、それぞれの個数 i, j, k を出力します。その部分は次のように記述します。

24行目    9001 continue
25行目         write(*,*)
26行目         write(*,*) '入力した実数値の個数  ',i
27行目         write(*,*) '平均との差が正の個数  ',j
28行目         write(*,*) '平均との差が負の個数  ',k

 実数値の入力が終わりになったときには、変数 i, j, k にそれまでの個数が数えられていますので、実数値の入力が終わったときの飛び先の文(ここでは24行目の文番号 9001を持つ continue文)より後に出力するための実行文を記述します。
 25行目の write文は、出力の並びの記述がないので空の行を出力(改行)します。26行目から28行目の write文は、出力の並びに記述された ' で囲まれた文字列と変数の値を出力します。



Fortranの文法参照