Advertisement
Guest User

Untitled

a guest
May 21st, 2018
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.20 KB | None | 0 0
  1. // Arsentiev_vectormatrix_210518.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. #include "windows.h"
  7. #include <iostream>
  8.  
  9. template<typename T> // Шаблонный класс Matrix параметризуется типом данных, из которых состоит матрица - int (матрица целых), double (матрица вещественных) и т.д.
  10. class Matrix
  11. {
  12. private:
  13.     T** matrix_; // указатель на матрицу, далее число строк и число столбцов. Они задаются пользователем в конструкторе Matrix.
  14.     int rows_;
  15.     int columns_;
  16. public:
  17.     /* : rows_(... - Это список инициализации объекта. Он состоит из двух полей -
  18.     * rows_ и columns_. Оба инициализируются аргументами конструктора,
  19.     * которые передает пользователь. Это происходит до выполнения тела конструктора.
  20.     */
  21.     Matrix<T>(int _rows, int _columns)
  22.         : rows_(_rows), columns_(_columns)
  23.     {
  24.         matrix_ = new T*[_rows];
  25.         for (int i = 0; i < _rows; i++)
  26.         {
  27.             matrix_[i] = new T[_columns];
  28.         }
  29.     }
  30.  
  31.     /* Это обёртки для доступа к числу полей и столбцов. */
  32.     int getRows()
  33.     {
  34.         return rows_;
  35.     }
  36.  
  37.     int getColumns()
  38.     {
  39.         return columns_;
  40.     }
  41.  
  42.     /* Для доступа к элементам перегружается не operator[], а operator(). Это безопаснее, поскольку матрица не
  43.     * выдает свои строки как промежуточный результат, а позволяет обращаться только к числам по отдельности.
  44.     * Возвращается не значение результата, а ссылка на него - так можно и читать ячейку, и записывать в нее.
  45.     */
  46.     T& operator()(int _row, int _column)
  47.     {
  48.         return matrix_[_row][_column];
  49.     }
  50.  
  51.     /* Для всех Matrix<T>& operator'ов: */
  52.     Matrix<T>& operator-(T _arg)
  53.     {
  54.         /* Если матрица-результат в результате операции не меняется, вернуть исходную матрицу.*/
  55.         if (_arg == 0)
  56.         {
  57.             return *this;
  58.         }
  59.  
  60.         /* Иначе создаем матрицу-результат, той же размерности что исходная. */
  61.         Matrix<T>* result = new Matrix<T>(getRows(), getColumns());
  62.         for (int i = 0; i < getRows(); i++)
  63.         {
  64.             for (int j = 0; j < getColumns(); j++)
  65.             {
  66.                 /* result и this - указатели. Нужно разыменовать их, чтобы к получившимся объектам
  67.                 * типа Matrix можно было применить operator(). Это обыкновенное разыменование, this
  68.                 * окружен скобками только чтобы оно выполнялось раньше operator().
  69.                 */
  70.                 (*result)(i, j) = (*this)(i, j) - _arg;
  71.             }  
  72.         }
  73.         return *result;
  74.     }
  75.  
  76.     Matrix<T>& operator+(T _arg)
  77.     {
  78.         if (_arg == 0)
  79.         {
  80.             return *this;
  81.         }
  82.  
  83.         Matrix<T>* result = new Matrix<T>(getRows(), getColumns());
  84.         for (int i = 0; i < getRows(); i++)
  85.         {
  86.             for (int j = 0; j < getColumns(); j++)
  87.             {
  88.                 (*result)(i, j) = (*this)(i, j) + _arg;
  89.             }
  90.         }
  91.         return *result;
  92.     }
  93.  
  94.     Matrix<T>& operator*(T _arg)
  95.     {
  96.         if (_arg == 1)
  97.         {
  98.             return *this;
  99.         }
  100.  
  101.         Matrix<T>* result = new Matrix<T>(getRows(), getColumns());
  102.         for (int i = 0; i < getRows(); i++)
  103.         {
  104.             for (int j = 0; j < getColumns(); j++)
  105.             {
  106.                 (*result)(i, j) = (*this)(i, j) * _arg;
  107.             }
  108.         }
  109.         return *result;
  110.     }
  111. };
  112.  
  113. template<typename T> // Шаблонный класс Vector параметризуется типом данных, из которых состоит вектор - int (вектор целых), double (вектор вещественных) и т.д.
  114. class Vector
  115. {
  116. private:
  117.     T* vector_;
  118.     int size_;
  119. public:
  120.     Vector<T>(int _size)
  121.         : size_(_size) // Это список инициализации объекта. Он состоит из одного поля - поле size_ инициализируется параметром конструктора Vector.
  122.     {
  123.         vector_ = new T[_size];
  124.     }
  125.  
  126.     /* Это обёртка для доступа к числу элементов. */
  127.     int getSize()
  128.     {
  129.         return size_;
  130.     }
  131.  
  132.     /* См. Matrix::operator().
  133.     */
  134.     T& operator()(int _row)
  135.     {
  136.         return vector_[_row];
  137.     }
  138.  
  139.     /* Функция умножения вектора на матрицу. Возвращает вектор той же размерности,
  140.     * являющийся произведением, или вектор нулевой размерности, если умножение невозможно
  141.     */
  142.     Vector<T>& mult(Matrix<T>& _matrix)
  143.     {
  144.         if (size_ != _matrix.getRows())
  145.         {
  146.             return *(new Vector<T>(0));
  147.         }
  148.  
  149.         Vector<T>* result = new Vector<T>(size_);
  150.  
  151.         for (int i = 0; i < _matrix.getRows(); i++)
  152.         {
  153.             T buffer = 0;
  154.             for (int j = 0; j < _matrix.getColumns(); j++)
  155.             {
  156.                 buffer += _matrix(i, j) * (*this)(j);
  157.             }
  158.             (*result)(i) = buffer;
  159.         }
  160.  
  161.         return *result;
  162.     }
  163.  
  164.     /* Это дружественная классу Vector функция умножения. Она не принадлежит классу Vector,
  165.     * но имеет доступ к его закрытым полям.
  166.     * Возвращает вектор той же размерности,
  167.     * являющийся произведением, или вектор нулевой размерности, если умножение невозможно
  168.     */
  169.     friend Vector<T>& multVectorAndMatrix(Vector<T>& _vector, Matrix<T>& _matrix)
  170.     {
  171.         /* Дружественной классу Vector функции не нужно вызывать Vector::getSize(). Она обращается
  172.         * к закрытому полю size_ напрямую.
  173.         */
  174.         if (_vector.size_ != _matrix.getRows())
  175.         {
  176.             return *(new Vector<T>(0));
  177.         }
  178.  
  179.         Vector<T>* result = new Vector<T>(_vector.size_);
  180.  
  181.         for (int i = 0; i < _matrix.getRows(); i++)
  182.         {
  183.             T buffer = 0;
  184.             for (int j = 0; j < _matrix.getColumns(); j++)
  185.             {
  186.                 buffer += _matrix(i, j) * _vector(j);
  187.             }
  188.             (*result)(i) = buffer;
  189.         }
  190.  
  191.         return *result;
  192.     }
  193.  
  194.     /** ДЛЯ ВСЕХ Vector<T>& operator'ов */
  195.     Vector<T>& operator*(T _arg)
  196.     {
  197.         /* Если вектор-результат после умножения не отличается от исходного,
  198.         *  то не создавать новый вектор, а вернуть исходный.
  199.         */
  200.         if (_arg == 1)
  201.         {
  202.             return *this;
  203.         }
  204.  
  205.         /* Создание нового вектора и умножение. Возвращается ссылка на новый вектор.*/
  206.         Vector<T>* result = new Vector<T>(size_);
  207.         for (int i = 0; i < size_; i++)
  208.         {
  209.             /* Разыменовывается указатель на новый вектор, затем вызывается operator(),
  210.             * элементу нового вектора присваивается произведение.
  211.             * this - тоже указатель, и его тоже надо разыменовать перед тем как вызывать operator().
  212.             */
  213.             (*result)(i) = (*this)(i) * _arg;
  214.         }
  215.         return *result;
  216.     }
  217.  
  218.     Vector<T>& operator+(T _arg)
  219.     {
  220.         if (_arg == 0)
  221.         {
  222.             return *this;
  223.         }
  224.  
  225.         Vector<T>* result = new Vector<T>(size_);
  226.         for (int i = 0; i < size_; i++)
  227.         {
  228.             (*result)(i) = (*this)(i) + _arg;
  229.         }
  230.         return *result;
  231.     }
  232.  
  233.     Vector<T>& operator-(T _arg)
  234.     {
  235.         if (_arg == 0)
  236.         {
  237.             return *this;
  238.         }
  239.  
  240.         Vector<T>* result = new Vector<T>(size_);
  241.         for (int i = 0; i < size_; i++)
  242.         {
  243.             (*result)(i) = (*this)(i) - _arg;
  244.         }
  245.         return *result;
  246.     }
  247. };
  248.  
  249.  
  250. template<typename T>
  251. std::ostream& operator<< (std::ostream& _stream, Matrix<T>& _matrix)
  252. {
  253.     for (int i = 0; i < _matrix.getRows(); i++)
  254.     {
  255.         for (int j = 0; j < _matrix.getColumns(); j++)
  256.         {
  257.             _stream << _matrix(i, j) << ' ';
  258.         }
  259.         _stream << std::endl;
  260.     }
  261.     return _stream;
  262. }
  263.  
  264. template<typename T>
  265. std::ostream& operator<< (std::ostream& _stream, Vector<T>& _vector)
  266. {
  267.     for (int i = 0; i < _vector.getSize(); i++)
  268.     {
  269.         _stream << _vector(i) << ' ';
  270.     }
  271.     _stream << std::endl;
  272.     return _stream;
  273. }
  274.  
  275. template<typename T>
  276. std::istream& operator>> (std::istream& _stream, Matrix<T>& _matrix)
  277. {
  278.     for (int i = 0; i < _matrix.getRows(); i++)
  279.     {
  280.         for (int j = 0; j < _matrix.getColumns(); j++)
  281.         {
  282.             _stream >> _matrix(i, j);
  283.         }
  284.     }
  285.     return _stream;
  286. }
  287.  
  288. template<typename T>
  289. std::istream& operator>> (std::istream& _stream, Vector<T>& _vector)
  290. {
  291.     for (int i = 0; i < _vector.getSize(); i++)
  292.     {
  293.         _stream >> _vector(i);
  294.     }
  295.     return _stream;
  296. }
  297.  
  298. int main()
  299. {
  300.     Matrix<double> matr(3, 3);
  301.     Vector<double> vect(3);
  302.  
  303.     std::cout << "Fill the matrix(" << matr.getRows() << ", " << matr.getColumns() << "):" << std::endl;
  304.     std::cin >> matr;
  305.  
  306.     std::cout << "Fill the vector(" << vect.getSize() << "):" << std::endl;
  307.     std::cin >> vect;
  308.  
  309.     std::cout << (matr * 2 + 3);
  310.  
  311.     system("pause");
  312.     return 0;
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement