2017-06-22 59 views
-1

我抨擊我的頭,因爲我無法弄清楚爲什麼我的C代碼不斷打印一組n個數字的錯誤平均值!爲什麼我的平均答案不正確? (C代碼程序找到的意思)

這是我下面的代碼:

int main() 
{ 
    int i; 
    int n; 
    int sum = 0.0; 
    int lowest; 
    int highest; 
    float average; 
    int range; 
    int middle; 
    double median; 

    printf("\nEnter the amount of numbers you want?\n"); 
    scanf("%d",&n); 

    int numbs[n]; 
    int temp[n]; 

    for(i = 0;i < n; i++) 
    { 
     printf("\nEnter a number from 0 to 15: "); 
     scanf("%d",&temp[i]); 
    } 

    while (temp[i] < 0 || temp[i] > 15) than 15 
    { 
     printf("This number is not from 0 to 15! Please re-enter another number: "); 
     scanf("%d",&temp[i]); 
    } 

    numbs[i] = temp[i]; 
    sum += numbs[i]; 
} 

int sortt = 0, j, x; 

for (x = 1; x < n; x++) { 
    for (j = 0; j < n - x; j++) { 
     if (numbs[j] > numbs[j + 1]) { 
      sortt = numbs[j]; 
      numbs[j] = numbs[j + 1]; 
      numbs[j + 1] = sortt; 
     } 
    } 
} 

lowest = numbs[0]; 
highest = numbs[n-1]; 
middle = n/2; 

if (n % 2) 
{ 
    median = numbs[middle]; 
} 
else 
{ 
    median = (numbs[middle - 1] + numbs[middle])/2.0; 
} 

average = sum/n; 
range = highest - lowest; 

printf("\nSum: %d", sum); 
printf("\nAverage: %.2f", average); 
printf("\nMedian: %.2f", median); 
printf("\nRange: %d\n", range); 

return 0; 
} 

這是我的輸入和輸出下方。你可以看到8除以3不是2,它是2.67!我試過使用double和float。

輸入&輸出:

enter image description here

+0

這是一個可怕的混亂。學習正確的格式,這是編寫正確代碼的第一個狀態。 – Olaf

+2

'int sum = 0.0;'讓我猜,你編譯時沒有啓用警告?將'-Wall -Wextra'添加到您的編譯字符串,並且不接受代碼,直到它編譯時沒有警告。請參閱[**如何調試小程序**](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)並與鴨子交談... –

+0

'average = sum/n;'你在這裏除了兩個int。你需要說'average = sum /(double)n;'或者它會被截斷。 – rlbond

回答

0

8除以3是2,剩餘部分2.8和3是整數,並且當計算兩個整數的,可以使用整數除法與整數規則。

此外,該行可能會混淆你:

int sum = 0.0; 

由於sumint,這只是設置sum爲零。

和:

average = sum/n; 

由於兩個sumn是整數,這是整數除法。你對結果做什麼並不影響結果的計算方式 - C的規則已經足夠複雜了。

+0

是的,我不知道爲什麼我寫了「0.0」。謝謝你,我的腦袋已經過去了! –

0

您需要更正以下行:

average = sum/n; 

average = (float)sum/n; 

你要你的返回值鑄造成浮動。想想看,作爲具有以下定義一個函數:

float divide(int x,int y){ 
    return x/y; // returns an integer instead of float. 
} 

雖然這樣的定義:

float divide(int x,int y){ 
    return (float)x/y; // creates a temporary float variable and returns it immediately as the returned value of the function. 
} 

此外,聲明int sum=0.0肯定會與-Wall編譯時顯示警告信息。嘗試遵循從編譯器獲得的警告,並在運行程序之前修復所有警告。

+0

謝謝你這個工作! –

相關問題