とても分かりにくいと思いますが、お願いします!!
とても分かりにくいと思いますが、お願いします!!
今回したいことは、以下です。
(ⅰ)
今、手元にテキストファイルがあり、その中身が
[x]
3
3.1
3.3
3.2
3.5
・
・
・
と、改行されたデータ[x]だとします。
この1行目、つまり1ポイント目のデータ [3] を読み込み x*exp(t)のxに代入し、さらにtに対するプロットにして返したいのです。
具体的にいうと、例えば、3*exp(t) t=0で t+=0.2 ずつ増えていくときの関数の値を返したいのです。
こうすると、出力データはおそらく
[t] [x*exp(t)]
0 ?
0.2 ?
0.4 ?
以下略
という風になろうかと思います。これを、ファイル内の各データ[x]すべてに対して、行いたいと思っています。
(ⅱ)
このデータ[x]が、100ポイントからなるデータだとします。(実際は数千ポイントあります。)
実は、このデータ[x]はもともと、時間[t]に対してプロットされたものであり、
[t] [x]
0 3
0.2 3.1
以下略
というような恰好になっています。(実際、テキストファイルの中に、このtの値はありません)
このtと、(ⅰ)のtは、別物と思ってもらっていいです。
このデータ[x]が100ポイントからなるものだとして(つまり0 <= t <= 19.8)
(ⅰ)を対応させたとき(x*exp(t))
1ポイント目のデータ[3]に対してはt=0 から t+=0.2 で、データ数と同じ100ポイントを返し。
2ポイント目のデータ[3.1]に対しては、t=0 から t+=0.2 で、データ数-1の99ポイントを返し
3ポイント目は・・・・98ポイント
と、していきたいのです。
更に、この100,99,98,97・・・・ポイントのデータを、すべて足していきたいのですが
この時、やりたい足し方というのが以下です。
分かりやすく3ポイントで説明すると
1ポイント目に対しては、データが3ポイント。2ポイント目だと3ポイント・・・となっていくので、各返り値は
[t] (1) (2) (3)
0 a e h
0.2 b f i
0.4 c g
0.6 d
という個数関係に、なろうとおもいます。
このとき、この表の(1)の4ポイント目+(2)の3ポイント目+(3)のポイント目という風に足していきたいのです。
つまり
(1) (2) (3)
a ・ ・
b + e ・
c + f + h
d + g + i
と、したものを最終的な 出力ファイルとしたいのです。
なので元々のデータファイルに100ポイントあるものに対しては、1ポイントめに100ポイント、2ポイント目に99ポイント・・・となって
1の100番目+2の99番目+3の・・・=最終的な100ポイント目のデータ
1の99番目+2の98番目+・・・=最終的な99ポイント目のデータ
という具合にして、テキストファイルに出力したいのです。
これで、一応は今回の質問は終了です。
(ⅰ)に関してはfor文でなんとかなるかな?とも思うのですが、(ⅱ)に関してはどうしていいものかサッパリです。
自分で書いていても、「プログラムを勉強する前に日本語を勉強しろ!」
と言われそうな文章で、とても申し訳ないです。
もしこのように長い文章を読んでくださって、さらに親切にも答えてくださる方がいると幸いです。
(ⅰ)
今、手元にテキストファイルがあり、その中身が
[x]
3
3.1
3.3
3.2
3.5
・
・
・
と、改行されたデータ[x]だとします。
この1行目、つまり1ポイント目のデータ [3] を読み込み x*exp(t)のxに代入し、さらにtに対するプロットにして返したいのです。
具体的にいうと、例えば、3*exp(t) t=0で t+=0.2 ずつ増えていくときの関数の値を返したいのです。
こうすると、出力データはおそらく
[t] [x*exp(t)]
0 ?
0.2 ?
0.4 ?
以下略
という風になろうかと思います。これを、ファイル内の各データ[x]すべてに対して、行いたいと思っています。
(ⅱ)
このデータ[x]が、100ポイントからなるデータだとします。(実際は数千ポイントあります。)
実は、このデータ[x]はもともと、時間[t]に対してプロットされたものであり、
[t] [x]
0 3
0.2 3.1
以下略
というような恰好になっています。(実際、テキストファイルの中に、このtの値はありません)
このtと、(ⅰ)のtは、別物と思ってもらっていいです。
このデータ[x]が100ポイントからなるものだとして(つまり0 <= t <= 19.8)
(ⅰ)を対応させたとき(x*exp(t))
1ポイント目のデータ[3]に対してはt=0 から t+=0.2 で、データ数と同じ100ポイントを返し。
2ポイント目のデータ[3.1]に対しては、t=0 から t+=0.2 で、データ数-1の99ポイントを返し
3ポイント目は・・・・98ポイント
と、していきたいのです。
更に、この100,99,98,97・・・・ポイントのデータを、すべて足していきたいのですが
この時、やりたい足し方というのが以下です。
分かりやすく3ポイントで説明すると
1ポイント目に対しては、データが3ポイント。2ポイント目だと3ポイント・・・となっていくので、各返り値は
[t] (1) (2) (3)
0 a e h
0.2 b f i
0.4 c g
0.6 d
という個数関係に、なろうとおもいます。
このとき、この表の(1)の4ポイント目+(2)の3ポイント目+(3)のポイント目という風に足していきたいのです。
つまり
(1) (2) (3)
a ・ ・
b + e ・
c + f + h
d + g + i
と、したものを最終的な 出力ファイルとしたいのです。
なので元々のデータファイルに100ポイントあるものに対しては、1ポイントめに100ポイント、2ポイント目に99ポイント・・・となって
1の100番目+2の99番目+3の・・・=最終的な100ポイント目のデータ
1の99番目+2の98番目+・・・=最終的な99ポイント目のデータ
という具合にして、テキストファイルに出力したいのです。
これで、一応は今回の質問は終了です。
(ⅰ)に関してはfor文でなんとかなるかな?とも思うのですが、(ⅱ)に関してはどうしていいものかサッパリです。
自分で書いていても、「プログラムを勉強する前に日本語を勉強しろ!」
と言われそうな文章で、とても申し訳ないです。
もしこのように長い文章を読んでくださって、さらに親切にも答えてくださる方がいると幸いです。
- bitter_fox
- 記事: 607
- 登録日時: 14年前
- 住所: 大阪府
Re: とても分かりにくいと思いますが、お願いします!!
フォーラムルールに則った質問をしていただけますでしょうか??
質問文を見ると課題のようにも見えますが、課題でないのであれば以下は無視してください。
また、この掲示板は「課題の丸投げ(問題文だけ書く事)は禁止です。」となってますが、
「ただし上のように記載してもらえればこれは当てはまりません。」ともありますので、ご返答くだされば問題ありません。
この5点とどこまで出来たのかを明示にしてください。(途中でもいいですからコードを載せていただけますでしょうか?その際はcodeタグで囲っていただきますようにお願いします。)フォーラムルール さんが書きました:
1. 自分は今何がしたくて - ここは既に書かれてますので結構です。
2. どう取り組んで(作ったプログラムはどれで
3. どのようなエラーやトラブルで困っていて
4. 自分は何が解らないのか、知りたいのか
5. 今のCの知識はどの程度なのか
この5点をしっかりと明記して下さい。
質問文を見ると課題のようにも見えますが、課題でないのであれば以下は無視してください。
また、この掲示板は「課題の丸投げ(問題文だけ書く事)は禁止です。」となってますが、
「ただし上のように記載してもらえればこれは当てはまりません。」ともありますので、ご返答くだされば問題ありません。
- bitter_fox
- 記事: 607
- 登録日時: 14年前
- 住所: 大阪府
Re: とても分かりにくいと思いますが、お願いします!!
ご返答ありがとうございます。
ファイルから各行のデータを読み取るのは以下のプログラムで可能です。(サンプルです。)
いかがでしょうか。
[hr][修正]
プログラムにバグがあったので修正しました。
[修正]
ファイル内のデータに%lfで読み込めないものがあった時に∞ループに陥ってしまうので修正。
ファイルから各行のデータを読み取るのは以下のプログラムで可能です。(サンプルです。)
#include <stdio.h>
int main()
{
FILE *fp = fopen("filename.txt", "r"); // 第一引数ファイル名
// 第二引数アクセスコントロール
double value;
int input_count;
if (fp == NULL) // エラーチェック
{
printf("file cannot open\n");
return 1;
}
while ((input_count = fscanf(fp, "%lf ", &value)) != EOF) // 読み込みはscanfと同様
{ // ファイルの終端に来るとEOFを返すのでそれが来ない間繰り返す
if (input_count == 1) // 入力に成功した項目数が1つの時(つまりfscanfが成功したとき)
{
printf("%lf\n", value); // 出力してみる。
}
else // 失敗の時
{
fgetc(fp); // 一文字読み込んでカーソルを進めてみる。
}
}
fclose(fp); // 後始末
return 0;
}
[hr][修正]
プログラムにバグがあったので修正しました。
[修正]
ファイル内のデータに%lfで読み込めないものがあった時に∞ループに陥ってしまうので修正。
Re: とても分かりにくいと思いますが、お願いします!!
bitter_foxさん ありがとうございます。
この場合、開くファイルのディレクトリを指定するにはどうすればよいでしょうか。(フォルダがdesktopにあり、その中にテキストファイルがあるとして)
また
読み込んだデータを、関数に代入した値として返す時は
while ((input_count = fscanf(fp, "%lf ", &value)) != EOF)
{
if (input_count == 1)
{
printf("%lf\n", value);
}
else
{
fgetc(fp);
}
}
の if文の後に fun (value) とでもすればよいでしょうか
この場合、開くファイルのディレクトリを指定するにはどうすればよいでしょうか。(フォルダがdesktopにあり、その中にテキストファイルがあるとして)
また
読み込んだデータを、関数に代入した値として返す時は
while ((input_count = fscanf(fp, "%lf ", &value)) != EOF)
{
if (input_count == 1)
{
printf("%lf\n", value);
}
else
{
fgetc(fp);
}
}
の if文の後に fun (value) とでもすればよいでしょうか
- bitter_fox
- 記事: 607
- 登録日時: 14年前
- 住所: 大阪府
Re: とても分かりにくいと思いますが、お願いします!!
うーんと、実行ファイルと場所が違うということでしょうか??hu-mo さんが書きました: この場合、開くファイルのディレクトリを指定するにはどうすればよいでしょうか。(フォルダがdesktopにあり、その中にテキストファイルがあるとして)
であるならば、以下のようにしてください。
fopen("c:\documents and settings\(ユーザー名)\デスクトップ\(フォルダ名)\(テキストファイル名)", "r");
funの引数が不足してることや、printf関数の引数に渡さなければならないことを除いてかつ、出力が画面であればそれで結構です。hu-mo さんが書きました:また
読み込んだデータを、関数に代入した値として返す時は
if文の後に fun (value) とでもすればよいでしょうか
出力をファイルにしたい場合は、別のFILEポインタを用いて、出力します。
Re: とても分かりにくいと思いますが、お願いします!!
無事、ファイルの中身を読み込み、各数値を関数に代入した値を表示することができました。
幾分、データ数が多いのですべて画面上に表示することはできませんでしたが、これはファイルに出力する場合には関係ないと思いますので
ここまででも大きな進歩だと思います。ありがとうございます。
問題はここからなのですが、20行目のif以下を
if (input_count == 1)
{
for(int t=0;t<=100-(0.2*x);t+=0.2) //ここで xは17行目のwhile文の外でdouble x = 0;とでも初期化しておく。
cout<<value*exp(-t); //簡単にcoutとしているが実際はファイルに出力として
x++
}
とすれば、私が言ったような1データずつ減っていくような形になると思うのですがどうでしょうか?
ただこれでは、ただのデータの羅列になってしまい、最終的な(ⅱ)形にもっていくにはどうすればいいのかが分かりません
力になっていただけますか。
幾分、データ数が多いのですべて画面上に表示することはできませんでしたが、これはファイルに出力する場合には関係ないと思いますので
ここまででも大きな進歩だと思います。ありがとうございます。
問題はここからなのですが、20行目のif以下を
if (input_count == 1)
{
for(int t=0;t<=100-(0.2*x);t+=0.2) //ここで xは17行目のwhile文の外でdouble x = 0;とでも初期化しておく。
cout<<value*exp(-t); //簡単にcoutとしているが実際はファイルに出力として
x++
}
とすれば、私が言ったような1データずつ減っていくような形になると思うのですがどうでしょうか?
ただこれでは、ただのデータの羅列になってしまい、最終的な(ⅱ)形にもっていくにはどうすればいいのかが分かりません
力になっていただけますか。
- bitter_fox
- 記事: 607
- 登録日時: 14年前
- 住所: 大阪府
Re: とても分かりにくいと思いますが、お願いします!!
hu-mo さんが書きました: 問題はここからなのですが、20行目のif以下を
とすれば、私が言ったような1データずつ減っていくような形になると思うのですがどうでしょうか?if (input_count == 1) { for(int t=0;t<=100-(0.2*x);t+=0.2) //ここで xは17行目のwhile文の外でdouble x = 0;とでも初期化しておく。 cout<<value*exp(-t); //簡単にcoutとしているが実際はファイルに出力として x++ }
ただこれでは、ただのデータの羅列になってしまい、最終的な(ⅱ)形にもっていくにはどうすればいいのかが分かりません
力になっていただけますか。
exp(-t)と、tをマイナスにしてますが大丈夫ですか??
また、xにファイルからの入力を受け取ってるのでしょうか?
1データずつ減っていくというのはどういった感じでしょうか?
出力はcoutを使わなくてはならないのですか??
データの羅列というのは、改行されていないということだと思いますので。
もし、coutを使うのであれば、
cout << value * exp(-t) << endl;
のようにしてみてください。
最後に、コードを載せる際はcodeタグで囲っていただきますようにお願いします。
Re: とても分かりにくいと思いますが、お願いします!!
質問文が分かりづらくてすみません。
今、このような形になっています。別にここで cout を用いただけで、printf でも問題はないです。
データが減っていく といったのは最初の本文に書いたように
1行目のデータに関しては t が0から100まで。2行目のデータに関しては t が0から99.8まで・・・。を関数に代入した値がほしい ということです。
羅列になる、とかいたのは、最終的に欲しいテキストファイルとして
本文に書いた、データが100ポイントからなるときを考えると
1の100番目の関数代入値+2の99番目返り値関数代入値+3の・・・=最終的な100ポイント目のデータ
1の99番目の関数代入値+2の98番目関数代入値+・・・=最終的な99ポイント目のデータ
という具合にして、テキストファイルに出力したいので、画面に出力するだけとは、話が違ってくるのでは?
ということです。
# include <stdio.h>
# include <math.h>
# include <iostream>
using namespace std;
double expo(double i)
{
double j;
j = exp(-i);
return j;
}
int main(void)
{
FILE *fp = fopen("filename.txt", "r");
double value;
int input_count;
double reduct;
if (fp == NULL)
{
printf("file cannot open\n");
return 1;
}
while ((input_count = fscanf(fp, "%lf ", &value)) != EOF) //
{
if (input_count == 1)
{
for(int t=0;t<=100-(0.2*reduct);t+=0.2)
cout<<value*expo(t); //
reduct++;
}
else
{
fgetc(fp);
}
}
fclose(fp);
return 0;
}
データが減っていく といったのは最初の本文に書いたように
1行目のデータに関しては t が0から100まで。2行目のデータに関しては t が0から99.8まで・・・。を関数に代入した値がほしい ということです。
羅列になる、とかいたのは、最終的に欲しいテキストファイルとして
本文に書いた、データが100ポイントからなるときを考えると
1の100番目の関数代入値+2の99番目返り値関数代入値+3の・・・=最終的な100ポイント目のデータ
1の99番目の関数代入値+2の98番目関数代入値+・・・=最終的な99ポイント目のデータ
という具合にして、テキストファイルに出力したいので、画面に出力するだけとは、話が違ってくるのでは?
ということです。
- bitter_fox
- 記事: 607
- 登録日時: 14年前
- 住所: 大阪府
Re: とても分かりにくいと思いますが、お願いします!!
一応、自分なりに質問をまとめてみたんで、問題がないかどうか教えていだけますか??
IL1を入力の1行目と定義する。
ID1をIL1のデータとする。
OL1を出力の1行目とする。
OD1をOL1のデータとする。
t1を0と定義しtnのnの値が増えるごとに0.2増えると定義する。
また、f(ID1, t1)を、関数fにID1, t1を引数とした際の戻り値と定義する。
というデータが与えられたとき、
出力は といった感じになったらよいのでしょうか??
IL1を入力の1行目と定義する。
ID1をIL1のデータとする。
OL1を出力の1行目とする。
OD1をOL1のデータとする。
t1を0と定義しtnのnの値が増えるごとに0.2増えると定義する。
また、f(ID1, t1)を、関数fにID1, t1を引数とした際の戻り値と定義する。
というデータが与えられたとき、
出力は といった感じになったらよいのでしょうか??
- bitter_fox
- 記事: 607
- 登録日時: 14年前
- 住所: 大阪府
Re: とても分かりにくいと思いますが、お願いします!!
ご質問のプログラムが非常に複雑になってうまくナビゲート出来ないので、プログラムを作らせてもらいました。(完全に僕の実力不足です。)
ですので、予想の出力とあってるかどうかご確認いただけますでしょうか??
その際は、一番下にあるmain関数内の入力ファイル名と出力ファイル名を変更していただきますようにお願いします。
コメントは、また追記として後から、書かせてもらいます。
[hr][編集]
プログラムの出力を追記モードに変更。
[変更]
プログラム内の現在のステージを出力するように変更。
入力されたデータ数が実際のデータ数より多いとき無駄に出力されるのを修正。
ですので、予想の出力とあってるかどうかご確認いただけますでしょうか??
その際は、一番下にあるmain関数内の入力ファイル名と出力ファイル名を変更していただきますようにお願いします。
コメントは、また追記として後から、書かせてもらいます。
#include <stdio.h>
#include <math.h>
int GetInputData(double *input_data, int max_line, FILE *fp_input)
{
int counter = 0;
int input_count;
while ((input_count = fscanf(fp_input, "%lf ", &input_data[counter])) != EOF)
{
if (input_count == 0)
{
fgetc(fp_input);
continue;
}
counter++;
if (counter > max_line)
{
return 0;
}
}
return counter;
}
double Calc(double data, double time)
{
return data*exp(-time);
}
char* OutputData(FILE *fp_output, double *input_data, int now_line)
{
int counter;
double time = 0;
double buf;
double total = 0;
for (counter = 0; counter < now_line+1; counter++, time += 0.2)
{
buf = Calc(input_data[counter], time);
fprintf(fp_output, "%f", buf);
total += buf;
if (counter == now_line)
{
fprintf(fp_output, "=%f\n", total);
}
else
{
fprintf(fp_output, "+");
}
}
}
void OutputAllData(FILE *fp_output, double *input_data, int max_line)
{
int counter = 0;
printf("出力をしています - %*s", 6, "");
for (counter = 0; counter < max_line; counter++)
{
OutputData(fp_output, input_data, counter);
printf("\b\b\b\b\b\b%6d", counter+1);
}
printf("\n");
}
void main()
{
FILE *fp_input, *fp_output;
int max_line;
double *input_data;
int inputed_line;
fp_input = fopen("filename.txt", "r");/* 入力ファイル名 */
if (fp_input == NULL)
{
printf("Error : file cannot open (INPUT FILE)\n");
return;
}
fp_output = fopen("output.txt", "a+");/* 出力ファイル名 */
if (fp_output == NULL)
{
fclose(fp_input);
printf("Error : file cannot open (OUTPUT FILE)\n");
return;
}
printf("入力ファイルのデータの個数を入力してください >> ");
scanf("%d", &max_line);
input_data = (double*)calloc(max_line, sizeof(double));
if (input_data == NULL)
{
printf("Error : メモリを確保できませんでした\n");
return;
}
inputed_line = GetInputData(input_data, max_line, fp_input);
if (inputed_line == 0)
{
printf("Error : 入力されたデータの個数が実際のデータの個数より小さいです。\n");
return;
}
if (inputed_line < max_line)
{
printf("データの個数をキャストしました(%d == > %d)\n", max_line, inputed_line);
max_line = inputed_line;
}
printf("出力をします。\n");
OutputAllData(fp_output, input_data, max_line);
printf("出力を終了しました。\n");
fclose(fp_input);
fclose(fp_output);
free(input_data);
}
プログラムの出力を追記モードに変更。
[変更]
プログラム内の現在のステージを出力するように変更。
入力されたデータ数が実際のデータ数より多いとき無駄に出力されるのを修正。
Re: とても分かりにくいと思いますが、お願いします!!
うわあ!
わざわざありがとうございます。
実力不足なんてとんでもない。
今、手元のデータで試してみたところ
出力が というように、足し合わせる数値が、常に同じ数値となってしまっているようです。
Calc内の式の -time の係数を大きくしていくと aは常に同じで、元データの1行目の値。b,d,fは小さくなっていました。
すみません、思っていた以上に高度なものになってしまったため、具体的に何がおかしいのかが分かりません。
ちなみに
<stdlib>をincludeし、char* OutputData にreturn 0; を書き足しました
わざわざありがとうございます。
実力不足なんてとんでもない。
今、手元のデータで試してみたところ
出力が というように、足し合わせる数値が、常に同じ数値となってしまっているようです。
Calc内の式の -time の係数を大きくしていくと aは常に同じで、元データの1行目の値。b,d,fは小さくなっていました。
すみません、思っていた以上に高度なものになってしまったため、具体的に何がおかしいのかが分かりません。
ちなみに
<stdlib>をincludeし、char* OutputData にreturn 0; を書き足しました
- bitter_fox
- 記事: 607
- 登録日時: 14年前
- 住所: 大阪府
Re: とても分かりにくいと思いますが、お願いします!!
いえいえ、どういたしまして、まだまだ実力不足です。hu-mo さんが書きました:うわあ!
わざわざありがとうございます。
実力不足なんてとんでもない。
すみません、
timeのところが逆順になるのをすっかり忘れてました。
下のプログラムで、もう一度お願いします。
あぁ、お手間を取らせました、OutputDataの方は仕様変更をすっかり忘れてましたwww(はい、言い訳です。hu-mo さんが書きました:ちなみに
<stdlib>をincludeし、char* OutputData にreturn 0; を書き足しました
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
//
// ファイル内の文字列の長さを取得する
////////////////////////////////////////////////////////////////////////////////
int GetFileLength(FILE *fp)
{
int now_position;
int length;
now_position = ftell(fp); // 現在の位置を保存しておく
fseek(fp, 0, SEEK_END); // ファイルの最後までカーソルを持っていく
length = ftell(fp); // 現在の位置を取得する (= ファイル全体の大きさ)
fseek(fp, now_position, SEEK_SET); // 最初に保存していた位置に戻す
return length;
}
//
// 項目数を返す。
////////////////////////////////////////////////////////////////////////////////
int GetInputDataCount(FILE *fp_input)
{
int counter = 0;
int length = GetFileLength(fp_input); // ファイル全体の大きさを取得する
char *str = (char*)calloc(length+1, sizeof(char)); // +1は文字列の最後のNULL文字を考慮
int now_position = ftell(fp_input); // 現在の位置を保存しておく
for (counter = 0; fgets(str, length, fp_input) != NULL; counter++) // EOFが来るまで一行ずつ読み込む
{
// その間、counterはインクリメントされる。
}
fseek(fp_input, now_position, SEEK_SET); // カーソルを最初に保存した位置に戻す
return counter; // 結果的に、counterの値は、改行回数にあたり、改行回数が項目数にあたる
}
//
// 第一引数に、入力データを取得する。
////////////////////////////////////////////////////////////////////////////////
int GetInputData(double *input_data, int max_line, FILE *fp_input)
{
int counter = 0;
int input_count;
// ファイルの終端に来るまで入力を取得する
while ((input_count = fscanf(fp_input, "%lf ", &input_data[counter])) != EOF)
{
if (input_count == 0) // 入力が正常に行われなかったら、∞ループに陥るので、カーソルを一つ進める。
{
fgetc(fp_input);
continue;
}
counter++; // counterは読み込んだ項目数
if (counter > max_line) // それが、予期された項目数より多かったら
{
return 0; // エラー
}
}
return counter; // 読み込んだ項目数を返す。
}
//
// data*exp(-time)を返します。
////////////////////////////////////////////////////////////////////////////////
double Calc(double data, double time)
{
return data*exp(-time);
}
//
// データを出力します。(この関数は一つのデータを出力します。)
////////////////////////////////////////////////////////////////////////////////
void OutputData(FILE *fp_output, double *input_data, int now_line)
{
int counter;
double time = now_line * 0.2; // 第一項目は「現在の位置*0.2」
double buf;
double total = 0; // 合計(初期化)
for (counter = 0; counter < now_line+1; counter++, time -= 0.2)
{
buf = Calc(input_data[counter], time); // 計算結果を保存(第counter項)
fprintf(fp_output, "%f", buf); // 第counter項を出力
total += buf; // 合計に加算
if (counter == now_line) // 現在の項目数が、出力予定の項目数に達したら
{
fprintf(fp_output, "=%f\n", total); // 合計を出力
}
else
{
fprintf(fp_output, "+"); // +を出力
}
}
}
//
// すべての項目を計算して出力します。(内部でOutputDataを呼び出してます。)
////////////////////////////////////////////////////////////////////////////////
void OutputAllData(FILE *fp_output, double *input_data, int max_line)
{
int counter = 0;
printf("出力をしています - %*s", 6, ""); // 現在項目数の表示の準備
for (counter = 0; counter < max_line; counter++)
{
OutputData(fp_output, input_data, counter); // 第counter項を出力
printf("\b\b\b\b\b\b%6d", counter+1); // 現在の項目数を表示
}
printf("\n");
}
//
// エントリーポイント
////////////////////////////////////////////////////////////////////////////////
void main()
{
FILE *fp_input, *fp_output; // 入力ファイルと出力ファイル
int max_line;
double *input_data;
int inputed_line;
fp_input = fopen("filename.txt", "r");/* 入力ファイル名 */
if (fp_input == NULL) // 入力ファイルを開けなかったとき
{
printf("Error : file cannot open (INPUT FILE)\n");
return;
}
fp_output = fopen("output.txt", "a+");/* 出力ファイル名 */
if (fp_output == NULL) // 出力ファイルを開けなかったとき
{
fclose(fp_input);
printf("Error : file cannot open (OUTPUT FILE)\n");
return;
}
max_line = GetInputDataCount(fp_input); // 項目数を取得
printf("%d項目が予期されました\n", max_line);
input_data = (double*)calloc(max_line, sizeof(double)); // 入力される項目のメモリを確保
if (input_data == NULL) // 確保できなかった
{
printf("Error : メモリを確保できませんでした\n");
return;
}
// ファイルから入力を取得する
inputed_line = GetInputData(input_data, max_line, fp_input);
if (inputed_line == 0) // エラー
{
printf("Error : 入力されたデータの個数が実際のデータの個数より小さいです\n");
printf("INPUT : 項目数を入力してください >> "); // プログラムの予測が正常でなかったとき
scanf("%d", &max_line); // 手動でもう一度
input_data = (int*)realloc(input_data, max_line * sizeof(int));
if (input_data == NULL)
{
printf("Error : メモリが確保できませんでした\n");
}
fseek(fp_input, 0, SEEK_SET);
inputed_line = GetInputData(input_data, max_line, fp_input);
if (inputed_line == 0)
{
printf("Error : 入力されたデータの個数が実際のデータの個数より小さいです\n");
return;
}
}
if (inputed_line < max_line) // 予期された項目数が多かったら
{
printf("データの個数をキャストしました(%d == > %d)\n", max_line, inputed_line);
max_line = inputed_line;
}
// 出力
printf("出力をします。\n");
OutputAllData(fp_output, input_data, max_line);
printf("出力を終了しました。\n");
// 後始末
fclose(fp_input);
fclose(fp_output);
free(input_data);
}
[修正・コード]
いちいち、項目数を手入力するのはめんどくさいと思うので、項目数を自動で取得するように変更。
[修正・コード]
コメントを付けました。
項目数の自動取得がうまくいかなかったら手動で入力するようにしました。
Re: とても分かりにくいと思いますが、お願いします!!
返信遅れました。
なんと。。。今から勉強したら作るのに半年以上かかるだろうとおもっていたのに
たった半日で、予想もしないほどのレベルの高いものを作っていただけるなんて、恐悦至極です。
今回はbitter_foxさんのご厚意でこんなプログラムを作ってもらえましたが
この経験に甘えないように、何も見ずにこのレベルのプログラムが作れるように精進していきます。
問題なく動いておるようで、これで今日からのデータまとめがサクサクです!
色々とご指導ありがとうございました。
なんと。。。今から勉強したら作るのに半年以上かかるだろうとおもっていたのに
たった半日で、予想もしないほどのレベルの高いものを作っていただけるなんて、恐悦至極です。
今回はbitter_foxさんのご厚意でこんなプログラムを作ってもらえましたが
この経験に甘えないように、何も見ずにこのレベルのプログラムが作れるように精進していきます。
問題なく動いておるようで、これで今日からのデータまとめがサクサクです!
色々とご指導ありがとうございました。