C++ 从文件输入中查找双精度数组的平均值

C++ 从文件输入中查找双精度数组的平均值,c++,arrays,file-io,double,average,C++,Arrays,File Io,Double,Average,到目前为止,我试图找到一种方法来获得这个数组的平均值,但没有结果。任何帮助都将不胜感激 #include <iostream> #include <algorithm> #include <numeric> #include <vector> #include <iterator> #include <string> #include <iostream> #include <fstream> usi

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

#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;
} 
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
常数int MAX=100;
双电压[最大值];
双倍平均;
ifstream文件(“c:\\voltages.txt”);
如果(!thefile)
{

不能对平均值使用递归定义:

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

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

avg_n_1 = avg_n;

这样,你可以计算平均值,而不预先知道你将读取多少值。

< P>计算任何C++容器(甚至原始数组)中存储的数字的平均值,使用以下方法。
std::accumulate(std::begin(v), std::end(v), 0.0) / (std::end(v) - std::begin(v));
运行中的示例代码:

/ (请注意,只有向量/数组的定义更改!)

此代码不检查零长度,这将生成一个除以零的除法。这将返回一个
NaN
值。如果(std::begin(v)=std::end(v))
,则可以使用
提前检测此情况。如果不想返回
NaN
,则可以根据需要处理此类转角情况:

  • 返回定义良好的值,例如
    0.0
  • 抛出异常
  • 打印警告并退出(基本上与异常相同,但无法捕获)
  • 自定义错误处理,例如,将布尔错误变量设置为true

最好是用一个双精度计数器和一个运行的总计,然后用一个计数器对平均值进行总计/计数。不需要向量之类的东西

PS:对于fstreams,最好使用.get()而不是.eof(),因为有时文本编辑器会在末尾添加一个“\n”字符(给您一个空字符串额外的迭代和可能的错误)


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

每次循环迭代要递增
count
3次。你确定这是有意的吗?无论如何,我要用一个向量来读取文件,并用
std::acculate
除以大小。为什么要计算每个循环的平均值。这是浪费效率的。使用double表示总数和divide在循环外的末尾由计数器进行。此外,您永远不会在任何地方对电压值求和,这是计算平均值的一个非常重要的步骤。while(thefile.eof()){thefile>>tmp;sum+=tmp;cnt++}return(cnt==0)?0:sum/cnt;代码在一个0长度的向量上运行。@ShaunMarko谢谢。这应该作为一个角大小写添加到单个代码中。有些人更喜欢定义良好的结果(如0.0),一些NaN和一些例外。或者打印一个警告?我不知道人们喜欢什么。我把它作为一个警告放在答案中。@ShaunMarko,boom在这里可能是错误的术语。它不会使程序崩溃,但表达式的计算结果是
NaN
,它仍然是“有效的”而且只是一个例外值。@leems:0除是未定义的行为-它可能对您的计算结果为
NaN
,但对其他人来说可能会很快。可能:
(std::end(v)-std::begin(v))?std::accumulate(std::begin(v),std::end(v),0.0)/(std::end(v)-std::begin(v)-std::begin(v)):0.0
还有一点挑剔:该表达式仅适用于具有随机访问迭代器的容器或数组。@MichaelBurr已经考虑过非随机访问迭代器的问题。是否有类似std::size或类似的内容?