Advertisement
carrot385

Anya6

Feb 8th, 2022
1,193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.80 KB | None | 0 0
  1. #include <iostream> //Подключаем библиотеку для потока входных и выходных данных
  2.  
  3. using namespace std; //используем пространство стандартных имен
  4.  
  5. // Кратко объявляем класс вектор
  6. class Vector;
  7.  
  8. // Объявляем класс Matrix
  9. class Matrix
  10. {
  11.   //приватные поля
  12. private:
  13.   int **matrix;    //Матрица
  14.   int n, m;        //размеры матрицы
  15.   int number;      // Номер матрицы
  16.   int multiple = 1;    // Произведение положит. элементов
  17.   //Публичные поля
  18. public:
  19.   // Конструктор
  20.   Matrix(int n, int m, int num);
  21.   // Основной метод для получения количества элемента
  22.   int calculate_multiple();
  23.   // Метод для вывода матрицы
  24.   void output_matrix();
  25.  
  26.   Matrix(const Matrix &matr);                                        //Конструктор копирования
  27.   Matrix &operator=(const Matrix &right);                            //Переопределение операции присваивания
  28.   friend Matrix operator*(const Matrix &matr1, const Matrix &matr2); //Переопределение оператора умножения
  29.   friend Vector Multiply(const Matrix &matr, const Vector &vector);  //Произведение матрицы на вектор
  30.   Matrix(int n, int m);
  31.   // Деструктор
  32.   ~Matrix();
  33. };
  34.  
  35. // Описания конструктора
  36. Matrix::Matrix(int n, int m, int num) : n(n), m(m), number(num)
  37. {
  38.   cout << "Enter elements of matrix" << num << " size of " << n << "x" << m << endl;
  39.   // Объявляем матрицу и динамически выделяем память под строки
  40.   matrix = new int *[n];
  41.   for (int i = 0; i < n; i++)
  42.   {
  43.     // Вделяем память под столбцы
  44.     matrix[i] = new int[m];
  45.     for (int j = 0; j < m; j++)
  46.     {
  47.       // Вводим элементы матрицы
  48.       matrix[i][j] = rand() % 8 - 2;
  49.     }
  50.   }
  51.   for (int i = 0; i < n; i++)
  52.   {
  53.     for (int j = 0; j < m; j++)
  54.     {
  55.       cout << matrix[i][j] << " ";
  56.     }
  57.     cout << endl;
  58.   }
  59. }
  60.  
  61. // Описание основного метода
  62. int Matrix::calculate_multiple()
  63. {
  64.   for(int i = 0; i < n; i++)
  65.     {
  66.       for(int j = 0; j < m; j++)
  67.       {
  68.         if(i!=j && matrix[i][j] > 0)
  69.         {
  70.           multiple*=matrix[i][j];
  71.         }
  72.       }
  73.     }
  74.     return multiple;
  75. }
  76. //Описание деструктора
  77. Matrix::~Matrix()
  78. {
  79.   for (int i = 0; i < n; i++)
  80.   {
  81.     delete[] matrix[i];
  82.   }
  83. }
  84.  
  85. //Вывод матрицы
  86. void Matrix::output_matrix()
  87. {
  88.   cout << "Output matrix " << number << endl;
  89.   for (int i = 0; i < n; i++)
  90.   {
  91.     for (int j = 0; j < m; j++)
  92.     {
  93.       cout << matrix[i][j] << " ";
  94.     }
  95.     cout << endl;
  96.   }
  97. }
  98.  
  99. //Описание конструктора копирования
  100. Matrix::Matrix(const Matrix &matr)
  101. {
  102.   //Проверка на пустой указатель
  103.   if (matrix != nullptr)
  104.   {
  105.     for (int i = 0; i < n; i++)
  106.     {
  107.       delete[] matrix[i]; //удаляем память
  108.     }
  109.   }
  110.   // Копируем все данные
  111.   this->n = matr.n;
  112.   this->m = matr.m;
  113.   this->number = matr.number;
  114.   this->matrix = new int *[n];
  115.   for (int i = 0; i < n; i++)
  116.   {
  117.     this->matrix[i] = new int[m];
  118.     for (int j = 0; j < m; j++)
  119.     {
  120.       this->matrix[i][j] = matr.matrix[i][j];
  121.     }
  122.   }
  123. }
  124.  
  125. Matrix::Matrix(int n, int m)
  126.     : n(n), m(m)
  127. {
  128.   matrix = new int *[n];
  129.   for (int i = 0; i < n; i++)
  130.   {
  131.     matrix[i] = new int[m];
  132.     for (int j = 0; j < m; j++)
  133.     {
  134.       matrix[i][j] = 0;
  135.     }
  136.   }
  137. }
  138.  
  139. //Описание функции переопределения оператора присваивания
  140. Matrix &Matrix::operator=(const Matrix &right)
  141. {
  142.   //Проверка на пустой указатель
  143.   if (matrix != nullptr)
  144.     for (int i = 0; i < n; i++)
  145.     {
  146.       delete[] matrix[i];
  147.     }
  148.   //Копируем все данные
  149.   this->n = right.n;
  150.   this->m = right.m;
  151.   this->matrix = new int *[n];
  152.   for (int i = 0; i < n; i++)
  153.   {
  154.     this->matrix[i] = new int[m];
  155.     for (int j = 0; j < m; j++)
  156.     {
  157.       this->matrix[i][j] = right.matrix[i][j];
  158.     }
  159.   }
  160.   return *this; //Возвращаем ссылку на текущий объект
  161. }
  162.  
  163. //Описание переопределения оператора умножения
  164. Matrix operator*(const Matrix &matr1, const Matrix &matr2)
  165. {
  166.   //Объявляем новыую матрицу нужных размеров
  167.   Matrix res(matr1.m, matr2.n);
  168.   //Делаем проверку на невозможность умножения
  169.   if (matr1.m != matr2.n)
  170.   {
  171.     cout << "Multiplication is impossible" << endl;
  172.   }
  173.   else
  174.   {
  175.     for (int i = 0; i < matr1.n; i++)
  176.     {
  177.       for (int j = 0; j < matr2.m; j++)
  178.       {
  179.         res.matrix[i][j] = 0;
  180.         for (int k = 0; k < matr1.m; k++)
  181.         {
  182.           res.matrix[i][j] += matr1.matrix[i][k] * matr2.matrix[k][j]; // Перемножаем матрицы по правилу
  183.         }
  184.       }
  185.     }
  186.   }
  187.   return res;
  188. }
  189.  
  190. class Vector
  191. {
  192. private:
  193.   int len;               //длина вектора
  194.   double *vec = nullptr; //объявляем указатель на вектор и обнуляем его
  195.  
  196. public:
  197.   Vector(int n);                                                         // Конструктор класса
  198.   Vector(const Vector &vector);                                          //Конструктор копирования
  199.   void input_vec();                                                      //Ввод вектора
  200.   Vector &operator=(const Vector &vector);                               //Переопределение оператора присваивания
  201.   friend Vector operator*(const Vector &vector1, const Vector &vector2); //Переопределение оператора умножения
  202.   friend Vector Multiply(const Matrix &matr, const Vector &vector);      //Умножение матрицы на вектор
  203.   void output_vec();                                                     //Вывод вектора
  204.   ~Vector();                                                             //Деструктор
  205. };
  206.  
  207. // Конструктор класса Vector
  208. Vector::Vector(int n) : len(n)
  209. {
  210.   vec = new double[n];
  211.   for (int i = 0; i < n; i++)
  212.   {
  213.     vec[i] = 0;
  214.   }
  215. }
  216.  
  217. //Конструктор копирования
  218. Vector::Vector(const Vector &vector)
  219. {
  220.   //Проверка ну пустой указатель
  221.  
  222.   if (vec != nullptr)
  223.   {
  224.     delete[] vec;
  225.   }
  226.   len = vector.len;
  227.   vec = new double[len];
  228.   for (int i = 0; i < len; i++)
  229.     vec[i] = vector.vec[i];
  230. }
  231.  
  232. // Переопределение операции присваивания
  233. Vector &Vector::operator=(const Vector &vector)
  234. {
  235.   if (vec != nullptr)
  236.   {
  237.     delete[] vec;
  238.   }
  239.   len = vector.len;
  240.   vec = new double[len];
  241.   for (int i = 0; i < len; i++)
  242.     vec[i] = vector.vec[i];
  243.   return (*this);
  244. }
  245.  
  246. void Vector::input_vec()
  247. {
  248.   for (int i = 0; i < len; i++)
  249.   {
  250.     vec[i] = rand() % 50 + 1;
  251.   }
  252. }
  253.  
  254. Vector operator*(const Vector &vector1, const Vector &vector2)
  255. {
  256.   if (vector1.len < vector2.len)
  257.   {
  258.     for (int i = 0; i < vector1.len; i++)
  259.     {
  260.       vector2.vec[i] *= vector1.vec[i];
  261.     }
  262.     return vector2;
  263.   }
  264.   else
  265.   {
  266.     for (int i = 0; i < vector2.len; i++)
  267.     {
  268.       vector1.vec[i] *= vector2.vec[i];
  269.     }
  270.     return vector1;
  271.   }
  272. }
  273.  
  274. Vector::~Vector()
  275. {
  276.   delete vec;
  277. }
  278.  
  279. Vector Multiply(const Matrix &matr, const Vector &vector)
  280. {
  281.   Vector res(matr.n);
  282.   if (matr.m != vector.len)
  283.   {
  284.     cout << "Multiplication is impossible" << endl;
  285.   }
  286.   else
  287.     for (int i = 0; i < matr.n; i++)
  288.     {
  289.       res.vec[i] = 0;
  290.       for (int j = 0; j < matr.m; j++)
  291.         res.vec[i] = res.vec[i] + matr.matrix[i][j] * vector.vec[j];
  292.     }
  293.   return (res);
  294. }
  295.  
  296. void Vector::output_vec()
  297. {
  298.   for (int i = 0; i < len; i++)
  299.   {
  300.     cout << vec[i] << " ";
  301.   }
  302.   cout << endl;
  303. }
  304.  
  305. int main()
  306. {
  307.   // Объявление объектов класса Matrix
  308.   Matrix matrix1(5, 4, 1);
  309.   Matrix matrix2(5, 5, 2);
  310.   Matrix matrix3(3, 7, 3);
  311.  
  312.   // Создание экземпляров класса Vector
  313.   Vector vec1(5);
  314.   vec1.input_vec();
  315.  
  316.   Vector vec2(7);
  317.   vec2.input_vec();
  318.  
  319.   //Илюстрация работы конструктора копирования и переопределенного оператора присваивания
  320.   cout << ".......................Copy constructors...................." << endl
  321.        << endl;
  322.   cout << "Counstructor copy for vector:" << endl;
  323.   Vector vec3(vec2);
  324.   cout << "Output of vector 2" << endl;
  325.   vec2.output_vec();
  326.   cout << "Output of vector 3" << endl;
  327.   vec3.output_vec();
  328.   cout << endl << endl;
  329.  
  330.   cout << "Counstructor copy for matrix:" << endl;
  331.   Matrix matrix4(matrix2);
  332.   cout << "Output of matrix 2" << endl;
  333.   matrix2.output_matrix();
  334.   cout << "Output of matrix 3" << endl;
  335.   matrix4.output_matrix();
  336.   cout << endl << endl;
  337.  
  338.   cout << ".....................Reload operator........................" << endl << endl;
  339.   cout << "For matrix: " << endl;
  340.   matrix4 = matrix1;
  341.   cout << "Output matrix3" << endl;
  342.   matrix4.output_matrix();
  343.   cout << "Output matrix1" << endl;
  344.   matrix1.output_matrix();
  345.   cout << endl << endl;
  346.  
  347.   cout << "For vector: " << endl;
  348.   vec3 = vec1;
  349.   cout << "Output vector1" << endl;
  350.   vec1.output_vec();
  351.   cout << "Output vector2" << endl;
  352.   vec3.output_vec();
  353.   cout << endl << endl;
  354.  
  355.   // Умножение вектора на вектор
  356.   cout << "...............................Multiple of vectors......................" << endl;
  357.   vec3 = vec1 * vec2;
  358.   cout << "Output vector3" << endl;
  359.   vec3.output_vec();
  360.   cout << endl << endl;
  361.  
  362.   // Умножение матрицы на матрицу
  363.   cout << ".........................Multiple 2 matrix............................." << endl;
  364.   Matrix matrix5(6, 5, 1);
  365.   Matrix matrix6(4, 7, 2);
  366.   matrix4 = matrix5 * matrix6;
  367.   cout << "Output matrix4" << endl;
  368.   matrix4.output_matrix();
  369.   cout << endl << endl;
  370.  
  371.   // Решение основной задачи
  372.   cout << "The main solve of the task" << endl;
  373.   // Получаем результаты из вызванной функции
  374.   int mult1 = matrix1.calculate_multiple();
  375.   int mult2 = matrix2.calculate_multiple();
  376.   int mult3 = matrix3.calculate_multiple();
  377.  
  378.   // Подсчет выражения
  379.   int result = mult1 + 2*mult2 - mult3;
  380.   // Выводим результаты
  381.   cout << "Result of expression: " << result << endl;
  382.   return 0;
  383. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement