フィルタ?の作り方 教えてください!
Posted: 2007年10月11日(木) 12:01
C言語初心者です。
「実数ファイルを整数ファイルに変換する」を行なうフィルタ "real2int" を作成しなさい。という課題がでました。フィルタという言葉さえ聞いたことありません;;
問題の全内容はこうです。
「複数の行からなり,1行にひとつの実数値が書かれたファイル(実数ファイルと呼ぶ)」を読み込んで,各行の値を棒グラフで表示する
を,2個のより単純な処理に分解し,それぞれの処理を行なうフィルタを作成してパイプで接続することにより実現することを考えます.
2個のより単純な処理とは,
1.実数ファイルを整数ファイルに変換する.ここに整数ファイルとは,整数の最大値を指定したうえで,実数ファイルが含むすべての値を 0 とこの最大値の間におさまるように相似的に変化させたファイルである(小数点以下は四捨五入とする).
2.整数ファイルを読み込んで,その各行ごとに棒グラフを表示する.ただし棒グラフは,記号 "*" を整数ファイルの各行にある整数値だけ横に並べたものとする.
です.実数ファイルの例 "d9-1.txt" と,最大値を 30 としてこれを変換した整数ファイルの例 "d9-2.txt" ,およびこの整数ファイルに対応した棒グラフの例を参照してください.
そこで問題9-3です.上記の1.に示した処理「実数ファイルを整数ファイルに変換する」を行なうフィルタ "real2int" を作成しなさい.このフィルタは,整数の最大値をオペランドによって指定するものとします.例えば,先に挙げた実数ファイル "d9-1.txt" に対してコマンドライン:
> real2int 30 < d9-1.txt > d9-2.txt
を投入すれば,同じく先に挙げた整数ファイル "d9-2.txt" が得られます(オペランドは 30).
プログラムは答えを見つつ、なんとか理解して作成しました。
でも、real2intというのが拡張子はcでいいのかよくわからなくて、どうしたらいいのか困ってます;
とりあえず、real2int.exeというプログラムを作って、> real2int 30 < d9-1.txt > d9-2.txt を投入してみたのですが、やはりできません。
一応答えのプログラムものせます。
#include <stdio.h>
#include <stdlib.h>
#define MAX 200
int main(int argc, char *argv[/url])
{
float input[MAX], max, min, ratio;
int i = 0, n, imax, k;
/* ↓ オペランドは1個だけ.これ以外の場合は "** Error! **"
を表示して停止する.exit() は処理を終了する関数.
引数は正常終了なら 0 ,異常終了なら 1 と定められている.*/
if(argc != 2) { printf("** Error! **\n"); exit(1); }
imax = atoi(argv[1]);
scanf("%e", &input[0]);
max = min = input[0];
while(scanf("%e", &input[++i]) != EOF)
{
if(input > max) max = input;
if(input < min) min = input;
}
fprintf(stderr, "max =%9.2e, min =%9.2e\n", max, min);
ratio = imax/(max - min);
n = i;
for(i = 0; i < n; i++)
{
k = (input - min)*ratio + 0.4;
printf("%3d\n", k);
}
exit(0); /* ← 正常終了は 0 とする(なくてもよい)*/
}
「実数ファイルを整数ファイルに変換する」を行なうフィルタ "real2int" を作成しなさい。という課題がでました。フィルタという言葉さえ聞いたことありません;;
問題の全内容はこうです。
「複数の行からなり,1行にひとつの実数値が書かれたファイル(実数ファイルと呼ぶ)」を読み込んで,各行の値を棒グラフで表示する
を,2個のより単純な処理に分解し,それぞれの処理を行なうフィルタを作成してパイプで接続することにより実現することを考えます.
2個のより単純な処理とは,
1.実数ファイルを整数ファイルに変換する.ここに整数ファイルとは,整数の最大値を指定したうえで,実数ファイルが含むすべての値を 0 とこの最大値の間におさまるように相似的に変化させたファイルである(小数点以下は四捨五入とする).
2.整数ファイルを読み込んで,その各行ごとに棒グラフを表示する.ただし棒グラフは,記号 "*" を整数ファイルの各行にある整数値だけ横に並べたものとする.
です.実数ファイルの例 "d9-1.txt" と,最大値を 30 としてこれを変換した整数ファイルの例 "d9-2.txt" ,およびこの整数ファイルに対応した棒グラフの例を参照してください.
そこで問題9-3です.上記の1.に示した処理「実数ファイルを整数ファイルに変換する」を行なうフィルタ "real2int" を作成しなさい.このフィルタは,整数の最大値をオペランドによって指定するものとします.例えば,先に挙げた実数ファイル "d9-1.txt" に対してコマンドライン:
> real2int 30 < d9-1.txt > d9-2.txt
を投入すれば,同じく先に挙げた整数ファイル "d9-2.txt" が得られます(オペランドは 30).
プログラムは答えを見つつ、なんとか理解して作成しました。
でも、real2intというのが拡張子はcでいいのかよくわからなくて、どうしたらいいのか困ってます;
とりあえず、real2int.exeというプログラムを作って、> real2int 30 < d9-1.txt > d9-2.txt を投入してみたのですが、やはりできません。
一応答えのプログラムものせます。
#include <stdio.h>
#include <stdlib.h>
#define MAX 200
int main(int argc, char *argv[/url])
{
float input[MAX], max, min, ratio;
int i = 0, n, imax, k;
/* ↓ オペランドは1個だけ.これ以外の場合は "** Error! **"
を表示して停止する.exit() は処理を終了する関数.
引数は正常終了なら 0 ,異常終了なら 1 と定められている.*/
if(argc != 2) { printf("** Error! **\n"); exit(1); }
imax = atoi(argv[1]);
scanf("%e", &input[0]);
max = min = input[0];
while(scanf("%e", &input[++i]) != EOF)
{
if(input > max) max = input;
if(input < min) min = input;
}
fprintf(stderr, "max =%9.2e, min =%9.2e\n", max, min);
ratio = imax/(max - min);
n = i;
for(i = 0; i < n; i++)
{
k = (input - min)*ratio + 0.4;
printf("%3d\n", k);
}
exit(0); /* ← 正常終了は 0 とする(なくてもよい)*/
}