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 とする(なくてもよい)*/
}
フィルタ?の作り方 教えてください!
Re:フィルタ?の作り方 教えてください!
そのファイルを、real2int.c として、コンパイラで実行ファイルを real2int で動くようにすればいいのですが・・・
コンパイラは何でしょうか?
一般的な UNIX 系であれば、
先に作った real2int.c が置いてあるところで、
cc -o /bin/real2int real2int.c
とすれば、動くと思いますが。
Windows などで、VC++ のコマンドプロンプトなどであれば、
cl real2int.c
で、real2int.exe などがそのままできるので実行できそうですが。
フィルタとは、
入力に対し何らかの選択・変換動作を行い結果を出力する機能を持つものをフィルタと呼ぶことがあるので、
今回の実数を表す文字列を範囲指定された整数を表す文字列に変換動作するプログラムは、
フィルタといってもいいと思います。
次の、棒グラフを表示するプログラムが、foo であるとすれば、
real2int 30 <d9-1.txt | foo
などと、パイプでつなげばいいのですが。
( | が、前のプログラムの標準出力を後のプログラムの標準入力につなげます。通常、これをパイプという)
PS.
とりあえず、先生に、仕様は的確に指示するように言いましょう。
>1.実数ファイルを整数ファイルに変換する.ここに整数ファイルとは,整数の最大値を指定したうえで,実数ファイルが含むすべての値を 0 とこの最大値の間におさまるように相似的に変化させたファイルである(小数点以下は四捨五入とする).
無頓着に考えれば、最大値が指定値、最小が0にして、それを分割していけばいいようですが、
おさまるようにであれば、最大を+無限大、最小を-無限大、とすれば、全て 0 を出力してもかまわなくなります。
PS.2
わすれてました、四捨五入だったら、+0.4 はいけませんね。
コンパイラは何でしょうか?
一般的な UNIX 系であれば、
先に作った real2int.c が置いてあるところで、
cc -o /bin/real2int real2int.c
とすれば、動くと思いますが。
Windows などで、VC++ のコマンドプロンプトなどであれば、
cl real2int.c
で、real2int.exe などがそのままできるので実行できそうですが。
フィルタとは、
入力に対し何らかの選択・変換動作を行い結果を出力する機能を持つものをフィルタと呼ぶことがあるので、
今回の実数を表す文字列を範囲指定された整数を表す文字列に変換動作するプログラムは、
フィルタといってもいいと思います。
次の、棒グラフを表示するプログラムが、foo であるとすれば、
real2int 30 <d9-1.txt | foo
などと、パイプでつなげばいいのですが。
( | が、前のプログラムの標準出力を後のプログラムの標準入力につなげます。通常、これをパイプという)
PS.
とりあえず、先生に、仕様は的確に指示するように言いましょう。
>1.実数ファイルを整数ファイルに変換する.ここに整数ファイルとは,整数の最大値を指定したうえで,実数ファイルが含むすべての値を 0 とこの最大値の間におさまるように相似的に変化させたファイルである(小数点以下は四捨五入とする).
無頓着に考えれば、最大値が指定値、最小が0にして、それを分割していけばいいようですが、
おさまるようにであれば、最大を+無限大、最小を-無限大、とすれば、全て 0 を出力してもかまわなくなります。
PS.2
わすれてました、四捨五入だったら、+0.4 はいけませんね。
Re:フィルタ?の作り方 教えてください!
ありがとうございます。フィルタの使い方がよくわかりました!
実行することもできました。ありがとうございます!!
>わすれてました、四捨五入だったら、+0.4 はいけませんね。
そうですよね!私もおかしいとおもったのですが、答えに0.4とあるので、何か理由があるのかずっと考えてたのですが、答えが間違っていたようですね。0.5に修正します。
実行することもできました。ありがとうございます!!
>わすれてました、四捨五入だったら、+0.4 はいけませんね。
そうですよね!私もおかしいとおもったのですが、答えに0.4とあるので、何か理由があるのかずっと考えてたのですが、答えが間違っていたようですね。0.5に修正します。