コンストラクターでステップサイズ(n)を受け取るクラスを記述します。クラス内の唯一のメソッドは整数を受け取り、それを数値のシーケンスに追加し、シーケンスに挿入された最後のn個の値の平均を返します。平均を計算するためにシーケンスを繰り返さないでください。
いいえ、これは宿題ではありません
以下は、C++でそれを行う私の方法です。
- 2つのSTL
queue<int>
を初期化します。そのうちの1つには長さn
があり、buffer
- ユーザー入力値はバッファに動的に保存されます。これ
buffer
がいっぱいになったら、ユーザー入力値を「合計」に追加し、値を減算しbuffer.front()
ます。 buffer
最初の値をから2番目のqueue<int>
名前の値にプッシュしますvalues
- 最初の値をポップします(
buffer.pop()
) - で割って平均を返し
sum
ますn
以下は私が思いついたコードです:
#ifndef calcAverage_Window_h
#define calcAverage_Window_h
#include <iostream>
#include <queue>
using namespace std;
class Window{
private:
int n, sum;
queue<int> values, buffer, sums;
public:
Window(int);
float calcAverage(int);
};
#endif
#include "Window.h"
Window::Window(int m){
n = m;
buffer.push(1);
buffer.push(2);
buffer.push(3);
sum = 6;
}
float Window::calcAverage(int val){
buffer.push(val);
values.push(buffer.front());
sum = sum + val - buffer.front();
buffer.pop();
return float(sum)/n; //float(sum) required so that calcAverage doesn't return an int
}
#include "Window.h"
int main()
{
Window w(3);
cout<<w.calcAverage(4)<<endl;
cout<<w.calcAverage(5)<<endl;
cout<<w.calcAverage(6)<<endl;
return 0;
}
次の質問があります。
- これを行うためのより良い方法はありますか?
- STLの使用も許可されていない場合は、キューを実装し、それをとに使用し
buffer
ますvalues
。誰かもっと良いアイデアがありますか? Window(n)
コンストラクターでバッファーを初期化することで少しだましました。これは、次の理由によるものです。1)他にどのように対処するかわからなかった2)の場合は明らかかもしれませんが、の場合n = 2
はあいまいですn = 3
。- このメソッド/コードはどこで失敗しますか?
- 私は経験的にこのように考えるようになりました。この問題を調べるアルゴリズム的な方法はありますか?