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

n個の数値を入力して、その平均値にもっとも近い値を求めよ。(double型の配列を用いること)
nは実数データの前に最初に入力するものとする。
必要ならばnは100以下と仮定せよ。
答えは指数なしの表現で、欄の最小幅は8とし、精度は3とする。

という問題なのですが、作ってみたプログラムでは正しく動作できませんでした。
どこが違うのか教えてください。
以下が私の作ったプログラムです。

_____________________________________________________________________________________________________________________

#include <stdio.h>
int main (void)
{
int i,n;
double c[100],sum,avg,num1,num2,ans;
sum=0.0;
scanf("%d",&n);
for(i=0;i<n;i=i+1)
{
scanf("%lf",&c[i]);
sum=sum+c[i];
}
avg=sum/n;
num1=avg-c[0];
if(num1<0){
num1=num1*(-1);
}
for(i=1;i<n;i=i+1){
num2=avg-c[i];
if(num2<0){
num2=num2*(-1);
}
if(num1>num2);
num1=num2;
}

printf("%8.3f",num1);

return(0);


_____________________________________________________________________________________________________________________

ちなみに「3 3.0 5.0 11.0」と入力すれば「5.000」となるはずなのですが、

私のでは「4.667」と表示されてしまいます。


よろしくお願いします。

A 回答 (1件)

if(num1>num2);


num1=num2;

ここが、おそらく意図したものではない、というのが1点
ここでは、「常に」num1=num2; が実行されます。
そのため、最後の |平均 - 11.0| が printf("%8.3f",num1); によって出力されています。


printf("%8.3f",num1);

ここで、num1(平均と値との差)を出力している、というのがもう1点
「差がnum1のときのc[?]の値」を出力する必要があります。
そのためには、「差がnum1のときのc[?]の値」をなんらかの方法で記録する必要があります。
?の値を記憶てもいいし、c[?]の値を記憶してもよいです。

そういえば、ansという変数は使われていませんね
    • good
    • 1
この回答へのお礼

kmee さんの言うとおり、まずif(num1<num2)のところが{}でくくれてなかったのでif文の中身が常に実行されてしまうようになっていました。
あと、出力するものも間違えてました。
if(num1<num2)のときにansにc[i]の値を代入させてansを出力したらできました。
助かりました。
ありがとうございました。

お礼日時:2013/02/03 19:40

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