#include <stdint.h>
#include <iostream>
#define BUF_SIZE 16 //размер буфера - должен быть стпенью двойки
#define BUF_MASK (BUF_SIZE-1)
using namespace std;
const uint8_t sum_of_numbers[] = {0,1,3,6,10,15,21,28,36,45,55};
const uint16_t sum_of_squares[] = {0,1,5,14,30,55,91,140,204,285,385};
class Data_Buffer{
public:
uint8_t count=0;
void reset() {
count =0;
idxIN = 0;
idxOUT = 0;
}
void put(const int val) {
buffer[idxIN++] = val;
idxIN &= BUF_MASK;
if (count < BUF_MASK) count++;
}
int get() {
if ( ! count) return -9999;
idxOUT = idxIN - 1;
idxOUT &= BUF_MASK;
return buffer[idxOUT];
}
int average(uint8_t norm) {
long sum =0;
if (norm >= count) norm = count;
if ( ! norm) return -9999;
idxOUT = idxIN - 1;
idxOUT &= BUF_MASK;
for (int i =0; i<norm; i++) {
sum += buffer[idxOUT--];
idxOUT &= BUF_MASK;
}
return sum/norm;
}
int trend(uint8_t norm) {
long sum =0;
if (norm > count) norm = count;
if (norm > 10) norm = 10;
if ( norm <4 ) return -9999;
idxOUT = idxIN - 1;
idxOUT &= BUF_MASK;
for (int i = norm-1; i>0; i--) {
sum += buffer[idxOUT--] * i;
idxOUT &= BUF_MASK;
}
return ((sum - sum_of_numbers[norm-1] * buffer[idxOUT])) / sum_of_squares[norm-1];
}
Data_Buffer() {
reset();
}
private:
uint16_t buffer [BUF_SIZE];
uint8_t idxIN, idxOUT;
};
int main() {
auto buf = Data_Buffer();
buf.put(5);
buf.put(6);
buf.put(7);
buf.put(0);
std::cout << buf.trend(4) << std::endl;
}
I2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNkZWZpbmUgQlVGX1NJWkUgMTYgLy/RgNCw0LfQvNC10YAg0LHRg9GE0LXRgNCwIC0g0LTQvtC70LbQtdC9INCx0YvRgtGMINGB0YLQv9C10L3RjNGOINC00LLQvtC50LrQuAojZGVmaW5lIEJVRl9NQVNLIChCVUZfU0laRS0xKQp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCmNvbnN0IHVpbnQ4X3Qgc3VtX29mX251bWJlcnNbXSA9IHswLDEsMyw2LDEwLDE1LDIxLDI4LDM2LDQ1LDU1fTsgCmNvbnN0IHVpbnQxNl90IHN1bV9vZl9zcXVhcmVzW10gPSB7MCwxLDUsMTQsMzAsNTUsOTEsMTQwLDIwNCwyODUsMzg1fTsgCgpjbGFzcyBEYXRhX0J1ZmZlcnsKICBwdWJsaWM6CiAgdWludDhfdCBjb3VudD0wOwogCiAgCiAgdm9pZCByZXNldCgpIHsKICAgICBjb3VudCA9MDsKICAgICBpZHhJTiA9IDA7CiAgICAgaWR4T1VUID0gMDsKICB9CiAgCiAgdm9pZCBwdXQoY29uc3QgaW50IHZhbCkgewogICAgIGJ1ZmZlcltpZHhJTisrXSA9IHZhbDsKICAgICBpZHhJTiAmPSBCVUZfTUFTSzsKICAgICBpZiAoY291bnQgPCBCVUZfTUFTSykgY291bnQrKzsKICB9CiAgCiAgaW50IGdldCgpIHsKICAgICBpZiAoICEgY291bnQpIHJldHVybiAtOTk5OTsKICAgICBpZHhPVVQgPSBpZHhJTiAtIDE7CiAgICAgaWR4T1VUICY9IEJVRl9NQVNLOwogICAgIHJldHVybiAgYnVmZmVyW2lkeE9VVF07CiAgfQogIAogIGludCBhdmVyYWdlKHVpbnQ4X3Qgbm9ybSkgewogICAgIGxvbmcgc3VtID0wOwoJIGlmIChub3JtID49IGNvdW50KSBub3JtID0gY291bnQ7CgkgaWYgKCAhIG5vcm0pIHJldHVybiAtOTk5OTsKCSAKCSBpZHhPVVQgPSBpZHhJTiAtIDE7CgkgaWR4T1VUICY9IEJVRl9NQVNLOwoJIGZvciAoaW50IGkgPTA7IGk8bm9ybTsgaSsrKSAgewoJICAgICAgc3VtICs9IGJ1ZmZlcltpZHhPVVQtLV07CgkJICBpZHhPVVQgJj0gQlVGX01BU0s7CgkJICB9CgkgcmV0dXJuIHN1bS9ub3JtOwoJICAKCX0gCiAgCiAgIGludCB0cmVuZCh1aW50OF90IG5vcm0pIHsKICAgICBsb25nIHN1bSA9MDsKCSBpZiAobm9ybSA+IGNvdW50KSBub3JtID0gY291bnQ7CgkgaWYgKG5vcm0gPiAxMCkgbm9ybSA9IDEwOwoJIGlmICggbm9ybSA8NCApIHJldHVybiAtOTk5OTsKCSAKCSBpZHhPVVQgPSBpZHhJTiAtIDE7CgkgaWR4T1VUICY9IEJVRl9NQVNLOwogICAgICAgICBmb3IgKGludCBpID0gbm9ybS0xOyBpPjA7IGktLSkgewoJICAgc3VtICs9IGJ1ZmZlcltpZHhPVVQtLV0gKiBpOwogICAgICAgICAgIGlkeE9VVCAmPSBCVUZfTUFTSzsKCSAgfQogICAgIHJldHVybiAoKHN1bSAtIHN1bV9vZl9udW1iZXJzW25vcm0tMV0gKiBidWZmZXJbaWR4T1VUXSkpIC8gc3VtX29mX3NxdWFyZXNbbm9ybS0xXTsKCSB9CiAKICBEYXRhX0J1ZmZlcigpIHsKICAgcmVzZXQoKTsKICAgfQogIAogIHByaXZhdGU6CiAgdWludDE2X3QgYnVmZmVyIFtCVUZfU0laRV07CiAgdWludDhfdCBpZHhJTiwgaWR4T1VUOwogIH07CiAKIGludCBtYWluKCkgewoJYXV0byBidWYgPSBEYXRhX0J1ZmZlcigpOwkKCWJ1Zi5wdXQoNSk7CglidWYucHV0KDYpOwoJYnVmLnB1dCg3KTsKCWJ1Zi5wdXQoMCk7CglzdGQ6OmNvdXQgPDwgYnVmLnRyZW5kKDQpIDw8IHN0ZDo6ZW5kbDsKIH0KIAogIA==