• 締切済み

C言語のファイル入出力の問題です

C言語の課題です ファイルの入出力を応用した関数の総和と平均値を求める問題です。 総和がどうしても0になります 原因を教えて下さい 前問にy=x/(1+x^2)を-10.0≦x≦10.0(xは0.01刻み)の範囲で計算して結果をsp4_rslt.datに出力せよという問題があります。これはそのsp4_rslt.datを最初に読み込んで、今度は0≦x≦10.0の範囲でyの総和と平均を求めなければなりません。 なのでfor文でループしてあとは計算というプログラムにしました。最後に結果をsp6_rslt.datに出力しろというものです。 けれどいくらやっても0にしかなりません。どこを修正すればいいのか教えて下さい #include <stdio.h> #include <stdlib.h> int main(void) { double x,y; double Summation, Average; FILE *fp; fp = fopen("sp4_rslt.dat", "r"); if (fp == NULL) { puts("can't open file!"); exit(-1); } for(x=0.; x<=10.0; x+=0.01){ y = x/(1+x×x); fscanf(fp,"%lf %lf",&x,&y); Summation = Summation + y ; Average = Summation / 1000.0; } fp = fopen("sp6_rslt.dat","w"); fprintf(fp,"Summation is %lf\nAverage is %lf\n",Summation ,Average); fclose(fp); return 0; }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

指摘だけ: 「EOF かどうか」は読み込まないと分からないので, 「feof によるチェック」はしばしば不適切です>#5. 通常は scanf系などで読み込むときに同時に確認する.

回答No.5

まず、ループは「fpがEOFになるまで、無限にループする」にしないといけない。 for(x=0.; x<=10.0; x+=0.01){ を while(!feof(fp)){ に変える。 次に、 y = x/(1+x×x); は無意味だから削る。 fscanf(fp,"%lf %lf",&x,&y); のあと、xが「0≦x≦10.0」の範囲にある時だけ Summation = Summation + y ; を行う。 そして、ループの中で Average = Summation / 1000.0; をやっても意味が無いので、これを削る。 で、後は「yを何回足したか」が判らないと、平均が出せないから、それを「整数の変数を使って数える」必要がある。 あと、ループが終わったあと、fpを閉じてないまま fp = fopen("sp6_rslt.dat","w"); とやってるのも駄目。 それと、結果出力を勝手に解釈して fprintf(fp,"Summation is %lf\nAverage is %lf\n",Summation ,Average); って感じで出力しているのも、落第点。 こんな余計な文字を書かれたら、出力されたファイルを他のプログラムで入力に使用出来ないだろ? 課題に「こういう文字列を付けて出力しなさい」って書いてあった?

  • kzinoue
  • ベストアンサー率12% (1/8)
回答No.4

ファイル内容の入力箇所が計算後になっています。 データが、y=0の場合、Summation=0です。 また、X > 10 ならループは、1度限りで終了です。 > for(x=0.; x<=10.0; x+=0.01){ > y = x/(1+x×x); > fscanf(fp,"%lf %lf",&x,&y); > Summation = Summation + y ; > Average = Summation / 1000.0; > } 書き換えるなら・・・ for(x=0.; x<=10.0; x+=0.01){ fscanf(fp,"%lf %lf",&x,&y); y = x/(1+x×x); Summation = Summation + y ; Average = Summation / 1000.0; } ではないでしょうか? ファイル内のデータを生かす意味でコーディングした場合です。

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.3

>y = x/(1+x×x); fscanf(fp,"%lf %lf",&x,&y); xでループしてるのに、計算してから入力してるし、ここも変ですね。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

y = x/(1+x×x); という文は (「×」も謎だが) 何のためにあるの? あと, 毎回 Average を計算しても意味ないよね. sp4_rslt.dat はどういう形で書かれている?

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.1

>fprintf(fp,"Summation is %lf\nAverage is %lf\n",Summation ,Average); 確認はできていませんが、%lfではなく、%fではないでしょうか?

関連するQ&A