2017-02-22 36 views
0

我試圖設計出計算花車的任意數量的平均值,直到EOF的程序。程序還應該檢查輸入是否正確,並在例如返回「錯誤輸入」時返回。輸入一個字符串。我編寫的代碼有效,但它給出的平均值是錯誤的。誰能告訴我爲什麼?正確使用用C的scanf()的,錯誤的輸出

#include <stdio.h> 

int main(void) { 
    int times = 0; 
    float sum = 0; 
    float scan; 
    float avrg; 
    int scanvalue = 1;  
    while (scanvalue == 1) {    
     scanvalue = scanf("%f", &scan); 
     sum = sum + scan; 
     times++;     
    }  
    if (scanvalue == EOF) { 
     avrg = sum/times; 
     printf("The average is %f\n", avrg); 
    } else { 
     printf("Wrong input"); 
    } 
    return 0; 
} 

此致敬意。

+0

你能舉一個例子輸入和輸出? – Marievi

+0

我會懷疑,*不正確的使用scanf()的'正確的輸出*'的這又是當然的** **意外。 –

+0

你的系統和編譯器是什麼?你打算結束輸入的關鍵是什麼? –

回答

4

你不檢查scanvaluescanf()仍然使用的價值在scan這是搞亂了平均水平。請注意,當scanf()回報EOF它不會修改scan,因此仍然有其最後的值,這樣你就兩次把最後的價值。

但是,如果你一開始就進入無效輸入,則行爲是不確定的,將其更改爲

while ((result = scanf("%f", &value)) == 1) { 
} 

而且,我特意改變了你的變量的名字來說明它們命名一個更好的方式。

+0

謝謝!但是:爲什麼我需要內部的括號並且不能只寫while(result = scanf(「%f」,&value)== 1)。我認爲編譯器正在從左到右地閱讀這些語句。 – Mark

+1

1.操作員優先。 2.因爲你也可以赤裸上街,但你仍然穿着衣服。 3.因爲它對於讀者來說變得模糊不清。 4.因爲它很醜。真的,因爲它看起來很可怕。 6.因爲它看起來很糟糕,所以閱讀起來很困難。但最支持的是,運營商優先。 –

+0

「注意當'scanf()'返回'EOF'時,它不會修改'scan'」更好,因爲「請注意,當scanf()返回小於1時,它不會修改'scan'」。但即使這樣也不完全正確。在罕見的輸入錯誤時,'scanf()'可能會返回'EOF'並改變'scan'。 – chux

0

您需要scanf函數後檢查scanvalue,即使你輸入EOF和金額會得到一個錯誤輸入,否則時間將增加,從而導致平均爲錯誤/搞砸。

所以,你應該改變

while (scanvalue == 1) {    
    scanvalue = scanf("%f", &scan); 
    sum = sum + scan; 
    times++;     
} 

while (scanvalue == 1) { 
    scanvalue = scanf("%f", &scan); 
    if (scanvalue != 1) 
     break; 
    sum = sum + scan; 
    times++; 
} 
+0

請檢查您的答案的格式。 –

+0

更好地使用'if(scanvalue!= 1) break;' – chux

+0

right,thank you –