#include <iostream>
#include <iomanip>
// TODO: Define Class Template 'MovingAverage'
// Template Parameters: typename T, int WindowSize
template <typename T, int WindowSize>
class MovingAverage {
private:
T buffer[WindowSize];
int count; // Number of valid samples currently in buffer (0 to WindowSize)
int index; // Current insertion index (circular)
public:
MovingAverage() : count(0), index(0) {}
// TODO: Implement addSample(T sample)
int addSample(T sample){
buffer[index] = sample;
index = (index+1)%WindowSize;
count++;
int len = (count<WindowSize)? count : WindowSize;
T sum = 0;
for(int i=0; i<len; i++){
sum+=buffer[i];
}
return sum/len;
}
// 1. Store sample
// 2. Update count and index
// 3. Calculate and return average
};
int main() {
// Instantiate filter for float with window size 4
MovingAverage<float, 4> filter;
int N;
if (!(std::cin >> N)) return 0;
for (int i = 0; i < N; ++i) {
float sample;
std::cin >> sample;
float avg = filter.addSample(sample);
std::cout << "Avg: " << std::fixed << std::setprecision(2) << avg << std::endl;
}
return 0;
}
Input
5 10.0 20.0 30.0 40.0 50.0
Expected Output
Avg: 10.00 Avg: 15.00 Avg: 20.00 Avg: 25.00 Avg: 35.00