Advertisement
greannmhar

inheritance 10

Nov 6th, 2024
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <stdexcept>
  4.  
  5. // Класс массива
  6. class Array {
  7. private:
  8.     double* data;
  9.     size_t size;
  10. public:
  11.     // Конструктор с заданным размером
  12.     Array(size_t size) : size(size), data(new double[size]) {}
  13.  
  14.     // Конструктор копирования
  15.     Array(const Array& other) : size(other.size), data(new double[other.size]) {
  16.         for (size_t i = 0; i < size; ++i) {
  17.             data[i] = other.data[i];
  18.         }
  19.     }
  20.  
  21.     // Деструктор
  22.     ~Array() {
  23.         delete[] data;
  24.     }
  25.  
  26.     // Оператор присваивания
  27.     Array& operator=(const Array& other) {
  28.         if (this == &other) return *this;
  29.         delete[] data;
  30.         size = other.size;
  31.         data = new double[size];
  32.         for (size_t i = 0; i < size; i++) {
  33.             data[i] = other.data[i];
  34.         }
  35.         return *this;
  36.     }
  37.  
  38.     // Оператор доступа (чтение)
  39.     double operator[](size_t index) const {
  40.         return data[index];
  41.     }
  42.  
  43.     // Оператор доступа (запись)
  44.     double& operator[](size_t index) {
  45.         return data[index];
  46.     }
  47.  
  48.     // Возвращает размер массива
  49.     size_t Size() const { return size; }
  50.  
  51.  
  52. };
  53.  
  54. // Базовый класс для всех операций
  55. class Operator {
  56. public:
  57.     virtual Array Process(const Array& input) const = 0; // Чисто виртуальный метод
  58.     virtual ~Operator() {}
  59. };
  60.  
  61. // Класс AddConstant: добавляет константу к каждому элементу массива
  62. class AddConstant : public Operator {
  63. private:
  64.     double value;
  65.  
  66. public:
  67.     AddConstant(double value) : value(value) {}
  68.  
  69.     Array Process(const Array& input) const override {
  70.         Array result(input.Size());
  71.         for (size_t i = 0; i < input.Size(); ++i) {
  72.             result[i] = input[i] + value;
  73.         }
  74.         return result;
  75.     }
  76. };
  77.  
  78. // Класс Clip: ограничивает значения массива минимальным и максимальным значением
  79. class Clip : public Operator {
  80. private:
  81.     double minValue;
  82.     double maxValue;
  83.  
  84. public:
  85.     Clip(double minValue, double maxValue) : minValue(minValue), maxValue(maxValue) {}
  86.  
  87.     Array Process(const Array& input) const override {
  88.         Array result(input.Size());
  89.         for (size_t i = 0; i < input.Size(); ++i) {
  90.             if (input[i] < minValue) {
  91.                 result[i] = minValue;
  92.             } else if (input[i] > maxValue) {
  93.                 result[i] = maxValue;
  94.             } else {
  95.                 result[i] = input[i];
  96.             }
  97.         }
  98.         return result;
  99.     }
  100. };
  101.  
  102. // Класс Log: вычисляет натуральный логарифм для каждого элемента массива
  103. class Log : public Operator {
  104. public:
  105.     Array Process(const Array& input) const override {
  106.         Array result(input.Size());
  107.         for (size_t i = 0; i < input.Size(); ++i) {
  108.             if (input[i] <= 0) {
  109.                 throw std::invalid_argument("Error: Logarifm not defined for non positive values");
  110.             }
  111.             result[i] = std::log(input[i]);
  112.         }
  113.         return result;
  114.     }
  115. };
  116.  
  117. // Класс Pipeline: объединяет цепочку операторов
  118. class Pipeline : public Operator {
  119. private:
  120.     Operator** ops; // Двойной указатель для полиморфных операторов
  121.     size_t count;   // Количество операторов
  122.  
  123. public:
  124.     Pipeline() : ops(nullptr), count(0) {}
  125.  
  126.     // Добавление оператора в цепочку
  127.     void AddOperator(Operator* op) {
  128.         Operator** newOps = new Operator*[count + 1];
  129.         for (size_t i = 0; i < count; ++i) {
  130.             newOps[i] = ops[i];
  131.         }
  132.         newOps[count] = op;
  133.         delete[] ops;
  134.         ops = newOps;
  135.         count++;
  136.     }
  137.  
  138.     // Применение всех операторов по цепочке
  139.     Array Process(const Array& input) const override {
  140.         Array result = input;
  141.         for (size_t i = 0; i < count; ++i) {
  142.             result = ops[i]->Process(result);
  143.         }
  144.         return result;
  145.     }
  146.  
  147.     // Деструктор
  148.     ~Pipeline() {
  149.         delete[] ops;
  150.     }
  151. };
  152.  
  153. // Главная функция для демонстрации работы
  154. int main() {
  155.     try {
  156.         // Создаём массив данных
  157.         Array data(5);
  158.         data[0] = 1.0;
  159.         data[1] = 2.0;
  160.         data[2] = 3.0;
  161.         data[3] = 12;
  162.         data[4] = -7.0; // Пример неположительного числа
  163.  
  164.         // Создаём операторы
  165.         AddConstant addOp(5.0);
  166.         Clip clipOp(0.0, 10.0);
  167.         Log logOp;
  168.  
  169.         // Создаём pipeline и добавляем операторы
  170.         Pipeline pipeline;
  171.         pipeline.AddOperator(&addOp);
  172.         pipeline.AddOperator(&clipOp);
  173.         pipeline.AddOperator(&logOp);
  174.  
  175.         // Применяем pipeline к данным
  176.         Array result = pipeline.Process(data);
  177.  
  178.         // Выводим результат
  179.         for (size_t i = 0; i < result.Size(); ++i) {
  180.             std::cout << result[i] << " ";
  181.         }
  182.         std::cout << std::endl;
  183.     } catch (const std::exception& ex) {
  184.         std::cerr << "Exception: " << ex.what() << std::endl;
  185.     }
  186.  
  187.     return 0;
  188. }
  189.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement