Xom9ik

Lab_5/8 var (IIl semester)

Nov 19th, 2017
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.24 KB | None | 0 0
  1. //Lab_5_var8.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.     //Переопределенные операции
  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) = 0 + rand() % 20;
  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. Matrix operator << (Matrix &M1, Matrix &M2)
  88. {   /*V = М1 << М2 – из М1 и М2 выбрать строку с наименьшей суммой элементов*/
  89.     float buf;
  90.     // приведение матриц к квадратному виду
  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.     {
  100.         int sumM1 = 0;
  101.         int sumM2 = 0;
  102.         for (int j = 0; j < M1.m; j++)
  103.         {
  104.             sumM1 += *(M1.M + i*M1.m + j);
  105.             sumM2 += *(M2.M + i*M2.m + j);
  106.         }
  107.         if (sumM1 > sumM2)
  108.         {
  109.             for (int j = 0; j < M1.m; j++)
  110.             {
  111.                 *(Tmp.M + i*Tmp.m + j) = *(M2.M + i*M2.m + j);
  112.             }
  113.         }
  114.         else
  115.         {
  116.             for (int j = 0; j < M1.m; j++)
  117.             {
  118.                 *(Tmp.M + i*Tmp.m + j) = *(M1.M + i*M1.m + j);
  119.             }
  120.         }
  121.     }
  122.     return Tmp;
  123. }
  124. Matrix operator /(Matrix &M1, Matrix &M2)
  125. {
  126.     //V = М1 / М2 – из минимальных элементов столбцов М1 и М2 составить последовательность V;
  127.     Matrix Tmp(1, M1.m);
  128.     Tmp.n = 1;
  129.     Tmp.m = M1.m;
  130.     int *minM1 = new int[M1.n];
  131.     for (int j = 0; j < M1.n; j++)
  132.         minM1[j] = *(M1.M + 0 * M1.m + j);
  133.     int *minM2 = new int[M2.n];
  134.     for (int j = 0; j < M2.n; j++)
  135.         minM2[j] = *(M2.M + 0 * M2.m + j);
  136.     for (int j = 0; j < M1.m; j++)
  137.         for (int i = 0; i < M1.n; i++)
  138.             if (minM1[j] > *(M1.M + i * M1.m + j))
  139.                 minM1[j] = *(M1.M + i * M1.m + j);
  140.     for (int j = 0; j < M2.m; j++)
  141.         for (int i = 0; i < M2.n; i++)
  142.             if (minM2[j] > *(M2.M + i * M2.m + j))
  143.                 minM2[j] = *(M2.M + i * M2.m + j);
  144.    
  145.     for (int j = 0; j < M2.n; j++)
  146.         if (minM1[j] > minM2[j])
  147.             *(Tmp.M + 0*Tmp.m + j) = minM2[j];
  148.         else
  149.             *(Tmp.M + 0 * Tmp.m + j) = minM1[j];
  150.     return Tmp;
  151. }
  152. Matrix operator -(Matrix &M1, Matrix &V)
  153. {
  154.     //М2=М1-V – из М1 удалить строки, сумма элементов которых больше суммы элементов V.
  155.     Matrix Tmp(M1.n, M1.m);
  156.     Tmp.n = M1.n;
  157.     Tmp.m = M1.m;
  158.     for (int i = 0; i < M1.n; i++)
  159.         for (int j = 0; j < M1.m; j++)
  160.             *(Tmp.M + i*Tmp.m + j) = 0;
  161.     int sum = 0;
  162.     for (int i = 0; i < V.m; i++)
  163.         sum += *(V.M + 0 * V.m + i);
  164.     cout << "Sum V =" << sum << endl;
  165.     for (int i = 0; i < M1.n; i++)
  166.     {
  167.         int sumM1Row = 0;
  168.         for (int j = 0; j < M1.m; j++)
  169.             sumM1Row += *(M1.M + i*M1.m + j);
  170.     }
  171.     int countRow = 0;
  172.     for (int i = 0; i < M1.n; i++)
  173.     {
  174.         int sumM1Row = 0;
  175.         for (int j = 0; j < M1.m; j++)
  176.             sumM1Row += *(M1.M + i*M1.m + j);
  177.         cout << "Sum M1["<<i<<"]" << sumM1Row << endl;
  178.         if (sumM1Row < sum)
  179.         {
  180.             for (int j = 0; j < M1.m; j++)
  181.                 *(Tmp.M + countRow*Tmp.m + j) = *(M1.M + i*M1.m + j);
  182.             countRow++;
  183.         }
  184.         else
  185.             cout << "Row ["<<i<<"] delete" << endl;
  186.     }
  187.     return Tmp;
  188. }
  189. void normN(Matrix &A, int N)
  190. {// доопределение матрицы по N до максимального размера нулями
  191.     int i, j;
  192.     Matrix Tmp(A);
  193.     A.n = N;
  194.     A.M = new int[A.n*A.m];
  195.     for (i = 0; i < A.n; i++)
  196.     {
  197.         if (i >= Tmp.n)
  198.         {
  199.             for (j = 0; j < A.m; j++)
  200.                 *(A.M + i*A.m + j) = 0;
  201.         }
  202.         else {
  203.             for (j = 0; j < A.m; j++)
  204.                 *(A.M + i*A.m + j) = *(Tmp.M + i*Tmp.m + j);
  205.         }
  206.     }
  207. }
  208. void normM(Matrix &A, int M)
  209. {// доопределение матрицы по M до максимального размера нулями
  210.     int i, j;
  211.     Matrix Tmp(A);
  212.     A.m = M;
  213.     A.M = new int[A.n*A.m];
  214.     for (j = 0; j < A.m; j++)
  215.     {
  216.         if (j >= Tmp.m)
  217.         {
  218.             for (i = 0; i < A.n; i++)
  219.                 *(A.M + i*A.m + j) = 0;
  220.         }
  221.         else {
  222.             for (i = 0; i < A.n; i++)
  223.                 *(A.M + i*A.m + j) = *(Tmp.M + i*Tmp.m + j);
  224.         }
  225.     }
  226. };
  227. int main()
  228. {
  229.     setlocale(LC_ALL, "Rus");
  230.     srand(time(NULL));
  231.     int n, m;
  232.     cout << "Введите размерность матрицы A:\n";
  233.     cout << "Введите количество строк: ";
  234.     cin >> n;
  235.     cout << "Введите количество столбцов: ";
  236.     cin >> m;
  237.     cout << "\n";
  238.     Matrix A(n, m);
  239.     Formation(A);
  240.     Print(A);
  241.     cout << "Введите размерность матрицы B:\n";
  242.     cout << "Введите количество строк: ";
  243.     cin >> n;
  244.     cout << "Введите количество столбцов: ";
  245.     cin >> m;
  246.     cout << "\n";
  247.     Matrix B(n, m);
  248.     Formation(B);
  249.     Print(B);
  250.     cout << "Введите размерность матрицы C:\n";
  251.     cout << "Введите количество строк: ";
  252.     cin >> n;
  253.     cout << "Введите количество столбцов: ";
  254.     cin >> m;
  255.     cout << "\n";
  256.     Matrix C(n, m);
  257.     Formation(C);
  258.     Print(C);
  259.  
  260.     Matrix D, F, G, I;
  261.     D = A<<B;
  262.     Print(D);
  263.     F = A / B;
  264.     Print(F);
  265.     G = A - F;
  266.     Print(G);
  267.     cout << "I = (C - (A << B)) - (B / A)" << endl;
  268.     I = (C - (A << B)) - (B / A);
  269.     Print(I);
  270.     system("pause");
  271. }
Advertisement
Add Comment
Please, Sign In to add comment