例題1)四則演算

2つの整数 789と54 の和、差、積、商、余りを計算するプログラムを作成する。

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

  • 整数値789と54を設定する。
  • 和を計算する。
  • 差を計算する。
  • 積を計算する。
  • 商を計算する。
  • 余りを計算する。
  • 2つの整数値と、計算結果をすべて出力する。
  • 終わり。
このアルゴリズムにもとづいて作成したプログラムが、次のプログラム例 1a です。

プログラム例 1a
プログラム
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
c Example 1a     四則演算
c  建築学科 2年  xxxxxxx  my name
c234567890  File = reidai1a.f
      integer m,n,wa,sa,seki,sho,amari
      m=789
      n=52
      wa=m+n
      sa=m-n
      seki=m*n
      sho=m/n
      amari=m-n*sho
      write(*,*) m,n,wa,sa,seki,sho,amari
      stop
      end


 プログラム例 1a について説明します。

1行目  c Example 1a     四則演算
2行目  c  建築学科 2年  xxxxxxx  my name
3行目  c234567890  File = reidai1a.f

 1行目から3行目のように、1カラム目に c が記述されている行はコメント行で、プログラムの実行には関係ありません。自由に覚え書きなどを記述できます。1行目には問題番号とプログラムの処理内容、2行目には作成者の所属(学科、学年)と学生証番号と名前、3行目には、カラム位置(文番号や文の記述位置を示すため)と保存ファイル名を記述しています。

 4行目から14行目までは Fortranの文で、記述形式にしたがって 7 カラム以降に記述します。

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

 integer文は型宣言文で、並び(変数などをカンマ ,で区切って並べたもの)に記述された項目を整数型と定義する文です。例題1では、2つの値 789 と 54 は整数で、求める和、差、積、商、余りも整数ですから、これらの値を格納するために m、n、wa、sa、seki、sho、amari と名前をつけた変数を整数型と定義しています。

5行目        m=789
6行目        n=52

 5行目と6行目は代入文整定数 789を変数 m に代入し、整定数 54 を変数 n に代入します。

7行目        wa=m+n
8行目        sa=m-n
9行目        seki=m*n
10行目       sho=m/n
11行目       amari=m-n*sho

 7行目から11行目は和、差、積、商、余りを計算する部分です。変数などの名前を演算子でつなげたもの(例えば m + n )をといいます。特に算術演算に使用される演算子を算術演算子といいます。計算した和、差、積、商、余りはそれぞれ、変数 wa、sa、seki、sho、amari に代入します。
 10行目の m/n は変数 m、n ともに整数ですので割り算の結果は小数点以下が切り捨てられます。11行目では切り捨てられた sho の値に n をかけて m から引き、余りを求めています。

12行目       write(*,*) m,n,wa,sa,seki,sho,amari

 write文は、並び(変数などをカンマ ,で区切って並べたもの)に記述された項目の値を、その順番に出力する文です。ここでは変数 m、n、wa、sa、seki、sho、amariの値をその順に画面に出力します。

13行目       stop

 stop文は実行の終わりを示す文です。

14行目       end

 end文はプログラムの終わりを示す文です。


プログラムの各行は翻訳時、実行時に次のように処理されます。
 1行目から3行目までのコメント行は、翻訳時、実行時ともに無視されます。4行目の型宣言文(integer文)は、翻訳時に翻訳され、定義した変数を格納する領域を確保し、実行文に変数の型などの情報を与えます。5行目から14行目までは実行文で、翻訳時に翻訳され、実行時に文の記述にしたがって実行されます。


プログラムの改善

 先に説明した例題1)のプログラム例 1a は、2つの整数値 789 と 54 の和、差、積、商、余りを計算するものです。別の数値について計算したい時には、2つの値を代入している文をそのつど書き変えて、翻訳しなおし実行しなければなりません。
 プログラム例 1a を「2つの任意の整数値について計算できるようにする」には、プログラムの中に直接値を記述するのではなく、プログラムを実行する時に値を読み込むようにします。5行目と6行目を変更したプログラム例 1b を次に示します。
プログラム例 1b
プログラム
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
c Example 1b     四則演算
c  建築学科 2年  xxxxxxx  my name
c234567890  File = reidai1b.f
      integer m,n,wa,sa,seki,sho,amari
      write(*,*)   '  input  m,n = '
      read(*,*)  m,n
      wa=m+n
      sa=m-n
      seki=m*n
      sho=m/n
      amari=m-n*sho
      write(*,*) m,n,wa,sa,seki,sho,amari
      stop
      end


6行目       read(*,*)  m,n

 read文は入力並び(変数をカンマ ,で区切って並べたもの。ここでは m,n )に記述された変数に値を読み込みます。この例ではキーボードから値が入力されるのを待ちます。

5行目       write(*,*)   '  input  m,n = '

 write文は出力並び(変数などをカンマ ,で区切って並べたもの)に記述された変数などの値を出力します。この例では ' で囲まれた文字列

  input  m,n = 
を画面に出力します。このwrite文は次のread文で何を入力するのかを示す目的で入れたものです。

 このプログラムは、2つの整数値の一組だけを計算するものですから、何組か計算したい時には何回も実行しなければなりません。2つの整数値について必要なだけ繰り返し計算できるようにプログラムを変更してみましょう。

 次にそのアルゴリズムを示します。

  • ★ 2つの整数データを読み込む。データが終わりの時は★★印に飛ぶ。
  •   和、差、積、商、余りを計算する。
  •   2つの値と、計算結果をすべて出力する。
  •   繰り返し計算を行うために処理の流れを★印に戻す。
  • ★★文字列 ' 計算の終り 'を出力する。
  •   終わり。
このアルゴリズムにもとづいて作成したプログラムが、次のプログラム例 1c です。

プログラムの例 1c
プログラム
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
c Example 1c     四則演算
c  建築学科 2年  xxxxxxx  my name
c234567890  File = reidai1c.f
      integer m,n,wa,sa,seki,sho,amari
  101 continue
      write(*,*)   '  input  m,n = '
      read(*,*,end=901)  m,n 
      wa=m+n
      sa=m-n
      seki=m*n
      sho=m/n
      amari=m-n*sho
      write(*,*) m,n,wa,sa,seki,sho,amari
      go to   101
  901 write(*,*)  ' 計算終わり '
      stop
      end


 このプログラムの構成を次に示します。

                : 
     ┌→  101 continue
     │        write(*,*)   '  input  m,n = '    
     │        read(*,*,end=901) m,n →データが終わりの時 ──┐
     │          ┌────────────────────┐    │
     │          │ 和、差、積、商、余りを計算し、    │    │
     │          │ 2つの値と、計算結果をすべて出力する │    │
     │          └────────────────────┘    │
     └──    go to   101                        │
           901 write(*,*) ' 計算終わり '    ←───────┘
                : 

 入力した一組のデータについて計算や出力などの一連の処理を終えたら、次のデータを読み込むように実行の流れを戻します。このために挿入された行が5行目と13行目です。

13行目の goto文は、実行の流れを指定された文番号(ここでは 101)を持つ文に無条件に移動します。5行目は goto文の戻り先(ここではデータを読み込むところ)を示すcontinue文です。

  5行目    101 continue
   と
13行目        go to   101

この2行を挿入しただけですと、プログラムの実行はデータを入力するところへ必ず戻るので、プログラムの実行を終えるには強制終了しなければなりません。そこで、データが終わりの時は通常の計算をせずに、「 計算終わり 」と表示して終わるようにしたのが7行目と14行目です。

  7行目        read(*,*,end=901)  m,n
   と
14行目    901 write(*,*) ' 計算終わり '

 7行目のread文は、先のプログラム例 1b の  read(*,*) m,n ファイル終了指定子 end=901 をつけ加えたもので、データの入力が終わりの時は指定された文番号(ここでは 901)を持つ文に実行の流れを移します。キーボードからデータ入力の終わりを示すには Ctrl + C を押します。14行目は文番号 901 を持つ文で、入力が終わりの時の飛び先になります。ここではwrite文で「 計算終わり 」と画面に出力します。

 ここで示したようにプログラムを作成する時には、できるだけ汎用的な(一般的な)プログラムになるように考えます。例題1はプログラム例 1c でデータに 789 と 54 を入力した場合に相当します。



Fortranの文法参照