2017-06-22 27 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

谢谢你这个工作! –

相关问题