ページ 11

配列の計算について

Posted: 2013年7月09日(火) 01:52
by saaya
標準入力での20個以下のいくつかのデータから、その平均と総和、最大値、最小値、標準偏差を計算するプログラムを作りたいのですがうまくいきません。もしよろしければアドバイスお願いします。

コード:

#include <stdio.h>
#include <math.h>
int main(int argc, const char * argv[]) {
int count, x, sum, sumv, ave, max, min, dev;
double i;
	count = 0;
	x = 0;
	sum = 0;
	sumv = 0;
	max = 0;
	min = 0;
	dev = 0;
	i = 0;
	int mark[20];
printf("数字を入力してください (-1で入力終了)\n");
while (x != -1 && count < 20){
	scanf("%d", &x);
	if (x == -1){
		break;
	}
	else{
		mark[count] = x;
		count++;
		sum += x;
		ave = sum / count;
		sumv += x * x;
		i = (sumv -(sum * sum / count)) / (count - 1);
		dev = sqrt(i);
			if( max < x ) {
				max = x;
			}
			if( min > x ) {
				min = x;
			}
		}
}
printf("平均  :%d\n", ave);
printf("総和  :%d\n", sum);
printf("最大値 :%d\n", max);
printf("最小値 :%d\n", min);
printf("標準偏差:%d\n", dev);
return 0;
}

Re: 配列の計算について

Posted: 2013年7月09日(火) 02:35
by Priest
まず、どこがどう分からないのか教えてくださいませんか?

ぱっと見ですが、いくつかです。
・ i = (sumv -(sum * sum / count)) / (count - 1); で0で割る瞬間があります。(count==1の時)
・ aveとdevはfloat等の浮動小数点型ではなくていいのですか?
・ minは0ではなくて大きな数で初期化するべきではないでしょうか?

現状、入力と計算を同時にこなしている状態になっていて、バグが出やすい設計になっていると思われますので
入力を受け付け、配列markへ値を格納するところと配列markを使って計算を行うところをきっちり分けた方がいいと思います。

Re: 配列の計算について

Posted: 2013年7月10日(水) 00:15
by saaya
いただいたお言葉を参考にいろいろといじったらできました。
ありがとうございました。