プロが教える店舗&オフィスのセキュリティ対策術

double型の配列 a[] と、要素数 n を受け取り、 a の最初の n 要素の平均を値として返す関数

double average(double a[], int n)

および、double型の配列 a[] と、要素数 n を受け取り、 a の最初の n 要素のなかで、それら n 要素の平均値と最も近い値を返す関数

double closest_to_average(double a[], int n)

を作成して、main関数で、平均値と最も近い値を出力しろ
という問題をやってみたのですが、私のプログラムでは実行して、数値を入力した後強制終了されてしまいます。

どこが間違えているのか教えていただけないでしょうか?
以下が私の作ったプログラムです。

----------------------------------------------------------------------

#include <stdio.h>

double average(double a[], int n)
{
int i;
double sum,avg;
sum=0;
for(i=0;i<n;i=i+1){
sum=sum+a[i];
}
avg=sum/n;
return(avg);
}

double closest_to_average(double a[], int n)
{
int i;
double avg,num1,num2,ans;
avg=average(a,n);
num1=avg-a[0];
if(num1<0){
num1=num1*(-1);
}
for(i=1;i<n;i=i+1){
num2=avg-a[i];
if(num2<0){
num2=num2*(-1);
}
if(num1>num2){
num1=num2;
ans=a[i];
}
}

return(ans);
}

int main (void)
{
int i,n;
double a[100];
double ans;
scanf("%d",&n);
for(i=0;i<n;i=i+1){
scanf("%d",a[i]);
}
ans=closest_to_average(a,n);
printf("%f",ans);
return(0);
}
----------------------------------------------------------------------

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

よろしくお願いします。

A 回答 (2件)

前回の質問


http://oshiete.goo.ne.jp/qa/7925962.html
で、c[i]に入力する部分は
for(i=0;i<n;i=i+1)
{
scanf("%lf",&c[i]);
sum=sum+c[i];
}
こうなっていました。

sum=sum+c[i]は、今回は別の関数へ移ったので不要になります。
取り込む変数も c[]からa[]になりました。

それを考えて、今回のプログラムでの入力部分
for(i=0;i<n;i=i+1){
scanf("%d",a[i]);
}
と比較すると、違いがあるのがわかります。


どんなコンパイラを使っているか、わかりませんが
コンパイラによっては、警告表示を高レベルに設定することで、今回のような不具合に「警告」を出すことができます
# 例えば、 gcc なら -Wall オプションを付ける
# Visual Studioなら、「警告レベル」を高いものにする

警告はエラーでは無いので、コンパイル自体は成功します。
実行に影響の無い警告もあります。それは無視してもいいでしょう。
ただ、多くの場合は、実際の動作の不具合に繋るものが多いです。

警告を出すようにして、警告の内容をよく確認した上で、無視する、または、正しく修正する、というのは、勉強の役に立つと思います。
    • good
    • 0
この回答へのお礼

指摘していただいた部分を

for(i=0;i<n;i=i+1){
scanf("%lf",&a[i]);
}

に修正したら成功しました。
初歩的なミスでしたね。
ありがとうございました。
またok-kaneto さんもありがとうございました。

お礼日時:2013/02/04 12:43

>scanf("%d",a[i]);


ここをよく見なおしてみましょう。

・double型をscanfで入力するときの書式指定文字列は?
・scanf型に指定する変数で何か忘れていませんか?
    • good
    • 0

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