Xom9ik

Lab_5/16 var (IIl semester)

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