filter.p

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

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

PROGRAM filter(input, output);

プログラムの名前を宣言しています。 かっこの中は、使用するファイル変数名(プログラム内で使う名前であって、 Unix上のファイル名ではない)です。inputはUnixの標準入力、outputは標準出力に 対応しています。

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

Pascalでは、コメント(注釈、機械語に翻訳されない人間のための注意書き)は、 波かっこでかこみます。 (* comment *) のように、かっこと星印を使うこともあります。

{ to be used on DEC Alpha OSF/1 }

同じPascalでも他の機種用のコンパイラではファイル入出力関係の動作が少し 違うようなので、この機種(DEC Alpha), OS (OSF/1)用であることをことわっておきました。

VAR     t, z :  DOUBLE;  { DOUBLE is valid in DEC Pascal }

t, zという2つの倍精度(8バイト)実数型の変数を宣言しています。 Pascal標準では、実数型変数の型は REAL だけで、単精度、倍精度の区別は ありません。 ここでは、単精度か倍精度かというよりは10進で約15桁の有効数字をとれる 浮動小数点型変数を使いたいという趣旨ですが、DEC社の Pascalコンパイラでは DOUBLE という型を使えばそれが実現できます。

BEGIN

ここまでが宣言部、ここからが実行部です。 この BEGIN は、プログラムの最後の END. と呼応していますが、 実行部の始めの印と考えてよいでしょう。

   WHILE NOT eof(input) DO
   BEGIN

WHILE文はループを作ります。次の文(またはBEGIN..ENDブロック)を、WHILE とDOの間の条件(論理式)が真である間くりかえします。今の場合、条件は、 「ファイル変数inputで指定されたファイル(つまり標準入力)が終わりに ならない限り」というものです。eofはend of fileの略ですが、Pascal言語の 常備している関数です。

      readln( t, z);

t, z という2つの変数の値を読み込みます。readではなくreadlnなので、 データファイルは行末まで読みとばされます。 かっこの中でファイル変数を指定していないので、標準入力のテキストファイル (リダイレクションをしていなければキーボード)から読むことを意味します。 入力の書式は「適当に」仮定されます。 データファイルの何桁めまでが何という指定ではなく、数値の間が空白文字で 区切られていると仮定するのです。

      IF TRUE THEN
      BEGIN

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

         writeln( t:20:10, z:20:10 );

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

      END

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

   END

WHILEループの終わりです。

END.

プログラムの終わりです。


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

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