• 締切済み

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

  • c言語 for文

    /*指定された個数だけ整数を読み込んで合計値・平均値を算出*/ #include <stdio.h> int main(void) { int i; int sum=0; int num,tmp; printf("整数は何個ですか:"); scanf("%d",&num); for(i=0;i<num;i++) {printf("No.%d:",++i); scanf("%d",&tmp); sum = sum + tmp; } printf("合計値:%d\n",sum); printf("平均値:%.2f\n",(double)sum / num); return(0); } C言語の勉強を始めたばかりのものです。 指定された個数だけ読み込めません 汗 前置と後置をまぜたあたりがよくないのかなと思うのですが。。。 どうしておかしくなるのか教えてください。 内部でどういった処理が行われているのかまだあまりわからない状態です。 ちなみに4と入力した結果は以下です。 整数は何個ですか:4 No.1:4 No.3:3 合計値:7 平均値:1.75

  • for文

    #include <stdio.h> int main(void) { int i; int sum=0; int num, tmp; printf("整数は何個かな:"); scanf("%d",&num); for(i=0; i<num; i++){ printf("No.%d:",i+1); scanf("%d",&tmp); sum+=tmp; } printf("合計値は:%d\n",sum); printf("平均値は:%.2f\n", (double)sum/num); return(0); } 上の文のforの箇所を for(i=1; i<=num; i++){ printf("No.%d:",i); scanf("%d",&tmp); sum+=tmp;   } としても結果的に同じですよね? どっちでもいいかどうか迷ってます。教えて下さい。

  • 分散を求めるプログラム

    n人の点数を読み込みそれらの平均、分散を計算するプログラムを作りたいのですが分散の式がよく分かりません。 分散を求める式は第i番目の点数をxi、平均をμとすると 分散=1/nΣxi^2-μ^2 で、プラグラムを作ってみると #include<stdio.h> int main (void) { int i; int sum=0; int num,tmp; printf("何人ですか"); scanf("%d",&num); for(i=0; i<num; i++) { print("No. %d ", i+1) scanf("%d",&tmp); sum += tmp; } printf("平均:%.3f\n",(double)sum/num); printf("分散:%.3f\n",(double){(sum-sum/num)*(sum+sum/num)}/num); return(0); } というプログラムを作ってみたのですが分散の計算がうまくいきません。どなたか分散の計算のプログラムを教えて下さい。 C言語初めてまもないので不備があったらすみません。

  • c言語

    n人の名前、と国数英の点数を読み込み各人の平均点、標準偏差を求め見やすく出力するぷろぐらむです osはlinuxでコンパイラはgccです。 変数が多くなってしまいよくわかりません。 もっと簡単になりますか? #include<stdio.h> #include<math.h> #define N 50 main() { int eng[N], jap[N], math[N], n=0, i=0; char name[N][12]; double sum[N], SUM, sum1, sum2, sum3, ave1, ave2, ave3, vari, s_devi; printf("名前 合計点"); while(scanf("%s %d %d %d",&name[n],&eng[n],&jap[n],&math[n]) != EOF) { sum[i] = eng[n]+jap[n]+math[n]; sum1 += eng[n]; sum2 += jap[n]; sum3 += math[n]; printf("%-12s%4d",name[n], sum[i]); n++; i++; } ave1 = sum1/n; ave2 = sum2/n; ave3 = sum3/n; for(i=0; i<n; i++) { SUM += (eng[i]-ave1)*(eng[i]-ave1); } vari = SUM/n; s_devi = sqrt(vari); printf("English\n average = %f\nstandard deviation = %f\n\n",ave1,s_devi); for(i=0; i<n; i++) { SUM += (jap[i]-ave2)*(jap[i]-ave2); } vari = SUM/n; s_devi = sqrt(vari); printf("japanese\n average = %f\nstandard deviation = %f\n\n",ave2,s_devi); for(i=0; i<n; i++) { SUM += (math[i]-ave3)*(math[i]-ave3); } vari = SUM/n; s_devi = sqrt(vari); printf("math\n average = %f\n standard deviation = %f\n\n",ave3,s_devi); }

  • c言語で平均をだす

    #include<stdio.h> int main(void) { int num; int sum; printf("テストの点数を入力してください。\n"); do{ scanf("%d",&num); sum+=num; }while(num); printf("テストの合計点は%dです\n",sum); return 0; } テストの平均点をだすプログラムを作りたいのですが、合計を出すまではわかったのですが、ここから、平均を出すようにするにはどうすればよいですか。

  • c言語超初心者です。2

    #include <stdio.h> int main(void) { int na,nb, nc; int sum; double ave; puts("三つの整数を入力してください."); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("整数C:"); scanf("%d", &nc); sum=na+nb+nc; ave=(double)sum/3; printf("それらの合計は%5dです。\n", sum); printf("それらの平均は%5.1fです。\n",ave); return(0); } とういうのを作ったんですが、最後のそれらの合計は%5dとやりその5の意味は整数を10進法で少なくても5桁で表示とありますが、例えば1,2,3と入力しても合計は6とでて5桁ででないんですけど。そういう意味ではありませんか?あとave=(double)sum/3;のところをave=sum/3.0としても問題なくできるのですが、どっちでやったほうがいいとかはありますか?もしあったらその理由も教えてください。

  • C++のscanfについて

    今C++をやり始めたばかりの者です 下記のように打って、コンパイルして実行すると、数字はちゃんと出るんですが英語は入るとループがかかってしまいます。 英語のループを回避して、平均が出るように出来ないでしょうか。。。。 返答よろしくお願いします。。。。。 /********************************************** 平均を求める ***********************************************/ #include <stdio.h> #define END -1 //-1が入力されたら終わり void main() { //変数の宣言 int score; //得点 int total; //合計 double ave; //平均点 int i; //回数のカウント //入力と合計の計算 total = 0; //初期設定 i = 0; //最初の得点を入力 printf("%d科目めの得点を入力 : ", i+1); scanf("%d" , &score); //入力 while( score > END ) { total += score; i++; printf("%d科目目の得点を入力 : ", i+1); scanf("%d" , &score); //次を入力 } ave = (double)total / i; //平均を求める //表示 printf("合計:%5d点 平均:%7.1lf点\n" , total , ave); }

  • csvファイルの実績データをC言語で解析するのですが...

    C言語を学び始めたばかりなのに、csvファイルの実績データでフィールドが15あり、レコード数が1000000近くあるファイルの15番目のフィールドを足し合わせて、出力するということをやっているのですが、まだまだわからないことだらけです。 1レコード目がカラム名なので2レコード目から足し合わせるんですがそこのところもよくわからずじまいで... 一応、書いたプログラムが #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *fp; char buffer[50],*p; int cnt, num, sum; fp = fopen("j0.csv","r"); if(fp == NULL){ printf("ファイルが開けませんでした。\n"); exit(-1); } while(fgets(buffer,fp) != NULL){ p = strtok(buffer,","); cnt = 1; while(p!=NULL){ num = atoi(p); printf("%d:%d,",cnt,num); p = strtok(NULL,","); cnt++; if(cnt==15) sum=sum+num } printf("\b\b \n"); } printf(%d \n",num); fclose(fp); return(0); } と書いたんですが、ぜんぜんな状態です。誰かご教授願えませんか?

  • C言語について質問です。

    ソートについて勉強していて、乱数列の要素数Nの値を変えていきバブルソートの交換回数、比較回数を数えるプログラムを作り、後は処理時間について調べたいのですが、処理時間を出力するのはどうやってやるのですか?教えてください。以下に乱数を生成するrand.cとバブルソートを行うbubblesort.cを記載します。これに処理時間を出力するようにしてもらいたいのですが、どうしたらいいですか?解説とソースファイルをよろしくお願いします。 rand.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int num[N]; int makeDataFile ( void ) { int i; FILE *fp; char s[100]; int num[N]; srand ( ( unsigned )time ( NULL ) ); fp = fopen ("rand1.txt", "w" ); if ( fp == NULL ) exit(1); for ( i = 0; i < N; i++ ){ fprintf ( fp, "%d\n", rand()%100 ); } fclose ( fp ); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) exit(1); while( fgets ( s, sizeof (s), fp ) ) { printf ( s ); } fclose ( fp ); return N; } bubblesort.c #include <stdio.h> #include <time.h> extern int makeDataFile ( void ); extern int num[]; void BubbleSort ( int x[] , int n ); void Show ( int x[] , int n ); int comp; int swap; void BubbleSort ( int x[] , int n ) { int i, j, tmp; for ( i = 0; i < n-1; i++ ) { for ( j = n-1; j > i; j-- ){ comp++; if ( x[i] > x[j] ){ swap++; tmp = x[j]; x[j] = x[i]; x[i]= tmp; Show ( x , n ); } } } } void Show ( int x[] , int n ) { while ( n-- ) printf ( "%d " , *x++ ); printf ( "\n" ); } int main(void) { int i, j, n , tmp; FILE *fp; comp = 0; swap = 0; n = makeDataFile(); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) return 1; for ( i = 0; i < n; i++ ){ fscanf ( fp, "%d", &(num[i] ) ); } fclose ( fp ); printf ( "\nbefore bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "progress bubblesort\n" ); BubbleSort ( num , n ); printf ( "\n" ); printf ( "after bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "count of comparisons : %d\n" , comp ); printf ( "count of swap : %d\n" , swap ); return 0; }

  • C言語についてです。

    EXELEファイルから値を読みこんで、各自のBMIと全体の身長・体重の平均値を求めるプログラムを作成したいんですが…C言語で…。途中までで混乱してしまい、あっているかも分からないのでお願いしたいです。よろしくお願いします。ヒントだけでもありがたいです。 下がそのファイルです。 height weight 170.7 52.9 166.8 71.3 171.4 58.5 173.4 76.7 176.1 80.2 184 89.1 179 64.7 177.2 78.5 177.7 80.7 173.8 64 167.7 60.3 181.6 72.3 162.4 53 177.4 69.6 178 76.4 174 77.2 185.4 86 172 68.5 172.7 60 166.5 62 171.3 69.6 177 79 174.8 82.6 167.5 69.2 176.8 80.1 181.5 76 177.3 76.4 169.4 51.8 165.2 73.2 175.3 72.3 181.5 72.4 171.5 68.8 176 73.2 186 99.8 167.3 65.5 176.1 78 183.3 77.2 177.5 59.5 180.3 62 171.2 74.7 175 87.2 176 80 171.8 50.6 平均身長の値を出すプログラムは出ているので…これもあわせてBMIと平均体重出してくれるとうれしいです。 /* basic claculation */ #include <stdio.h> #include <math.h> int main(void) { int i, ii; int ntotal; double sum_height; double weight[50], height[50]; double mean_height; char w[6],h[6]; FILE *fp; /* initial setting */ /* ntotal: total word number */ /* sum : total character number */ ntotal = 0; sum_height = 0; /* file open */ /* my data file is weight-height.data */ /* which is in my root directory */ fp = fopen("./weight-height.data","r"); /* skip character reading. */ fscanf(fp,"%s,%s",w,h); /* ntotal: total number */ /* sum : total value */ for (i=0;i<=47;i++) { if (feof(fp)) break; fscanf(fp,"%lf,%lf",&weight[i],&height[i]); printf(" weight = %lf height = %lf \n",weight[i],height[i]); sum_height = sum_height + height[i]; } fclose(fp); ntotal = i; printf(" 全人数 = %d \n",ntotal); mean_height = sum_height /ntotal; printf(", 平均身長 = %lf \n",mean_height); return(0); }