filter.f

単純なフィルタープログラムのFortran版です。

Fortranでは、左から何桁めに何を書くかという約束があります。

コメントの印:
1桁め
文番号:
1..5桁め
継続行の印:
6桁め
本文:
7..72桁め
です。

Fortranでは大文字と小文字の区別がありませんが、この授業の例文では、 原則としてFortran言語の予約語を大文字、変数名などを小文字で書きます。 ただし、予約語であってもサブルーチンや関数の名前などは小文字にする こともあります。

      PROGRAM filter

プログラムの名前を宣言しています。 Fortranでは、PROGRAM文は必須ではありません。

* simple filter
* written by K. Masuda, 1996-04-12

Fortran 77では、コメント(注釈、機械語に翻訳されない人間のための注意書き)は、 第1桁に「C」「c」または「*」を置くことで示します。

      IMPLICIT NONE

Fortranでは、変数をいちいち宣言しないで使うことができます。その場合、 最初の文字が I,J,K,L,M,Nならば整数型、それ以外ならば実数型とみなされます。 この約束は短いプログラムを急いで作る場合には便利なのですが、長いプログラム ではまちがいのもとです。この授業では、短いプログラムでもすべての変数を 宣言して使うのを原則とします。IMPLICIT NONEという宣言文は、変数を宣言 しないで使ったらコンパイル段階でエラー扱いにするという意味です。

      REAL*8  t, z

t, zという2つの倍精度(8バイト)実数型の変数を宣言しています。 (厳密にいうと、Fortran 77 標準にはDOUBLE PRECISIONという宣言があり、 REAL*8という宣言はありません。ここでは、単精度か倍精度かというよりは 10進で約15桁の有効数字をとれる浮動小数点型変数を使いたいという趣旨な ので、REAL*8 と書くことにします。

*

ここまでが宣言部、ここからが実行部です。 ただし、Fortranでは、宣言部と実行部を区別する印はありません。

      DO WHILE ( .TRUE. )

DO文はループを作ります。対応する END DO までの内容を、WHILE の かっこの中の条件(論理式)が真である間くりかえします。今の場合、 条件は常に真ですから、無限ループを作っていることになります。 DO WHILEはFortran 77標準にはなく、90標準で追加された機能ですが、 77標準の範囲で書くと「GO TO」文が必要になるので、この授業の例文では DO WHILEを使っていくことにします。

        READ(*,*,END=9900) t, z

t, z という2つの変数の値を読み込みます。 かっこの中の1つめの星印は、標準入力のテキストファイル (リダイレクションをしていなければキーボード)から読むことを意味します。 2つめの星印は、入力の書式を「適当に」仮定して読むことを意味します。 データファイルの何桁めまでが何という指定ではなく、数値の間が空白文字で 区切られていると仮定するのです。 「END=」という指定は、入力ファイルの終わりにぶつかったら、そのあとに 示してある文番号にとぶことを意味します。これでDOループの外に出るので、 このDOループは実際には無限ループにはなりません。

        IF ( .TRUE. ) THEN

IF..THEN..ENDIF構造は、IFのかっこの中にある条件(論理式)が真のときに THENとENDIFの間の一連の文を実行するという意味です。条件が偽のときに 実行する文がある場合は、ELSE文を併用します。 この例文では条件が常に真になるのでIFで囲む意味はないのですが、 プログラムを変更するきっかけとしてわざと入れてあります。

          WRITE(*,'(2F20.10)' ) t, z

t, zという2つの変数の値を書き出します。 かっこの中の1つめの項目である星印は、標準出力のテキストファイル (リダイレクションをしていなければ端末画面)に書くことを意味します。 2つめの項目の文字列は、書くのに使う書式指定です。2つの変数にそれぞれ 20桁使い、そのうち小数部に10桁を使うことを指定しています。

        END IF

IFブロックの終わりです。

      END DO

DOループの終わりです。

 9900 CONTINUE

「END=」でとんで来るところです。CONTINUE文は「何もしない文」で、文 番号をつけるところに何か文を書かなくてはならないので形式上入れて あります。

      END

プログラムの終わりです。ただし、Fortranではプログラムが複数のサブプロ グラム(サブルーチン、関数)からなる場合、各サブプログラムの終わりに END文を置きます。


1996-04-29; 2000-04-18; 2002-07-11
増田 耕一 (MASUDA Kooiti)

[例文filterの説明(共通)]