配列の計算について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
saaya

配列の計算について

#1

投稿記事 by saaya » 12年前

標準入力での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;
}

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 配列の計算について

#2

投稿記事 by Priest » 12年前

まず、どこがどう分からないのか教えてくださいませんか?

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

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

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

saaya

Re: 配列の計算について

#3

投稿記事 by saaya » 12年前

いただいたお言葉を参考にいろいろといじったらできました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る