科学技術計算を効率的に記述できるよう、 数式をほぼそのまま表現できるように作られたのがFORTRANである。 最古クラスの言語でありながら今でも進化を続けていて、 現代風の書き方もできるが、ここでは歴史を味わう意味で Fortran77について述べる。
INTEGER | 整数型 |
---|---|
REAL | 実数型 |
DOUBLE PRECISION | 倍精度実数型 |
CHARACTER | 文字列型 |
配列は変数宣言のあと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 (条件式) 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文にて構成する。整数変数の値の変化で繰り返し回数を 制御する。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(デバイス, フォーマット) [読み込み先変数...]
デバイスに *
を指定すると標準入出力が用いられる。
フォーマットに *
を指定すると「適当に」値が解釈される。
フォーマットは「個数 型 桁数」の並びを指定する。
例:
I3 | 3桁の整数 |
F12.5 | 12桁(小数点以下5桁)の実数 |
E12.5 | 指数表記で12桁(小数点以下5桁)の実数 |
3A12 | 3個の「12桁の文字列」 |
整数変数Iを3桁で、実数変数Xを10桁(小数以下3桁)で出力するときは 以下のようにする。
WRITE(*, '(I3, F10.3)') I, X
改行なしで出すには第3引数に advance='no'
を指定する。
WRITE(*, '(A)', advanced='no') 'Input N: ' READ(*, *) N
いくつか例を示す。
C C Hello World! C PROGRAM main WRITE(*,'(A)') 'Hello, world!' END PROGRAM main
C C Hello World! x 10 times C PROGRAM main DO 10 I=1, 10 WRITE(*,'(A)') 'Hello, world!' 10 CONTINUE END PROGRAM main
2重ループで九九の表を出力するプログラムを作成せよ。
FizzBuzzプログラムを作成せよ
解答例: kuku.f