如何从.txt文件创建15个值的运行平均值?

时间:2013-12-09 00:52:33

标签: c++ arrays average file-io

我正在尝试对从.txt文件中获取一系列值的程序进行微调,并创建15个值的运行平均值。例如,它将读取前15个值,在第15个数字旁边输出该平均值,然后它将读取值2-16,取平均值并将其输出到第16个数字旁边。然后它将读取值3-17,取平均值并将其输出到第17个数字旁边,依此类推。不幸的是,我的程序没有取得太大进展,但这是我到目前为止的代码:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdlib>
#include <iomanip>


using namespace std;

#define ARRAYSIZE  10000
#define OTHER 10000

int main(void)
{
    //things needed
    ifstream infile;
    ofstream outfile;
    double xArray[ARRAYSIZE];
    double yArray[ARRAYSIZE];
    double average;
    double sum = 0;
    double sum2=0;
    double average2;

    infile.open("data.txt");
    if (infile.fail()) {
        cout << "can't open data.txt\n";
        exit(1);
    }

    for (int z = 0; z < 15; z++) {
        infile >> xArray[ARRAYSIZE];
        sum = xArray[ARRAYSIZE] + sum;
        average = sum / (z+1);
    }

    outfile << xArray[ARRAYSIZE] << ", " << average << endl;
    sum2 = sum;

    //Running Average
    for (int x = 0; x < 10000 && !infile.eof(); x++) {
        infile >> yArray[OTHER]; 
        sum2 = yArray[OTHER] + sum2;
        average2 = sum2 / (x + 16);
        cout << yArray[OTHER] << ", " << average2 << endl;
    }
}

正如您所看到的,我可以获得所有内容的平均值,但我无法将平均值分成15个值段。

1 个答案:

答案 0 :(得分:4)

我不想只是交给你工作代码。但为了让您不受困扰,请考虑以下方法:

  1. 声明一个只包含15个元素的数组。
  2. 将总和初始化为0。
  3. 遍历所有传入元素,执行以下操作:
    1. 为第一个元素保留一个从0开始的索引值i,然后从那里向上计数。
    2. 如果你看过 more 而不是15个元素,则从总和中减去数组位置i % 15的元素。这将从滚出窗口的滚动总和中删除元素。
    3. 从文件中读取一个新元素。
    4. 将新元素添加到总和中。这会在滚动到窗口时为滚动总和添加元素。
    5. 将新元素存储在数组位置i % 15
    6. 如果您看过15个或更多元素,请将移动平均值输出为sum / 15.0
  4. 移动平均线的想法是仅对窗口中的元素求平均值。数组跟踪窗口。

    使用上面的算法,总和跟踪窗口中元素的总和。在向窗口添加元素时,将它们添加到总和中。当您从窗口中删除元素时,将其从总和中删除。

    然后,移动平均值只是除以窗口大小的总和。