プロが教えるわが家の防犯対策術!

こんにちは。ファイルからデータを読み込んで、平均値と標準偏差を求めるプログラムを書いているんですが、計算結果がなぜか違う値になってしまいます。書いているプログラムは、

#include<stdio.h>
#include<math.h>
#define MAX 200
/* ファイル"sample.txt"から複数の値を入力し、それらの
 平均値、標準偏差を出力する.  */

void main(void)
{
FILE *fp;
char text[256],l[256];
int i, n; float a[MAX], sum,sum2,mean,sdev;
fp = fopen("sample.dat","r"); /* sample.txt を開く */

if(fp == NULL){ printf("Error!\n");exit(0);}/* sample.txtがなければ停止 */


for(i = 1; i <= 3; i++)
fscanf(fp, "%s\n",text);


for(i = 0; i < MAX; i++)
{
if(fscanf(fp, "%s %f\n",l, a[i]) == EOF ) ;
}

n = i;

sum = a[0]; sum2 = a[0]*a[0];

for(i = 0; i < n; i++)

{
sum += a [i]; sum2 += a[i]*a[i];
}

mean = sum/n; /* 平均値の計算 */
sdev = sqrt(sum2/n - mean*mean); /* 標準偏差の計算 */

printf(" mean : %6.2f\n", mean);

printf("standard dev.: %6.2f\n",sdev);
}

で、読み込むファイルは
平均値と標準偏差の計算
クラスA組み
氏名 身長(cm)
鈴木 175.54
佐藤 170.34
清水 165.29
徳田 185.23
赤木 178.61

と、長くなってしまいましたが、if文の中のfscanfの部分が違うんでしょうか?初心者でどこが違うのか分かりません。教えていただけないでしょうか?

A 回答 (3件)

>for(i = 0; i < MAX; i++)


>{
>if(fscanf(fp, "%s %f\n",l, a[i]) == EOF ) ;
>}
これだとEOFかどうか判定しているだけで、データがあろうが無かろうが必ず i=MAX までいってしまいますね。 break 忘れでは?

>sum = a[0]; sum2 = a[0]*a[0];
初期値に a[0] を使ったらまずいのでは?
結果的に a[0] を二回加算、乗算することになってます。

よく分からない場合は途中で値を出力してみればいいと思いますよ。
printf("a[0]=%6.2f\n", a[0]);
printf("a[1]=%6.2f\n", a[1]);
とか、ループして出力するとか…
    • good
    • 0
この回答へのお礼

教えてくださったように途中で値を出してみたところぜんぜん違う値が入力されていることが分かりました。はじめ break を書いていたのですがそれもどうもうまくいかなくて・・・。これから色々やってみようと思います。ありがとうございました。

お礼日時:2002/04/15 22:49

ロジックは良く読んでませんが



>if(fscanf(fp, "%s %f\n",l, a[i]) == EOF ) ;
%f で値を代入させたい a[i] はアドレスを渡さないとだめですよ。 &a[i] です。
    • good
    • 0
この回答へのお礼

教えてくださってありがとうございます。初歩的なミスですね。これからもC言語がんばります。

お礼日時:2002/04/15 22:52

とりあえずloiloiさんの作ったプログラムを元に動くように変えたものです。


一応これからの参考になるように注釈もつけたつもりです。
これからの参考になれば幸いです(^^;

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define MAX 200
/* ファイル"sample.txt"から複数の値を入力し、それらの
 平均値、標準偏差を出力する.  */

void main(void)
{
FILE *fp;
char text[256];
int i, n;/*出来ればセミコロン(;)ごとに改行する方が見やすい*/
float a[MAX], sum,sum2,mean,sdev;
fp = fopen("sample.txt","r"); /* sample.txt を開く */

if(fp == NULL)
{
printf("Error!\n");
exit(0);
}/* sample.txtがなければ停止 */


for(i = 1; i <= 4; i++)
/*3になってましたが3行目がスペースで区切られているので4に変更*/
fscanf(fp,"%s",text);


for(i = 0; i < MAX; i++)
{
if(fscanf(fp,"%s",text)==EOF)
break;

fscanf(fp,"%f",&a[i]);

}
n = i;

/*sum = a[0]; sum2 = a[0]*a[0]; */

for(i = 0; i < n; i++)

{
sum += a [i];
sum2 += a[i]*a[i];/*0からループは周り出すのでループ前の一文は必要ない*/
}


mean = sum/n; /* 平均値の計算 */
sdev = sqrt(sum2/n - mean*mean); /* 標準偏差の計算 */

printf(" mean : %6.2f\n", mean);
printf("standard dev.: %6.2f\n",sdev);
}
    • good
    • 0
この回答へのお礼

S2GBKさんありがとうございます。その後色々やってみたのですが、やはりダメでした。けどこれからもC言語がんばろうと思います。またお世話になるかもしれませんがよろしくお願いしますね!

お礼日時:2002/04/15 22:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!