こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

答えがおかしい

配列と関数を使って教科ごとの平均点を求めるC言語のプログラムを
作りました。しかし、結果がおかしくいろいろ考えてみたのですが、
よくわからないので質問に出すことにしました。
作ったものは以下です。どうすればよいでしょうか?
#include <stdio.h>
#define NUMBER3

/*--- 要素数noの配列の平均値を求める ---*/
double ave_of(int vb[], int no)
{
int i, sum, ave;
for (i=1;i<no; i++)
sum+=vb[i];
ave=(double)sum/NUMBER;
return(ave);
}

int main(void)
{
int i;
int a[NUMBER];
int b[NUMBER];
int c[NUMBER];
double ave_a, ave_b, ave_c;

printf("%d人の点数を入力してください。\n",NUMBER);
for(i=0;i<NUMBER; i++){
printf("[%d番]理科:",i+1);scanf("%d",&a[i]);
printf("   数学:");scanf("%d",&b[i]);
printf("   社会:");scanf("%d",&c[i]);
}

ave_a=ave_of(a, NUMBER);
ave_b=ave_of(b, NUMBER);
ave_c=ave_of(c, NUMBER);

printf("【理科】平均点:%.1f\n", ave_a);
printf("【数学】平均点:%.1f\n", ave_b);
printf("【社会】平均点:%.1f\n", ave_c);

return(0);
}

結果は例えば45.2 というような感じで出したいです。

投稿日時 - 2008-11-13 09:48:18

QNo.4474806

困ってます

質問者が選んだベストアンサー

>しかし、結果がおかしく、いろいろ考えてみたのですが、よくわからないので質問に出すことにしました。

 ・sum を初期化していない「警告」は出ませんでしたか。
 ・「結果」が「小さい」、と気づきませんでしたか。
 ・「結果」が、小数点以下は0固定ではなかったですか。
 
 等々、なぞなぞを解く感覚で考えてみるのも楽しいかと・・。

☆今回に限らず、この様(プログラムは動くが、結果がおかしい)な場合、
 1人目は1桁点、2人目は2桁点、3人目は3桁点などのように、いろいろ試行すると、気づくのが早いかも・・。

(前の2つは、他の回答者さんが答えています)

残る1つは、

☆平均の計算(右辺◆)は double なのに、int 変数に代入すると・・・。

 小数点以下は、省かれます。
 
 45 ← 45.2 で、45.0 が「返り値」となります。
+++++++++++++++++++++++++++++++++++++++++++++
修正してみました。

 double ave_of( int vb[], int no )
 {
   int i, sum = 0; // 初期化
   double ave;   // 関数の型に!

   for( i = 0; i < no; i++ ) sum += vb[i]; // 全員集計

   ave = (double)sum / NUMBER;// ◆

   return( ave );
 }

投稿日時 - 2008-11-13 11:43:51

お礼

回答ありがとうございます。
詳しい説明でとても分かりやすかったです。
結果が小数点以下が0だったのは気になっていました。sumを初期化
してなくてもエラーは出ませんでした。

投稿日時 - 2008-11-13 19:32:09

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

int i, sum, ave;

int i, sum = 0;
double ave;

for (i=1;i<no; i++)

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

ave=(double)sum/NUMBER;

ave=(double)sum/(double)no;

投稿日時 - 2008-11-13 13:10:35

ANo.3

平均を求める際には合計を求めていますが、合計が初期化されていません。
足しこむ場合は0で初期化してください。

配列の添字は0で始まりますので、for文は0から始めてください。

投稿日時 - 2008-11-13 09:57:25

ANo.2

原因1
for (i=1;i<no; i++)
sum+=vb[i];

原因2
int i, sum, ave;

プログラムを殆ど見てないが、ここだと思う。

投稿日時 - 2008-11-13 09:56:34

コンパイルできる環境がなくて検証してないけど

/* これって本当に i = 1かな?i=0じゃなくて*/
for (i=1;i<no; i++)

投稿日時 - 2008-11-13 09:54:33