Xom9ik

Lab_5/18 var (IIl semester)

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