2013-12-09 23 views
0

我正在嘗試微調從.txt文件中獲取一系列值的程序,並創建一個運行平均值爲15的值。例如,它會讀取前15個值,在第15個數字旁邊輸出該平均值,然後讀取值2-16,取平均值並將其輸出到第16個數字旁邊。然後它將讀取值3-17,取平均值並將其輸出到第17個數字旁邊等等。不幸的是我沒有在我的計劃取得了很大的進展,但這裏是我的代碼至今:如何從.txt文件創建15個值的運行平均值?

#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價值段。

+0

您的索引'xArray [ARRAYSIZE]'和'yArray [OTHER]'不正確。他們訪問數組末尾的一個元素。您編寫代碼的方式實際上並不需要數組,因此您可能會重新考慮自己在做什麼。如果您確實需要滑動窗口平均值,則需要對最近的15個樣本進行一些操作,但只能查看最近的樣本。 –

+0

@JoeZ你能給我一個你的意思的代碼示例嗎?你會怎麼做沒有陣列? –

+0

@HansPassant通過切換for循環,你的意思是什麼? –

回答

4

我不想只交給你工作代碼。但爲了讓你不卡住,請考慮以下方法:

  1. 聲明一個數組,其中包含剛好15個元素。
  2. 初始化的總和爲0。
  3. 遍歷所有傳入的元素,執行以下步驟:
    1. 保持從0開始的第一個元素和計數向上從那裏索引值i
    2. 如果您看過超過15個元素,則從總和中減去陣列位置i % 15上的元素。這將從滾動窗口中移出的滾動總和中移除元素。
    3. 從文件中讀入一個新元素。
    4. 將新元素添加到總和中。當它們滑入您的窗口時,這會將元素添加到滾動總和中。
    5. 將新元素存儲在陣列位置i % 15
    6. 如果您看過15個或更多元素,請將您的移動平均值輸出爲sum/15.0

移動平均的想法是隻在平均窗口中的元素。數組跟蹤窗口。

使用上述算法,總和跟蹤窗口中元素的總和。在向窗口添加元素時,將它們添加到總和中。當你從窗口中刪除元素時,你可以從總和中刪除它們。

那麼移動平均數就是總和除以窗口大小。

相關問題