2
for( k = 0; k < n; k++ )
{
   total += total + temps[k];
}

avgTemp = total / n;

temps是我包含n元素的数组。avgTemp将所有值的平均值存储在temps. k 只是使我的循环工作的一些整数。k、n 和 total 已经在上面某处适当地声明了。total跟踪数组中元素的总数。

我的锻炼事情告诉我这是错误的。我究竟做错了什么?

4

5 回答 5

7

这个

for( k = 0; k < n; k++ )
{
    /// here's the error.
    /// You assign the new value to total as (total = total + total + temps[k])
    total += total + temps[k];
}

avgTemp = total / n;

应该

for( k = 0; k < n; k++ ) { total += temps[k]; }

avgTemp = total / n;

或者

for( k = 0; k < n; k++ ) { total = total + temps[k]; }

avgTemp = total / n;

使用迭代求和会更好。它可以避免舍入误差。

avgTemp = temps[0];

for(k = 1 ; k < n ; k++) { total = (temps[k] + (double)(k-1) * total)/ (double)k; }

bames53 还在评论中提供了一个不错的基于 STL 的代码。

于 2012-05-30T23:14:53.800 回答
2

第一的,total += temps[k]

+= 表示total = total + temps[k]已经

顺便说一下,total 是声明为浮点数还是双精度数?否则你正在做一个整数除法。

于 2012-05-30T23:14:47.017 回答
2

您的代码在每次迭代中都向自身添加“总计”,这不是您想要的。你需要改变:

total += total + temps[k];

total += temps[k];
于 2012-05-30T23:16:48.963 回答
1

当获得数字的总和时,您将总数添加到自身,然后添加下一个元素。

total += total + temps[k];

应该:

total += temps[k];
于 2012-05-30T23:15:53.477 回答
0

正如bames53 的评论 accumulate中提到的那样,这确实是您解决此问题的最佳选择。给定n哪个是容器的大小,it哪个是指向容器第一个元素的指针或迭代器,您可以对数组、动态分配的数组或向量执行此操作:

const auto avgTemp = accumulate(it, next(it, n), typename iterator_traits<remove_const_t<decltype(foo)>>::value_type{}) / n;

Live Example

于 2019-01-09T16:54:55.997 回答