#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){ count = std::min(count+1, WindowSize); buffer[index] = sample; index = (index + 1)% WindowSize; T avg = 0; for (int i=0; i<count; i++) { avg += buffer[i]; } return avg/ (T)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