Xom9ik

Lab_5/6 var (IIl semester)

Nov 19th, 2017
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.70 KB | None | 0 0
  1. //Lab_5.cpp
  2. #include "stdafx.h"
  3. #include <iostream>
  4. #include <iomanip>
  5. #include <ctime>
  6.  
  7. using namespace std;
  8. class Matrix
  9. {
  10. private:
  11.     int *M; // указатель на матрицу
  12.     int n, m; // размер матрицы
  13. public:
  14.     Matrix() {}; // конструктор по умолчанию
  15.     Matrix(int, int); //  конструктор с параметрами
  16.     ~Matrix(); // деструктор
  17.     Matrix(Matrix&); // Конструктор копирования
  18.     int get_X(int i, int j) { return *(M + i*m + j); }
  19.     int get_n() { return n; }
  20.     int get_m() { return m; }
  21.     // Дружественные  функции
  22.     // инициализация матрицы случайными числами
  23.     friend void Formation(Matrix&);
  24.     // вывод матрицы на экран
  25.     friend void Print(Matrix&);
  26.     friend int operator ~ (Matrix&);
  27.     friend Matrix operator -(Matrix&, Matrix&);
  28.     friend Matrix operator >> (Matrix&, int k);
  29.     friend void normN(Matrix &A, int N);
  30.     friend void normM(Matrix &A, int M);
  31.     //Переопределенные операции
  32.     Matrix& operator =(Matrix const& M2)
  33.     {
  34.         int i, j;
  35.         if (this == &M2)
  36.             return *this;
  37.         else
  38.         {
  39.             n = M2.n;
  40.             m = M2.m;
  41.             M = new int[n*m];
  42.             for (i = 0; i < n; i++) {
  43.                 for (j = 0; j < m; j++)
  44.                     *(M + i*m + j) = *(M2.M + i*M2.m + j);
  45.             }
  46.             return *this;
  47.         }
  48.     };
  49. };
  50.  
  51. Matrix::Matrix(int _n, int _m)
  52. {
  53.     // конструктор с параметрами
  54.     n = _n;
  55.     m = _m;
  56.     M = new int[n*m];
  57.     cout << "Конструктор с параметрами класса Matrix отработал" << "\n\n";
  58. }
  59. Matrix::~Matrix()
  60. {
  61.     // деструктор
  62.     delete[] M;
  63.     cout << "Деструктор класса Matrix" << endl;
  64. }
  65.  
  66. Matrix::Matrix(Matrix &Z)
  67. {
  68.     // Конструктор копирования
  69.     n = Z.get_n();
  70.     m = Z.get_m();
  71.     M = new int[n*m];
  72.     for (int i = 0; i<n; i++)
  73.         for (int j = 0; j<m; j++)
  74.             *(M + i*m + j) = Z.get_X(i, j);
  75.     cout << "Конструктор копирования класса Matrix\n" << endl;
  76. }
  77.  
  78. void Formation(Matrix &Z)
  79. {
  80.     // Инициализация матрицы случайными числами
  81.     for (int i = 0; i<Z.n; i++)
  82.         for (int j = 0; j<Z.m; j++)
  83.             *(Z.M + i*Z.m + j) = 1 + rand() % 100;
  84. }
  85.  
  86. void Print(Matrix &Z)
  87. {
  88.     // Вывод матрицы на экран
  89.     for (int i = 0; i<Z.n; i++)
  90.     {
  91.         for (int j = 0; j<Z.m; j++)
  92.             cout << setw(4) << *(Z.M + i*Z.m + j);
  93.         cout << endl;
  94.     }
  95.     cout << endl;
  96. }
  97.  
  98. Matrix operator - (Matrix &M1, Matrix &M2)
  99. {
  100.     if (M1.m > M1.n) normN(M1, M1.m);
  101.     if (M1.n > M1.m) normM(M1, M1.n);
  102.     if (M2.m > M2.n) normN(M2, M2.m);
  103.     if (M2.n > M2.m) normM(M2, M2.n);
  104.     Matrix M3(M1.n, M1.m);
  105.     for (int i = 0; i < M1.n; i++)
  106.         for (int j = 0; j < M1.m; j++)
  107.             *(M3.M + i*M3.m + j) = *(M1.M + i*M1.m + j) - *(M2.M + i *M2.m + j);
  108.     return M3;
  109. }
  110.  
  111. int operator ~ (Matrix &M3)
  112. {
  113.     int nstrmin = 0;
  114.     int strsum = 0;
  115.     int min = 0;
  116.     for (int i = 0; i < M3.n; i++)
  117.     {
  118.         for (int j = 0; j < M3.m; j++)
  119.             strsum = strsum + *(M3.M + i*M3.m + i);
  120.         if (min > strsum)
  121.         {
  122.  
  123.             min = strsum;
  124.             nstrmin = i;
  125.         }
  126.     }
  127.  
  128.     Matrix Tmp(1, M3.m);
  129.     for (int j = 0; j < Tmp.m; j++)
  130.         *(Tmp.M + nstrmin *Tmp.m + j) = *(M3.M + nstrmin *M3.m + j);
  131.     return nstrmin;
  132. }
  133.  
  134.  
  135.  
  136. Matrix operator >> (Matrix &M1, int k)
  137. { //М2 = М1 >> К – циклический сдвиг строк матриц М1 и М2 вниз на К позиций;
  138.     Matrix Tmp(M1.n + k, M1.m);
  139.     Tmp.n = M1.n; //i
  140.     Tmp.m = M1.m; //j
  141.     int count = 0;
  142.     cout << "Сдвиг на " << k << endl;
  143.     for (int i = 0; i < Tmp.n; i++)
  144.         for (int j = 0; j < Tmp.m; j++)
  145.             *(Tmp.M + i*Tmp.m + j) = count++;
  146.     for (int i = 0; i < M1.m; i++)
  147.     {
  148.         for (int j = 0; j < M1.n; j++)
  149.         {
  150.             int plusI = i + k;
  151.             *(Tmp.M+ plusI* Tmp.m + j ) = *(M1.M + i* M1.m + j);
  152.         }
  153.         cout << endl;
  154.     }
  155.     return Tmp;
  156. }
  157.  
  158.  
  159. void normN(Matrix &A, int N)
  160. {
  161.     // доопределение матрицы по N до максимального размера нулями
  162.     int i, j;
  163.     Matrix Tmp(A);
  164.     A.n = N;
  165.     A.M = new int[A.n*A.m];
  166.     for (i = 0; i < A.n; i++)
  167.     {
  168.         if (i >= Tmp.n)
  169.         {
  170.             for (j = 0; j < A.m; j++)
  171.                 *(A.M + i*A.m + j) = 0;
  172.         }
  173.         else {
  174.             for (j = 0; j < A.m; j++)
  175.                 *(A.M + i*A.m + j) = *(Tmp.M + i*Tmp.m + j);
  176.         }
  177.     }
  178. }
  179.  
  180. void normM(Matrix &A, int M)
  181. {// доопределение матрицы по M до максимального размера нулями
  182.     int i, j;
  183.     Matrix Tmp(A);
  184.     A.m = M;
  185.     A.M = new int[A.n*A.m];
  186.     for (j = 0; j < A.m; j++)
  187.     {
  188.         if (j >= Tmp.m)
  189.         {
  190.             for (i = 0; i < A.n; i++)
  191.                 *(A.M + i*A.m + j) = 0;
  192.         }
  193.         else {
  194.             for (i = 0; i < A.n; i++)
  195.                 *(A.M + i*A.m + j) = *(Tmp.M + i*Tmp.m + j);
  196.         }
  197.     }
  198. };
  199.  
  200. int main()
  201. {
  202.     setlocale(LC_ALL, "Rus");
  203.     srand(time(NULL));
  204.     int n, m, k = 0;
  205.     cout << "Введите размерность матрицы A:\n";
  206.     cout << "Введите количество строк: ";
  207.     cin >> n;
  208.     cout << "Введите количество столбцов: ";
  209.     cin >> m; cout << "\n";
  210.     Matrix A(n, m);
  211.     Formation(A);
  212.     Print(A);
  213.     cout << "Введите размерность матрицы B:\n";
  214.     cout << "Введите количество строк: ";
  215.     cin >> n;
  216.     cout << "Введите количество столбцов: ";
  217.     cin >> m;
  218.     cout << "\n";
  219.     Matrix B(n, m);
  220.     Formation(B);
  221.     Print(B);
  222.     cout << "Введите размерность матрицы C:\n";
  223.     cout << "Введите количество строк: ";
  224.     cin >> n;
  225.     cout << "Введите количество столбцов: ";
  226.     cin >> m; cout << "\n";
  227.     Matrix C(n, m);
  228.     Formation(C);
  229.     Print(C);
  230.  
  231.     Matrix I;
  232.     I = B >> (~(A-C));
  233.     Print(I);
  234.     system("pause");
  235.     return 0;
  236. }
Advertisement
Add Comment
Please, Sign In to add comment