Xom9ik

Lab_5/17 var (IIl semester)

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