2016-11-29 10 views
-3

このコードは、最後のprintfに "%d"を挿入した場合にのみ機能します。私はそれが "ma"は整数だからだと思うが、私はそれを二重にしたいと思うし、私はそのように宣言した。それをどうすれば解決できますか?Cの整数の代わりにdoubleを出力する

"v"は既に定義されています。

#include <stdio.h> 
#include <stdlib.h> 
#define N 25 

double arithmeticMean(int v[N]) 
{ 
    double ma; 
    int i,sum=0; 
    for(i=0;i<N;i++){ 
     sum=sum+v[i]; 
    } 
    ma=sum/N; 
    return ma; 
} 

int main() 
{ 
    m1=arithmeticMean(v); 
    printf("Arithmetic mean: %lf\n",m1); 

    return 0; 
} 
+4

あなたは 'm1'または' v'を定義していません。 –

+0

このコードには、 'm1'や' v'の宣言は含まれておらず、コンパイルされません。 https://stackoverflow.com/help/mcveの指示に従ってください。あなたの問題が何であるか知っていると思いますが、 'm1'の宣言を見ることなく、私は確信が持てません) – zwol

+0

' ma = suma/N; ' - >' ma =(double)sum/N; ' – BLUEPIXY

答えて

0

printfは、可変個の引数を取るので、コンパイラがあることを「意味」されているフォーマット文字列の後に引数を入力するかわかりません。あなたは

int m1 = arithmeticMean(v); 
printf("Arithmetic mean: %lf\n", m1); 

を書くとき、コンパイラはm1intとしてprintfに渡します。しかし、%lf「フォーマットエフェクタ」は、doubleとほぼ同じサイズではなく、全く別の場所に保存される可能性があります。無意味な出力が得られます。 (技術的には、このコードは「未定義の振る舞い」を持っており、クラッシュしたり、悪魔を鼻から飛び出させることさえありますが、ナンセンス出力ははるかに起こり易いでしょう)(%lfは、l修飾子が許可されていないfで使用するが、あなたが%fを書いたように私の経験では、ほとんどのCライブラリは、単に動作します。)

あなたが本当にそれはあなたが明示的に記述する必要があり、浮動小数点であるかのようint変数を印刷するprintfを強制したい場合フォーマット文字列で

printf("Arithmetic mean: %f\n", (double)m1); 

か偽::キャスト

printf("Arithmetic mean: %d.0\n", m1); 

しかし、あなたが書いしようとしているように見えるのプログラムのために、正しい変更がarithmeticMeanの戻り値と一致し、double、ないintとしてm1を宣言することです。一組の整数の平均は必ずしも整数ではない。

(あなたは本当にそれが非常に大きいおそらくとき、浮動小数点表記で整数を印刷するprintfを強制する場合があります?

printf("%.1e\n", (double)(1000l * 1000 * 1000)); 

は、より人間が理解しやすいである、1.0e9を印刷します1000000000

関連する問題