fork download
  1. #include <stdint.h>
  2. #include <iostream>
  3. #define BUF_SIZE 16 //размер буфера - должен быть стпенью двойки
  4. #define BUF_MASK (BUF_SIZE-1)
  5. using namespace std;
  6.  
  7. const uint8_t sum_of_numbers[] = {0,1,3,6,10,15,21,28,36,45,55};
  8. const uint16_t sum_of_squares[] = {0,1,5,14,30,55,91,140,204,285,385};
  9.  
  10. class Data_Buffer{
  11. public:
  12. uint8_t count=0;
  13.  
  14.  
  15. void reset() {
  16. count =0;
  17. idxIN = 0;
  18. idxOUT = 0;
  19. }
  20.  
  21. void put(const int val) {
  22. buffer[idxIN++] = val;
  23. idxIN &= BUF_MASK;
  24. if (count < BUF_MASK) count++;
  25. }
  26.  
  27. int get() {
  28. if ( ! count) return -9999;
  29. idxOUT = idxIN - 1;
  30. idxOUT &= BUF_MASK;
  31. return buffer[idxOUT];
  32. }
  33.  
  34. int average(uint8_t norm) {
  35. long sum =0;
  36. if (norm >= count) norm = count;
  37. if ( ! norm) return -9999;
  38.  
  39. idxOUT = idxIN - 1;
  40. idxOUT &= BUF_MASK;
  41. for (int i =0; i<norm; i++) {
  42. sum += buffer[idxOUT--];
  43. idxOUT &= BUF_MASK;
  44. }
  45. return sum/norm;
  46.  
  47. }
  48.  
  49. int trend(uint8_t norm) {
  50. long sum =0;
  51. if (norm > count) norm = count;
  52. if (norm > 10) norm = 10;
  53. if ( norm <4 ) return -9999;
  54.  
  55. idxOUT = idxIN - 1;
  56. idxOUT &= BUF_MASK;
  57. for (int i = norm-1; i>0; i--) {
  58. sum += buffer[idxOUT--] * i;
  59. idxOUT &= BUF_MASK;
  60. }
  61. return ((sum - sum_of_numbers[norm-1] * buffer[idxOUT])) / sum_of_squares[norm-1];
  62. }
  63.  
  64. Data_Buffer() {
  65. reset();
  66. }
  67.  
  68. private:
  69. uint16_t buffer [BUF_SIZE];
  70. uint8_t idxIN, idxOUT;
  71. };
  72.  
  73. int main() {
  74. auto buf = Data_Buffer();
  75. buf.put(5);
  76. buf.put(6);
  77. buf.put(7);
  78. buf.put(0);
  79. std::cout << buf.trend(4) << std::endl;
  80. }
  81.  
  82.  
Success #stdin #stdout 0s 4488KB
stdin
Standard input is empty
stdout
0