-1

到目前为止,我试图找到一种方法来获得这个数组的平均值的尝试都没有结果。任何帮助,将不胜感激。

#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
#include <iterator>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
int main( )
{
    const int MAX = 100;
    double voltages[MAX];
    double average;
    ifstream thefile("c:\\voltages.txt");
        if(!thefile) 
    {
                cout<<"Error opening file"<<endl;
                system("pause");
                exit(1);
    }
        for(int count = 0; count < MAX; count++)
    {
                thefile >> voltages[count];
                cout << voltages[count++] << endl;
                average = voltages[count++]/count;
        if(count == 0 || thefile.eof())
    {
                break;
    }
    }
    cout << average;
    cout << "\n";
    system("PAUSE");
    return 0;
} 

电压文件是

100.8

120.4

121.4

111.9

123.4

但最多可以有 100 个双打。

4

3 回答 3

2

最好有一个带有运行总数的双精度数,然后是一个计数器,然后对平均值进行 TOTAL/COUNT。不需要向量和所有这些。

PS:对 fstream 使用 .get() 而不是 .eof() 是一个更好的主意,因为有时文本编辑器会在末尾添加一个 '\n' 字符(给你一个空字符串额外的迭代和可能的错误)。

对于数组和类似的东西,在 [ ] 内增加通常也是一个坏主意。最好在括号外使用 [count+1] 和/或递增计数。

于 2013-01-31T00:27:46.847 回答
2

要计算存储在任何C++ 容器(甚至是原始数组)中的数字的平均值,请使用以下方法。求和除以元素的数量:

std::accumulate(std::begin(v), std::end(v), 0.0) / (std::end(v) - std::begin(v));

示例代码在行动:

使用 std::vector / 使用原始数组(请注意,只有向量 / 数组的定义会改变!)

此代码不检查零长度,这会产生除以零。这将返回一个NaN值。这种情况可以通过使用提前发现if (std::begin(v) == std::end(v))。如果您不想退货,可以根据需要处理此类极端情况NaN

  • 返回一个明确定义的值,例如0.0
  • 抛出异常
  • 打印警告并退出(本质上与异常相同但不能被捕获)
  • 自定义错误处理,例如将布尔错误变量设置为 true
于 2013-01-31T00:26:14.480 回答
0

对平均值使用递归定义:

avg_n= ((n-1)* avg_n_1 + val) / n;

val 是第 n 个数据的值。
avg_n 是当前平均值
avg_n_1 是前一次迭代的平均值(n-1 个值的平均值)

最后是循环中的最后一条语句:

avg_n_1 = avg_n;

这样您就可以计算平均值,而无需事先知道您将读取多少个值。

于 2013-01-31T00:22:51.153 回答