C++ 如何从.txt文件创建15个运行平均值?
我正在尝试微调一个程序,该程序从.txt文件中获取一系列值,并创建15个值的运行平均值。例如,它将读取前15个值,在第15个数字旁边输出此平均值,然后读取值2-16,取平均值并在第16个数字旁边输出。然后它将读取值3-17,取平均值并将其输出到第17个数字旁边,依此类推。不幸的是,我的计划没有取得多大进展,但以下是我迄今为止的代码:C++ 如何从.txt文件创建15个运行平均值?,c++,arrays,average,file-io,C++,Arrays,Average,File Io,我正在尝试微调一个程序,该程序从.txt文件中获取一系列值,并创建15个值的运行平均值。例如,它将读取前15个值,在第15个数字旁边输出此平均值,然后读取值2-16,取平均值并在第16个数字旁边输出。然后它将读取值3-17,取平均值并将其输出到第17个数字旁边,依此类推。不幸的是,我的计划没有取得多大进展,但以下是我迄今为止的代码: #include "stdafx.h" #include <iostream> #include <fstream> #include &l
#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;
}
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#定义数组化10000
#定义其他10000个
内部主(空)
{
//需要的东西
河流充填;
出流孔的直径;
双X阵列[阵列化];
双亚雷[排列];
双倍平均;
双和=0;
双sum2=0;
双平均值2;
infle.open(“data.txt”);
if(infle.fail()){
cout>xArray[ARRAYSIZE];
sum=xArray[ARRAYSIZE]+sum;
平均值=总和/(z+1);
}
UpField我不想只给你工作代码。但是为了让你不被困,考虑下面的方法:
声明一个正好包含15个元素的数组
将总和初始化为0
循环所有传入元素,执行以下操作:
为第一个元素保留一个从0开始的索引值i
,并从那里向上计数
如果您看到的元素超过15个,请从总和中减去数组位置i%15
处的元素。这将从从窗口滑出的滚动总和中删除元素
从文件中读取一个新元素
将新元素添加到总和中。这会在元素滑入窗口时将其添加到滚动总和中
将新元素存储在数组位置i%15
如果您看到了15个或更多元素,请将移动平均值输出为sum/15.0
移动平均的概念是只对窗口中的元素进行平均。数组跟踪窗口
使用上述算法,总和跟踪窗口中元素的总和。向窗口中添加元素时,将其添加到总和中。从窗口中删除元素时,将其从总和中删除
移动平均值,只是窗口大小除以的总和。
< P>我不想只给你工作代码。但是为了让你不被困,考虑下面的方法:
声明一个正好包含15个元素的数组
将总和初始化为0
循环所有传入元素,执行以下操作:
为第一个元素保留一个从0开始的索引值i
,并从那里向上计数
如果您看到的元素超过15个,请从总和中减去数组位置i%15
处的元素。这将从从窗口滑出的滚动总和中删除元素
从文件中读取一个新元素
将新元素添加到总和中。这会在元素滑入窗口时将其添加到滚动总和中
将新元素存储在数组位置i%15
如果您看到了15个或更多元素,请将移动平均值输出为sum/15.0
移动平均的概念是只对窗口中的元素进行平均。数组跟踪窗口
使用上述算法,总和跟踪窗口中元素的总和。向窗口中添加元素时,将其添加到总和中。从窗口中删除元素时,将其从总和中删除
那么,移动平均值就是总和除以窗口大小。你的指数xArray[ARRAYSIZE]
和yArray[OTHER]
不正确。它们访问数组末尾的一个元素。实际上,按照您编写代码的方式,您根本不需要数组,因此您可能会重新思考自己在做什么。如果您确实想要滑动窗口平均值,则需要对最后15个示例执行某些操作,但您只查看最新的示例。@JoeZ你能给我一个代码示例来说明你的意思吗?没有数组你会怎么做?@HansPassant你切换for循环到底是什么意思?我不是说没有数组你也可以。我是说你的代码没有使用它声明的数组,因为它总是读写同一个元素。这表明你在做一些事情你的索引xArray[ARRAYSIZE]
和yArray[OTHER]
不正确。它们访问数组末尾的一个元素。实际上,按照您编写代码的方式,您根本不需要数组,因此您可能会重新思考自己在做什么。如果您确实想要滑动窗口平均值,则需要对最后15个示例执行某些操作,但您只查看最新的示例。@JoeZ你能给我一个代码示例来说明你的意思吗?没有数组你会怎么做?@HansPassant你切换for循环到底是什么意思?我不是说没有数组你也可以。我是说你的代码没有使用它声明的数组,因为它总是读写同一个元素。这表明你在做一些事情荣。