FORTRANのHello World

第22回は、FORTRANでのHello Worldです。FORTRANでは、リスト1のようにWRITE文を使って記述します。各行の行頭から6文字分は、行番号などのために確保されているため、プログラムは行頭から(半角)スペース6個分空けてから書き始めます。

FORTRANのプログラムは、大文字と小文字を区別しないため、ここではすべて大文字で記述しています。ただし、文字列本体の大文字と小文字はそのままの状態で解釈されます。

文字列は、シングルクォートまたはダブルクォートで囲みます。どちらも同じ意味になります。

WRITE文の( )の中の左側の「*」は、デフォルトの出力装置(標準出力)に出力することを表します。その右側の「'(A)'」は、書式指定(フォーマット)として文字型のデータを出力するすることを指定しています。文字列の出力のあと、改行コードも出力されます。

リスト1 WRITE文を使う(fortran_write.f)

FORTRANのプログラムは、実行例1のようにコンパイルして実行します。ここでは、コンパイラとしてGNUのg77を使用しています。

実行例1 FORTRANのコンパイルと実行

装置番号を明示指定する場合

WRITE文などで指定する装置番号のうちのいくつかは、標準入力は5番、標準出力は6番、標準エラー出力は0番というように、あらかじめ定義されています。

前掲リスト1では「*」で指定していた装置番号を、「6」と指定し、標準出力への出力を明示することができます(リスト2)。同様に、「0」を指定して、標準エラー出力に出力することもできます。

リスト2 装置番号を明示指定(fortran_write2.f)

フォーマットとして文字列を直接記述

フォーマット指定として、直接文字列を記述してしまうこともできます(リスト3)。フォーマットの中で、クォートされた部分はそのまま文字列とみなされますが、ここではクォートがネスティングされるため、内側をダブルクォートにしています。

リスト3 フォーマットとして文字列を直接記述(fortran_write3.f)

クォートを使わずに文字列を記述

フォーマットとして「H」を使うと、クォートを使わずに文字列を記述できます(リスト4)。「11H」は、この直後の11文字分が、そのままの文字列であることを表します。

リスト4 クォートを使わずに文字列を記述(fortran_write4.f)

改行を抑制する方法

フォーマットの最後に「$」を付加すると、改行なしでの出力ができます。リスト5は、改行なしの出力を試すため、前半「Hello 」を改行なしで出力し、同じ行の続きに「World」を出力するというものです。

リスト5 改行を抑制(fortran_write5.f)

PRINT文を使う方法

WRITE文で出力装置番号として「*」を指定する場合は、これをPRINT文で簡潔に記述することができます(リスト6)。PRINT文では、出力装置番号の指定がなくなったほか、括弧やカンマの付け方が変わります。

リスト6 PRINT文を使う方法(fortran_print.f)

PRINT文のフォーマットとして文字列を直接記述

同様に、PRINT文を使って、そのフォーマットとして文字列を直接記述してもかまいません。前掲リスト3をPRINT文で書くと、リスト7のようになります。

リスト7 PRINT文のフォーマットに文字列を記述(fortran_print2.f)

FORMAT文を使う方法

WRITE文やPRINT文で使用するフォーマットは、FORMAT文であらかじめ記述しておくことができます。WRITE文やPRINT文には、FORMAT文の行番号を記述します。リスト8はWRITE文を使う場合です。

リスト8 FORMAT文を使う方法(fortran_format.f)

PRINT文とFORMAT文を使う方法

同様に、PRINT文でFORMAT文を使うとリスト9のようになります。

リスト9 PRINT文とFORMAT文を使う(fortran_format2.f)

FORMAT文に文字列を直接記述

FORMAT文を使う場合でも、そのFORMAT文自体に文字列を記述してしまうことができます(リスト10)。

リスト10 FORMAT文に文字列を直接記述(fortran_format3.f)

文字型変数に代入

もう少しプログラムらしく、出力する文字列をいったん変数に入れてみましょう(リスト11)。文字列を代入する変数は、このように長さ11の文字型の変数として宣言します。

リスト11 文字型変数に代入(fortran_char.f)

文字型配列に代入

FORTRANでは、長さ2以上の文字型の変数と、文字型の配列とは異なります。文字型の配列を使う場合は、リスト12のようになります。ここでは、配列の各要素に文字を1文字ずつ代入しています。配列への代入にはDATA文を使います。WRITE文のフォーマットの'(11A1)'は、11個の配列要素から、1文字ずつ出力するという意味です。

リスト12 文字型配列に代入(fortran_data.f)

DO文でループする

さらに、DO文によるループを使ってみましょう。ここでは、文字型配列に1文字ずつ代入したあと、これをDO文のループで1文字ずつWRITEしています(リスト13)。DO文には、ループの終了の行番号と、ループ変数とその値の範囲を記述します。ループの終了行には、何も実行しないCONTINUE文を使うのが普通です。ループ中のWRITE文では改行なしで1文字ずつ出力し、ループを抜けた後のWRITE文では、フォーマットを空にして、改行のみを出力しています。

リスト13 DO文でループ(fortran_do.f)

暗黙のDOを使う

明示的にDO文を記述せずに、暗黙のDOと呼ばれる方法で、式の中にループを記述することもできます(リスト14)。これは、WRITE文の右に「C(1), C(2), C(3),...」と並べたのと同じことになるため、WRITE文のフォーマットには、'(11A)'を指定します。

リスト14 暗黙のDO(fortran_do2.f)