Advertisement
igoryanchik

maxrix

Apr 11th, 2023 (edited)
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.36 KB | None | 0 0
  1. #include <iostream>
  2. #include <random>
  3. #include <fstream>
  4. #include <typeinfo>
  5. using namespace std;
  6.  
  7. class Exception : public std::exception
  8. {
  9. protected:
  10.     char* str;
  11. public:
  12.  
  13.     Exception(const char* s)
  14.     {
  15.         str = new char[strlen(s) + 1];
  16.         if (str != 0)
  17.         {
  18.             strcpy_s(str, strlen(s) + 1, s);
  19.         }
  20.     }
  21.  
  22.     Exception(const Exception& V)
  23.     {
  24.         str = new char[strlen(V.str) + 1];
  25.         if (str != 0)
  26.         {
  27.             strcpy_s(str, strlen(V.str) + 1, V.str);
  28.         }
  29.     }
  30.  
  31.     ~Exception()
  32.     {
  33.         if (str != nullptr)
  34.             delete[] str;
  35.     }
  36.  
  37.     virtual void print() = 0;
  38. };
  39.  
  40. class IndexOutOfBounds : public Exception
  41. {
  42. private:
  43.     int lines;
  44.     int columns;
  45.     int index;
  46.     int index2;
  47. public:
  48.  
  49.     IndexOutOfBounds(int Lines, int Columns, int Index, int Index2) : Exception("Index is out of bounds")
  50.     {
  51.         lines = Lines;
  52.         columns = Columns;
  53.         index = Index;
  54.         index2 = Index2;
  55.     }
  56.  
  57.     int getIndex() { return index; }
  58.     int getIndex2() { return index2; }
  59.     int getLines() { return lines; }
  60.     int getColumns() { return columns; }
  61.  
  62.     void print()
  63.     {
  64.         cout << "Exception:" << str << " \nNumber of rows of the matrix:" << lines << " ,number of matrix columns:" << columns
  65.             << "\nrequested indexes:" << "[" << index << ']' << "[" << index2 << "]\n";
  66.     }
  67.     ~IndexOutOfBounds() {};
  68. };
  69.  
  70. //неправльные размеры матриц
  71. class WrongDimensionsException : public Exception
  72. {
  73. private:
  74.     int lines;
  75.     int columns;
  76.     int lines2;
  77.     int columns2;
  78. public:
  79.  
  80.     WrongDimensionsException(int Lines, int Columns, int Lines2, int Columns2) : Exception("Wrong Dimensions of Matrix")
  81.     {
  82.         lines = Lines;
  83.         columns = Columns;
  84.         lines2 = Lines2;
  85.         columns2 = Columns2;
  86.     }
  87.  
  88.     WrongDimensionsException(const char* s) : Exception(s) { }
  89.  
  90.     int getLines() { return lines; }
  91.     int getLines2() { return lines2; }
  92.     int getColumns() { return columns; }
  93.     int getColumns2() { return columns2; }
  94.  
  95.     ~WrongDimensionsException() {};
  96.  
  97.     virtual void print()
  98.     {
  99.         cout << "Exception:" << str << '\n' << "Size1:" << lines << "x" << columns << '\n' << "Size2:" << lines2 << "x" << columns2 << '\n';
  100.     }
  101. };
  102.  
  103. class MemoryErrorI : public Exception
  104. {
  105. public:
  106.     MemoryErrorI() : Exception("memory allocation error") { }
  107.  
  108.     void print()
  109.     {
  110.         cout << "Exception:" << str << '\n';
  111.     }
  112. };
  113.  
  114. class WrongSizeException : public WrongDimensionsException
  115. {
  116. private:
  117.     int lines;
  118.     int columns;
  119. public:
  120.  
  121.     WrongSizeException(int Lines, int Columns) : WrongDimensionsException("Non-positive size of matrix")
  122.     {
  123.         lines = Lines;
  124.         columns = Columns;
  125.     }
  126.     int getLines() { return lines; }
  127.     int getColumns() { return columns; }
  128.  
  129.     ~WrongSizeException() {};
  130.  
  131.     void print()
  132.     {
  133.         cout << "Exception:" << str << "\nYou are trying to create a size matrix:" << lines << "x" << columns << '\n';
  134.     }
  135. };
  136.  
  137. template<class T>
  138. class BaseMatrix
  139. {
  140. protected:
  141.     T** arr;
  142.     int lines;
  143.     int columns;
  144. public:
  145.  
  146.     //конструктор
  147.     BaseMatrix(int Lines = 1, int Columns = 1)
  148.     {
  149.         if (Lines <= 0 || Columns <= 0) throw WrongSizeException(Lines, Columns);
  150.         lines = Lines;
  151.         columns = Columns;
  152.         arr = new T*[columns];
  153.         for (int i = 0; i < columns; ++i)
  154.         {
  155.             arr[i] = new T[lines];
  156.         }
  157.     }
  158.  
  159.     //конструктор копий
  160.     BaseMatrix(BaseMatrix <T> & V)
  161.     {
  162.         if (V.arr == nullptr) return;
  163.  
  164.         lines = V.lines;
  165.         columns = V.columns;
  166.         arr = new T*[V.columns];
  167.         if (arr == 0) throw MemoryErrorI();
  168.         for (int i = 0; i < columns; ++i)
  169.         {
  170.             arr[i] = new T[lines];
  171.             if (arr[i] == 0) throw MemoryErrorI();
  172.             for (int j = 0; j < lines; ++j)
  173.             {
  174.                 arr[i][j] = V.arr[i][j];
  175.             }
  176.         }
  177.     }
  178.  
  179.     //конструктор принимающий объект типа ifstream
  180.     BaseMatrix(ifstream& in)
  181.     {
  182.         in >> columns;
  183.         in >> lines;
  184.  
  185.         arr = new T*[columns];
  186.         if (arr == 0) throw MemoryErrorI();
  187.         for (int i = 0; i < columns; ++i)
  188.         {
  189.             arr[i] = new T[lines];
  190.             for (int j = 0; j < lines; ++j)
  191.             {
  192.                 in >> arr[i][j];
  193.             }
  194.         }
  195.     }
  196.  
  197.     //метод чтения файла
  198.     BaseMatrix readm(ifstream& in)
  199.     {
  200.         in >> columns;
  201.         in >> lines;
  202.  
  203.         arr = new T*[columns];
  204.         if (arr == 0) throw MemoryErrorI();
  205.         for (int i = 0; i < columns; ++i)
  206.         {
  207.             arr[i] = new T[lines];
  208.             if (arr[i] == 0) throw MemoryErrorI();
  209.             for (int j = 0; j < lines; ++j)
  210.             {
  211.                 in >> arr[i][j];
  212.             }
  213.         }
  214.         return *this;
  215.     }
  216.  
  217.  
  218.     //оператор =
  219.     BaseMatrix <T> operator=(BaseMatrix <T> & V)
  220.     {
  221.         if (this == &V) return *this;
  222.  
  223.         if (V.arr != nullptr)
  224.         {
  225.             lines = V.lines;
  226.             columns = V.columns;
  227.             arr = new T*[V.columns];
  228.             if (arr == 0) throw MemoryErrorI();
  229.             for (int i = 0; i < columns; ++i)
  230.             {
  231.                 arr[i] = new T[lines];
  232.                 if (arr[i] == 0) throw MemoryErrorI();
  233.                 for (int j = 0; j < lines; ++j)
  234.                 {
  235.                     arr[i][j] = V.arr[i][j];
  236.                 }
  237.             }
  238.  
  239.             return *this;
  240.         }
  241.     }
  242.  
  243.     //оператор обращения к элементам матрицы
  244.     T& operator()(int index1, int index2)
  245.     {
  246.         if (index1 < 0 || index2 < 0 || index1 >= columns || index2 >= lines)
  247.             throw IndexOutOfBounds(lines, columns, index1, index2);
  248.         return arr[index1][index2];
  249.     }
  250.  
  251.     //функция возвращающая вектор, каждая компонента которого содержит сумму элементов из соответствующей строки матрицы.
  252.     BaseMatrix<T> sum_lines()
  253.     {
  254.         if (arr != nullptr)
  255.         {
  256.             BaseMatrix <T> Rez;
  257.  
  258.             Rez.lines = 1;
  259.             Rez.columns = columns;
  260.             Rez.arr = new T*[columns];
  261.             if (Rez.arr == 0) throw MemoryErrorI();
  262.             for (int i = 0; i < columns; ++i)
  263.             {
  264.                 Rez.arr[i] = new T[lines];
  265.                 if (Rez.arr == 0) throw MemoryErrorI();
  266.  
  267.                 int sum = 0;
  268.                 for (int j = 0; j < lines; ++j)
  269.                 {
  270.                     sum += arr[i][j];
  271.                 }
  272.                 Rez.arr[i][0] = sum;
  273.             }
  274.             return Rez;
  275.         }
  276.     }
  277.  
  278.     //создание матрицы m на n (m и n - случайные числа от 2 до 21) и заполнение матрицы случайными числами
  279.     void random_matrix()
  280.     {
  281.         columns = (rand() % 20) + 1;
  282.         lines = (rand() % 20) + 1;
  283.         arr = new T*[columns];
  284.         if (arr == 0) throw MemoryErrorI();
  285.         for (int i = 0; i < columns; ++i)
  286.         {
  287.             arr[i] = new T[lines];
  288.             if (arr[i] == 0) throw MemoryErrorI();
  289.             for (int j = 0; j < lines; ++j)
  290.             {
  291.                 T x = rand();
  292.                 arr[i][j] = (x % 201);
  293.             }
  294.         }
  295.     }
  296.  
  297.     //заполнение матрицы с заданными размерами случайными числами
  298.     void fill_matrix()
  299.     {
  300.         arr = new T*[columns];
  301.         if (arr == 0) throw MemoryErrorI();
  302.  
  303.         for (int i = 0; i < columns; ++i)
  304.         {
  305.             arr[i] = new T[lines];
  306.             if (arr[i] == 0) throw MemoryErrorI();
  307.  
  308.             for (int j = 0; j < lines; ++j)
  309.             {
  310.                 T x = rand();
  311.                 arr[i][j] = (x % 201);
  312.             }
  313.         }
  314.     }
  315.  
  316.     void print()
  317.     {
  318.         for (int i = 0; i < columns; ++i)
  319.         {
  320.             for (int j = 0; j < lines; ++j)
  321.             {
  322.                 cout << arr[i][j] << " ";
  323.             }
  324.             cout << '\n';
  325.         }
  326.     }
  327.  
  328.     ~BaseMatrix()
  329.     {
  330.         if (arr != nullptr)
  331.         {
  332.             for (int i = 0; i < columns; ++i)
  333.                 delete[] arr[i];
  334.             delete[] arr;
  335.         }
  336.     }
  337.     template<class T>
  338.     friend ostream& operator <<(ostream& ustream, BaseMatrix <T> V);
  339.  
  340.     template<class T>
  341.     friend istream& operator >>(istream& ustream, BaseMatrix <T> &V);
  342. };
  343. template<class T>
  344. ostream& operator <<(ostream& ustream, BaseMatrix <T> V)
  345. {
  346.     if (typeid(ustream).name() == typeid(ofstream).name())
  347.     {
  348.         ustream << V.columns << " " << V.lines << '\n';
  349.         for (int i = 0; i < V.columns; ++i)
  350.         {
  351.             for (int j = 0; j < V.lines; ++j)
  352.             {
  353.                 ustream << V.arr[i][j] << " ";
  354.             }
  355.             ustream << '\n';
  356.         }
  357.         return ustream;
  358.     }
  359.     else
  360.     {
  361.         for (int i = 0; i < V.columns; ++i)
  362.         {
  363.             for (int j = 0; j < V.lines; ++j)
  364.             {
  365.                 ustream << V.arr[i][j] << " ";
  366.             }
  367.             ustream << '\n';
  368.         }
  369.         return ustream;
  370.     }
  371. }
  372. template<class T>
  373. istream& operator >>(istream& ustream, BaseMatrix <T> &V)
  374. {
  375.     if (typeid(ustream).name() == typeid(ifstream).name())
  376.     {
  377.         ustream >> V.columns >> V.lines;
  378.     }
  379.  
  380.     for (int i = 0; i < V.columns; ++i)
  381.     {
  382.         for (int j = 0; j < V.lines; ++j)
  383.         {
  384.             ustream >> V.arr[i][j];
  385.         }
  386.     }
  387.     return ustream;
  388. }
  389.  
  390. int main()
  391. {
  392.     BaseMatrix <int> A(5, 5);
  393.  
  394.     A.fill_matrix();
  395.     A.print();
  396.  
  397.     cout << '\n';
  398.  
  399.     A.sum_lines().print();
  400.  
  401.     cout << '\n';
  402.  
  403.     try
  404.     {
  405.         BaseMatrix <int> B;
  406.         B.fill_matrix();
  407.  
  408.         cout << B(-1, -1);
  409.     }
  410.     catch (IndexOutOfBounds n)
  411.     {
  412.         cout << "an error of going out of bounds was found:\n";
  413.         n.print();
  414.     }
  415.     catch (WrongSizeException k)
  416.     {
  417.         cout << "Wrong Size Exception\n";
  418.         k.print();
  419.     }
  420.     catch (...)
  421.     {
  422.         cout << "\nSomething has happened";
  423.     }
  424.  
  425.     try
  426.     {
  427.         BaseMatrix <int> C(-100, 1);
  428.         C.fill_matrix();
  429.         C.print();
  430.  
  431.     }
  432.     catch (IndexOutOfBounds n)
  433.     {
  434.         cout << "\nAn error of going out of bounds was found:\n";
  435.         n.print();
  436.     }
  437.     catch (WrongSizeException k)
  438.     {
  439.         cout << "\nWrong Size Exception\n";
  440.         k.print();
  441.     }
  442.     catch (...)
  443.     {
  444.         cout << "\nSomething has happened\n";
  445.     }
  446.  
  447.     ofstream fout;
  448.     fout.open("in.txt");
  449.     if (fout.is_open())
  450.     {
  451.         fout << A;
  452.         fout.close();
  453.     }
  454.  
  455.     ifstream fin;
  456.     fin.open("a.txt");
  457.     if (fin.is_open())
  458.     {
  459.         try
  460.         {
  461.             BaseMatrix <int> K = fin;
  462.             K.print();
  463.         }
  464.         catch (...)
  465.         {
  466.             cout << "\nSomething has happened\n";
  467.         }
  468.     }
  469.  
  470.     cout << '\n';
  471.  
  472.     ifstream in;
  473.     in.open("in.txt");
  474.     if (in.is_open())
  475.     {
  476.         try
  477.         {
  478.             BaseMatrix <int> U = in;
  479.             U.print();
  480.         }
  481.         catch (...)
  482.         {
  483.             cout << "\nSomething has happened\n";
  484.         }
  485.     }
  486.     return 0;
  487. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement