こんにちは。ファイルからデータを読み込んで、平均値と標準偏差を求めるプログラムを書いているんですが、計算結果がなぜか違う値になってしまいます。書いているプログラムは、
#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の部分が違うんでしょうか?初心者でどこが違うのか分かりません。教えていただけないでしょうか?
No.1
- 回答日時:
>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]);
とか、ループして出力するとか…
教えてくださったように途中で値を出してみたところぜんぜん違う値が入力されていることが分かりました。はじめ break を書いていたのですがそれもどうもうまくいかなくて・・・。これから色々やってみようと思います。ありがとうございました。
No.2
- 回答日時:
ロジックは良く読んでませんが
>if(fscanf(fp, "%s %f\n",l, a[i]) == EOF ) ;
%f で値を代入させたい a[i] はアドレスを渡さないとだめですよ。 &a[i] です。
No.3ベストアンサー
- 回答日時:
とりあえず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);
}
S2GBKさんありがとうございます。その後色々やってみたのですが、やはりダメでした。けどこれからもC言語がんばろうと思います。またお世話になるかもしれませんがよろしくお願いしますね!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 統計学 生物統計学の質問 7 2022/05/17 13:59
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# プログラミング実行後に表示される値を答えよ #include <stdio.h> void main 4 2022/05/28 10:20
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ガンマ変換 C言語でプログラ...
-
c言語 ファイルから数字を読み...
-
ファイル出力で改行を入れたい!
-
fopenでファイル名に、変数を使...
-
テキストファイル内に対して, ...
-
辞書順にソートしたいのですが...
-
エラーがわかりません、、
-
C言語でファイル読み書きを早く...
-
ファイル読み込み EOF 判定
-
ファイルへの書込み処理が異常...
-
CSVファイルの内容を構造体に格...
-
C言語にてXMLファイルから任意...
-
二分探索木への挿入
-
バイナリファイルの読み込み(C...
-
C言語 csv 配列
-
ファイルに行番号を追加
-
バイナリファイルでの時刻表示
-
csvファイルのデータを構造体に
-
複数ファイルの同時読み込みの...
-
C言語のfor文です。 繰り返しの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語でのfscanfについて
-
C言語でファイル読み書きを早く...
-
fopenでファイル名に、変数を使...
-
複数ファイルの同時読み込みの...
-
fgets( ) の返り値は何?
-
テキストファイル内に対して, ...
-
ファイルへの書込み処理が異常...
-
C言語にてXMLファイルから任意...
-
ファイル出力で改行を入れたい!
-
C言語でセグメンテーションエ...
-
エラーがわかりません、、
-
ガンマ変換 C言語でプログラ...
-
自己相関関数を求めるプログラ...
-
VisualStudioでのファイルの入...
-
同時にファイル読み込み 書き込み
-
c言語 ファイルから数字を読み...
-
大量の入力ファイルを扱うとき...
-
ファイルが読み込めない・・・
-
【C言語】ファイルを読み込んで...
-
a*(1-exp(-bx))+cの近似の方法
おすすめ情報