科学技術計算を効率的に記述できるよう、 数式をほぼそのまま表現できるように作られたのが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