#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) // 1. Store sample // 2. Update count and index // 3. Calculate and return average T addSample(T sample){ T avg = 0; buffer[index] = sample; index = (index + 1) % WindowSize; if(count < WindowSize) count++; else count = WindowSize; for(int i=0; i< count; ++i){ avg += buffer[i]; } return avg / count; } }; 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; }
Test Cases
Test Results
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