例題2) 四則演算2 (飛び越しと判断)

次のプログラムを作成します。

2つの整数の組を何件かキーボードから読み込んで、2つの整数の和、差、積、商、余りを計算し、読み込んだ2つの整数値と共に出力する。また、データの入力件数と2つの整数の差が正になる件数を数えて出力する。

 この例題は、例題1)のプログラム例 1c に「データの入力件数を数える」ことと、「差が正になる件数を数える」こと、また「それらを出力する」ことを追加するだけです。
 このプログラムのアルゴリズムを次に示します。青字が例題1)のプログラム例 1c のアルゴリズムに追加した部分です。

  • ★ 2つの整数データを読み込む。データが終わりの時は★★印に飛ぶ。
  •   データの入力件数を数える。
  •   和と差を計算する。
  •   2つの整数の差が正になる件数を数える。
  •   積と商と余りを計算する。
  •   2つの値と、計算結果をすべて出力する。
  •   繰り返し計算を行うために処理の流れを★印に戻す。
  • ★★データの入力件数と差が正になる件数を出力する。
  •   終わり。
データの入力件数は、データを読んでから次のデータを読み込むまでの間に数えます。差が正になる件数は、差の計算をしてから、次のデータを読み込むまでの間に数えます。ここに示したアルゴリズムの通りである必要はありません。

 次にプログラムの例を示します。

例題2)のプログラム例

プログラム
 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
31
32
33
34
35
c Example 2      四則演算2
c  建築学科 2年  xxxxxxx  my name
c234567890    file=reidai2.f
      integer m,n,wa,sa,seki,sho,amari,i,j
*  初期値 設定
      i=0
      j=0
*  繰り返しデータを読み込む
 101  continue
      write(*,*) ' input m,n = '
      read(*,*,end=901) m, n
* 入力件数
      i=i+1
* 和、差の計算
      wa=m+n
      sa=m-n
* 差が正になる件数
      if(sa.gt.0)   then
        j=j+1
      end if
* 積、商、余りの計算
      seki=m*n
      sho=m/n
      amari=m-n*sho
* 出力
      write(*,*) m,n,wa,sa,seki,sho,amari
      go to  101
* 件数の出力
  901 continue
      write(*,*)
      write(*,*) ' 入力件数         =',i
      write(*,*) ' 差が正になる件数 =',j
*
      stop
      end


 このプログラムでは、まとまった処理ごとにコメント行を入れています。1カラム目に * が記述されている行はコメント行です。例題1)のプログラム例 1c を変更した部分について説明します。

4行目       integer m,n,wa,sa,seki,sho,amari,i,j

 データの入力件数を数える変数i と差が正になる件数を数える変数j を整数型と定義するため integer文に追加します。

6行目           i=0
   と
13行目         i=i+1

 6行目と13行目はデータの入力件数を数えるために挿入したものです。この部分に関係するプログラムの流れは次のようになっています。

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

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

7行目           j=0
   と
18行目         if(sa.gt.0)   then
19行目           j=j+1
20行目         end if

 この部分は差が正になる件数を数えるために挿入したものです。この部分に関係するプログラムの流れは次のようになっています。

               j=0 
     ┌→  101 continue
     │         : 
     │        if(sa.gt.0)   then   ─┐
     │          j=j+1                │ ブロックif
     │        end if               ─┘
     │         :
     └──    go to  101 

 7行目の j=0 で初めに変数j の値をゼロにしてから19行目の j=j+1 を実行することで、この文が実行される回数を数えています。データの入力件数はループの中を通過する件数を無条件に数えればよかったのですが、今度は「差が正の時」という条件がついています。この条件を満たしている時だけ j=j+1 を実行するようにしたのが18行目から20行目までのブロックifです。( )の中の論理式 sa.gt.0 が真(すなわち 変数sa > 0 )の時、if文と endif文の間に記述されている文 j=j+1 を実行します。 ブロックif文 による判断の詳細はFortranの文法を参照してください。

29行目     901 continue
30行目         write(*,*)
31行目         write(*,*) ' 入力件数         =',i
32行目         write(*,*) ' 差が正になる件数 =',j

 データの入力件数と差が正になる件数を出力する部分です。これらの件数はデータの入力が終わったときに変数i と j に数えられていますので、データの入力が終わった時の飛び先の文(ここでは29行目の文番号 901を持つ continue文)より後に記述します。
30行目の write文は、出力の並びの記述がないので空の行を出力(改行)します。31行目の write文は、文字列「 入力件数     =」と変数i の値を出力します。 32行目の write文は、文字列「 差が正になる件数 =」と変数jの値を出力します。



Fortranの文法参照