• 締切済み

cでわからないのでお願いします。

とあるファイルから2列の平均や合計を求めたいのですが、どのように組めばいいのかわからないので質問します。 行いたい作業は2列あるファイルから1列目の合計の計算、2列目の合計の計算、1列目1行と2列目1行をかけたものの合計の計算です。この後、まだまだ作業が続くのですが、これさえ組めれば後は自力でいけると思います。 まずは、1列だけあるファイルの計算を組んでみました。以下のプログラムがそれです。 #include <stdio.h> #include <stdlib.h> int main() { FILE* fp; /*ファイルポインタ*/ char filename[11] = "h.txt"; /*使用するファイル名*/ char buf[1000]; /*ファイルの文字を読むのに必要*/ int i=0,tmp[11]={0}, num = 0; /*色んな変数*/ float sum = 0.0; /*合計に使う変数*/ double ave; /*平均に使う変数*/ fp = fopen( filename, "r" ); /*エラー報告*/ if( fp == NULL ) { printf("ファイルが開けませんでした\n"); exit( 1 ); } /*合計の計算*/ for(i=0;i<=11;i++) { fscanf(fp,"%d",&tmp[i]); sum += tmp[i]; } fclose( fp ); fp = fopen( filename, "r" ); /*行数のカウント*/ while(NULL != fgets(buf, 1000, fp)) { ++num; } ave = sum / num; /*平均を計算*/ printf("合計 : %f\n", sum ); /*合計を表示*/ printf("平均点 : %f\n", ave );     /*平均を表示*/ fclose( fp ); return 0; } ただ、ここから2列のファイルを計算させてやろうとしても訳が分からなくなってしまいます。どなたかわかる人よろしくお願いします。 ちなみに、h.txtは適当な 100 99 98 97 96 のようなファイルです。 2列のファイルも 1 99 2 97 3 95 4 93 のようなファイルでこれを計算したいのです。 よろしくお願いします。

みんなの回答

回答No.1

まず、それらしいソースをどこから持ってきて組み立てるということは辞めた方が良いです。 提示されたソースは、とても不自然なソースです。 1) for(i=0;i<=11;i++) の行の 11 という数字はどこから出てきましたか? 2) この後、行数をカウントしていますが、なぜですか? 3) もしも、100行ぐらいのファイルを処理したらどういうことが起こるでしょうか? 4) temp[11] という配列は、この処理の場合、配列でなければならないでしょうか? さて、 たとえば、 int d; という変数に対して、 fscanf(fp,"%d",&d); を実行すると、変数 d に、ファイルの中のデータを数値として順次読み込んでくれます。 同じように、 int a, b; に対して、 fscanf(fp,"%d %d",&a, &b); で、ファイルの中のデータを順次、a と b に読み込んでくれます。 言い換えると(ファイルの形が間違っていない限り)1列目をa に、2列目を b に 順次読み込んでくれます。 なので、 fscanf(fp, "%d &d", &a, &b); sumA += a; sumB += b; sumAB += a * b; を繰り返せば、目的を果たすことができます。 さて、「繰り返せば」ということなのですが、「ファイルの中にデータがあるまで」になります。 この判定をどうするかです。 あらかじめ行数がわかっていれば、その行数分繰り返せばいいわけですが。 さて、ファイルの終わりまで来てしまって、なおかつ、fscsnf() を呼び出すと、fscanf() は、EOF を返します。 だから、 while(fscanf(fp, "%d %d", &a, &b) != EOF) { sumA += a; sumB += b; sumAB += a * b; } というループになります。 あと、sumA, sumB, sumAB は事前に初期化する必要があります。 しかし、なぜ、わざわざ「一列のデータの(合計ではなく)平均を求める」プログラムを提示されたのは、不思議な気はします。

関連するQ&A

専門家に質問してみよう