2016-11-29 90 views
-3

此代碼僅在向最終的printf中插入「%d」時有效。我想這是因爲「馬」是一個整數,但我希望它是一個整數,我已經宣佈它是這樣的。我該如何解決這個問題?在C中打印一個雙精度數而不是整數

「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); 

編譯器傳遞到m1printfint。但%lf「格式效果器」期待double,它幾乎總是與int大小不一樣,並且可能完全存儲在不同的位置 - 因此會產生無意義的輸出。 (從技術上講,這段代碼有「未定義的行爲」,可能會崩潰,甚至會讓惡魔飛出你的鼻子,但廢話的輸出更有可能。)(另外,%lf本身是錯誤的,因爲l修飾符是不允許的與f使用,但在我的經驗,大多數C庫將只是像你寫%f。)

如果你真的想迫使printf打印的int變量,就好像是浮點你必須寫一個明確的演員表:

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

或假的它在格式字符串中:

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

然而,對於程序,你似乎是嘗試寫,正確的改變是聲明m1double,不是int,與arithmeticMean返回值是一致的。一組整數的平均值不一定是整數。

(如果可能,你真的要強制printf浮點表示法來打印整數也許當它是非常大的:

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

將打印1.0e9,這是更容易爲人理解比1000000000。)

相關問題