filter.c

Cでは大文字と小文字の区別があります。 習慣として、大文字はdefine文やヘッダファイル(*.h)で定義された定数名に使い、 それ以外の変数名などは小文字を使うのがふつうです。

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

Cでは、コメント(注釈、機械語に翻訳されない人間のための注意書き)は、 「/*」と「*/」でかこみます。

#include <stdio.h>       /* scanf, printf and EOF are defined here */
#include <math.h>
#include <sys/types.h>   /* TRUE is defined here */

「#include」は、そのあとに書いてあるファイルの内容を取りこんでいっしょ にコンパイルすることを意味します。コンパイラに付属するヘッダファイル (*.hの形のファイル)を取りこむ場合は「< ... >」、その他の場合は 「" ... "」を使います。 C言語では、コンパイラに付属する形で常備されている関数を使う場合でも、 その宣言を別のファイルから取りこんでおく必要がある場合があります。 たとえば、この例文で使う入出力関数 printf や scanfや定数EOF は stdio.h、定数 TRUE は sys/types.h というところにあります。 また、指数関数や三角関数など、数学関数は、わりあい簡単なものでも math.h を include しておかないと使えません。今の例文では math.hは 不要なのですが、課題の準備として入れてあります。

int main()
{

このプログラム(のうちのメインプログラム)の始まりの宣言です。 プログラムが複数の関数からなる場合は、それぞれの関数ごとにこのレベル の宣言があります。

  double t, z;

t, zという2つの倍精度実数型の変数を宣言しています。 Cでは単精度実数型 float はあまり使わず、doubleをふつうに使います。 ここでは、単精度か倍精度かというよりは10進で約15桁の有効数字をとれる 浮動小数点型変数を使いたいという趣旨ですが、この教室にあるDEC社の コンパイラを含め、多くの場合、double 型を使えばそれが実現できます。

ここまでが宣言部、ここからが実行部です。 C言語では宣言部と実行部を区分する印はありません。

  while (scanf("%lf%lf", &t, &z) != EOF)
  {

while文はループを作ります。次の文(または波かっこでかこまれたブロック) を、whileに続くかっこの中の条件(論理式)が真である間くりかえします。 今の場合、条件は、「scanfを実行して、その結果の値が EOF でない限り」 つまり、「標準入力のデータが終わりにならない限り」というものです。 「!=」は「等しくない」です。「等しい」は「=」でなく「==」と書きます。 EOFはend of fileの略ですが、Cではstdio.hで定義されている定数です。

scanfの中では、t, z という2つの変数の値を読み込みます。 行末まで読みとばす処理はしていません。このため、1行に3つ以上の数値が 書かれたファイルを読む場合の動作は、PascalやFortranの例文と違います。 標準入力のテキストファイル(リダイレクションをしていなければキーボード) から読みます。 入力の書式は倍精度実数型に対応していればよく、桁数は「適当に」仮定されます。 データファイルの何桁めまでが何という指定ではなく、数値の間が空白文字で 区切られていると仮定するのです。

scanfは、期待と違う文字が入力されたときの動作の対策がじゅうぶんで ないため、本格的なプログラム作りにはこれを利用することは勧められない とされていますが(別記事参照)、 この授業での簡単な例文では便宜上使うことにしました。

    if (TRUE)
    {

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

      printf("%20.10lf%20.10lf\n", t, z);

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

    }

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

  }

whileループの終わりです。

}

(メイン)プログラムの終わりです。


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

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