Advertisement
Xom9ik

Lab_5/3 var (IIl semester)

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