FORTRAN

科学技術計算を効率的に記述できるよう、 数式をほぼそのまま表現できるように作られたのがFORTRANである。 最古クラスの言語でありながら今でも進化を続けていて、 現代風の書き方もできるが、ここでは歴史を味わう意味で Fortran77について述べる。

Fortran77の基本文法

カラム指向

暗黙の変数宣言

配列

配列は変数宣言のあとDIMENSIONで最大要素数を指定する。

DIMENSION x(50)			! x(1)からx(50)まで
DIMENSION x(0:49)		! x(0)からx(49)まで
DIMENSION x(20,20)		! x(0,0)からx(20,20)まで

制御構造

IFとDOループとGOTOとサブルーチンコールのみ。

IF文

IF (条件式) THEN
ELSE IF (条件式2) THEN
 :
ELSE
ENDIF

関係演算子および論理演算子は以下のものが使える。

演算子意味
.LT.Less Than (<)
.GT.Grater Than (>)
.LE.Less Than or Equal(<=)
.GE.Grater Than or Equal (>=)
.EQ.Equal (==)
.NE.Not Equal (!=)
.AND.AND
.OR.OR

DO文

ループはDO文にて構成する。整数変数の値の変化で繰り返し回数を 制御する。FORTRAN77では繰り返し範囲の指定に文番号が必要な形式のみが、 FORTRAN95からは対応するENDDOを自動的に繰り返し範囲と見なす形式も 利用できる。

         DO 文番号 整数変数 = 開始値, 終了値 [, 刻み]
	    繰り返し処理
文番号   CONTINUE

CONTINUEはその行に文番号を置くための場所とりであり、 意味のある次の処理を書いてもよい。文番号は重複がないよう把握管理する 必要がある。

ENDDOを用いる書式には文番号は必要ない。

         DO 整数変数 = 開始値, 終了値 [, 刻み]
	    繰り返し処理
         ENDDO

ループを途中で抜ける場合、FORTRAN77ではGOTO文でループ範囲外の行番号に ジャンプするしかない。

      DO 10 I=1,100
        処理……
	IF (何かの条件) GOTO 110
  100 CONTINUE
  110 次の処理

Fortran95ではループを抜けるEXITが利用できる。

関数とサブルーチン

関数の定義はFUNCTIONで、サブルーチンの定義は SUBROUTINEで開始する。いずれも参照渡しの引数を 取ることができる。

      [] FUNCTION 関数名(引数リスト)
        定義本体
        関数名 = 
      END
あるいは
      SUBROUTINE 関数名(引数リスト)
        定義本体
      END

関数とサブルーチンの違いは、呼び側に値を返すかどうかのみで、 関数の返却値を設定するには関数名と同名変数に値を代入する。 返す値の型は関数定義の直前に宣言する。

INTEGER FUNCTION foo(x)
  処理…処理…
  foo = 結果の値(この場合INTEGER)
END

型を省略すると関数名の先頭 英字の暗黙の型ルールに従う。

入出力

入出力は READ, WRITE で行なう。

READ(デバイス, フォーマット) [読み込み先変数...]
WRITE(デバイス, フォーマット) [読み込み先変数...]

デバイスに * を指定すると標準入出力が用いられる。 フォーマットに * を指定すると「適当に」値が解釈される。

フォーマットは「個数 型 桁数」の並びを指定する。
例:

I33桁の整数
F12.512桁(小数点以下5桁)の実数
E12.5指数表記で12桁(小数点以下5桁)の実数
3A123個の「12桁の文字列」

整数変数Iを3桁で、実数変数Xを10桁(小数以下3桁)で出力するときは 以下のようにする。

WRITE(*, '(I3, F10.3)') I, X

改行なしで出すには第3引数に advance='no' を指定する。

WRITE(*, '(A)', advanced='no') 'Input N: '
READ(*, *) N

Hello, world!

いくつか例を示す。

hello.f

C
C     Hello World!
C
      PROGRAM main
      WRITE(*,'(A)') 'Hello, world!'
      END PROGRAM main

hello-10.f

C
C     Hello World! x 10 times
C
      PROGRAM main
      DO 10 I=1, 10
         WRITE(*,'(A)') 'Hello, world!'
 10   CONTINUE
      END PROGRAM main

問題

  1. 2重ループで九九の表を出力するプログラムを作成せよ。

  2. FizzBuzzプログラムを作成せよ

解答例: kuku.f

リンク集