![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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」となるはずです。
よろしくお願いします。
No.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なら、「警告レベル」を高いものにする
警告はエラーでは無いので、コンパイル自体は成功します。
実行に影響の無い警告もあります。それは無視してもいいでしょう。
ただ、多くの場合は、実際の動作の不具合に繋るものが多いです。
警告を出すようにして、警告の内容をよく確認した上で、無視する、または、正しく修正する、というのは、勉強の役に立つと思います。
指摘していただいた部分を
for(i=0;i<n;i=i+1){
scanf("%lf",&a[i]);
}
に修正したら成功しました。
初歩的なミスでしたね。
ありがとうございました。
またok-kaneto さんもありがとうございました。
No.1
- 回答日時:
>scanf("%d",a[i]);
ここをよく見なおしてみましょう。
・double型をscanfで入力するときの書式指定文字列は?
・scanf型に指定する変数で何か忘れていませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
doubleの変数にintとintの割り...
-
プログラムでの数字につく”f”の...
-
至急です! マクロ定義で #defi...
-
C++で外積
-
関数におけるif文とreturn文に...
-
浮動小数点の誤差のあわせ方
-
C 開放してるのにエラー(doubl...
-
difftime()について
-
待ち行列シュミレーションのプ...
-
2自由度減衰振動のルンゲクッタ法
-
ガウスのの単純消去法のプログ...
-
C言語でdouble型の小数点の引き...
-
doubleは常に%lfとするべきなのか
-
線形補間
-
C++初心者です。簡単なスコア計...
-
float型とdouble型の変数の違い...
-
斜辺と角度て底辺と高さを出したい
-
AtCoderABC135の問題Cについて
-
信頼区間の1.96や1.65ってどこ...
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
Cで3乗根を求める方法
-
C言語 関数プロトタイプ宣言の...
-
関数におけるif文とreturn文に...
-
至急です! マクロ定義で #defi...
-
-1.#IND00と出てしまうのですが...
-
2次方程式の解を求めるプログ...
-
2分法で方程式の複数の解を自...
-
doubleは常に%lfとするべきなのか
-
C言語で-23乗を取り扱うには
-
C++で外積
-
int とdoubleの比較
-
C言語のプログラムで#include<m...
-
方程式を2分法を用いて解くプロ...
おすすめ情報