Advertisement
Xom9ik

Lab_5/4var (IIl semester)

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