avr39ripe

cppMatrixLinearClass

Jun 4th, 2021
896
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. class Matrix
  4. {
  5.     int sizeY;
  6.     int sizeX;
  7.     int* data;
  8.     int index2D(int y, int x)const { return y * sizeX + x; }
  9.     int index2D(int y, int x, int sizeXP)const { return y * sizeXP + x; }
  10. public:
  11.     Matrix(int sizeYP, int sizeXP) : sizeY{ sizeYP }, sizeX{ sizeXP }, data{ new int[sizeYP * sizeXP] }{}
  12.  
  13.     int operator()(int y, int x)const { return *(data + index2D(y, x)); }
  14.     int& operator()(int y, int x) { return *(data + index2D(y, x)); }
  15.  
  16.     void deleteColumn(int columnPos)
  17.     {
  18.         --sizeX;
  19.         int* newData{ new int[sizeY * sizeX] };
  20.  
  21.         for (int y{ 0 }; y < sizeY; ++y)
  22.         {
  23.             for (int x{ 0 }; x < sizeX; ++x)
  24.             {
  25.                 *(newData + index2D(y, x)) = *(data + index2D(y, x + (x >= columnPos)));
  26.             }
  27.         }
  28.         delete[] data;
  29.         data = newData;
  30.     }
  31.  
  32.     void addColumn(int columnPos, int* newCol = nullptr)
  33.     {
  34.         int* newData{ new int[sizeY * (sizeX + 1)] };
  35.  
  36.         for (int y{ 0 }; y < sizeY; ++y)
  37.         {
  38.             for (int x{ 0 }; x < sizeX; ++x)
  39.             {
  40.                 *(newData + index2D(y, x + (x >= columnPos), sizeX + 1)) = *(data + index2D(y, x));
  41.             }
  42.             *(newData + index2D(y, columnPos , sizeX + 1)) = newCol ? *(newCol + y) : 0;
  43.         }
  44.         delete[] data;
  45.         data = newData;
  46.         ++sizeX;
  47.     }
  48.  
  49.     void deleteRow(int rowPos)
  50.     {
  51.         --sizeY;
  52.         int* newData{ new int[sizeY * sizeX] };
  53.  
  54.         for (int y{ 0 }; y < sizeY; ++y)
  55.         {
  56.             for (int x{ 0 }; x < sizeX; ++x)
  57.             {
  58.                 *(newData + index2D(y, x)) = *(data + index2D(y + (y >= rowPos), x));
  59.             }
  60.         }
  61.         delete[] data;
  62.         data = newData;
  63.     }
  64.  
  65.     void addRow(int rowPos, int* newRow = nullptr)
  66.     {
  67.         int* newData{ new int[(sizeY + 1) * sizeX] };
  68.        
  69.         for (int y{ 0 }; y < sizeY; ++y)
  70.         {
  71.             for (int x{ 0 }; x < sizeX; ++x)
  72.             {
  73.                 *(newData + index2D(y + (y >= rowPos), x)) = *(data + index2D(y, x));
  74.             }
  75.         }
  76.  
  77.         for (int x{ 0 }; x < sizeX; ++x)
  78.         {
  79.             *(newData + index2D(rowPos,x)) = newRow ? *(newRow + x) : 0;
  80.         }
  81.         delete[] data;
  82.         data = newData;
  83.         ++sizeY;
  84.     }
  85.  
  86.     void print()const
  87.     {
  88.         for (int y{ 0 }; y < sizeY; ++y)
  89.         {
  90.             for (int x{ 0 }; x < sizeX; ++x)
  91.             {
  92.                 std::cout << (*this)(y, x) << '\t';
  93.             }
  94.             std::cout << '\n';
  95.         }
  96.         std::cout << '\n';
  97.     }
  98.  
  99.     ~Matrix() { delete[] data; }
  100. };
  101.  
  102. int main()
  103. {
  104. /*  Установите значение USER_INPUT в 1 чтоб разрешить
  105.     пользовательский ввод размеров матрицы   */
  106. #define USER_INPUT 0;
  107.     int rows{3};
  108.     int columns{3};
  109.     int counter{ 1 };
  110.  
  111. #if USER_INPUT == 1
  112.     std::cout << "Enter matrix rows count\n";
  113.     std::cin >> rows;
  114.     std::cout << "Enter matrix columns count\n";
  115.     std::cin >> rows;
  116. #endif
  117.  
  118.     Matrix matrix{ rows, columns };
  119.  
  120.     for (int y{ 0 }; y < rows; ++y)
  121.     {
  122.         for (int x{ 0 }; x < columns; ++x)
  123.         {
  124.             matrix(y, x) = counter++;
  125.         }
  126.         std::cout << '\n';
  127.     }
  128.  
  129.     matrix.print();
  130.  
  131.     matrix.deleteColumn(2);
  132.     matrix.print();
  133.  
  134.     int* newColumn{ new int[columns] {11,22,33} };
  135.     matrix.addColumn(0, newColumn);
  136.     matrix.print();
  137.  
  138.     matrix.deleteRow(2);
  139.     matrix.print();
  140.  
  141.     int* newRow{ new int[rows] {111,222,333} };
  142.     matrix.addRow(2, newRow);
  143.     matrix.print();
  144.  
  145.     delete[] newRow;
  146.     delete[] newColumn;
  147.  
  148.     return 0;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment