Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Lab_5.cpp
- #include "stdafx.h"
- #include <iostream>
- #include <iomanip>
- #include <conio.h>
- #include <time.h>
- using namespace std;
- //16. C * (A < B) & A
- //M3=M1 < M2 – элементы строк М1 и М2 сортируются по убыванию, затем выполняется операция M1*M2;
- //M3=M1 *M2 поэлементное умножение матриц;
- //M3=M1 & M2 – М3[i,j] = большему из (M1[i,j] и M2[i,j]).
- class Matrix
- {
- private:
- int *M; // указатель на матрицу
- int n, m; // размер матрицы
- public:
- Matrix() {}; // конструктор по умолчанию
- Matrix(int, int); // конструктор с параметрами
- ~Matrix(); // деструктор
- Matrix(Matrix&); // Конструктор копирования
- int get_X(int i, int j) { return *(M + i*m + j); }
- int get_n() { return n; }
- int get_m() { return m; }
- // Дружественные функции
- // инициализация матрицы случайными числами
- friend void Formation(Matrix&);
- friend void BubbleSort(Matrix&,int,int);
- friend int getMax(Matrix&, Matrix&, int, int);
- // вывод матрицы на экран
- friend void Print(Matrix&);
- friend Matrix const operator *(Matrix&, Matrix&);
- friend Matrix const operator <(Matrix&, Matrix&);
- friend Matrix const operator &(Matrix&, Matrix&);
- friend void normN(Matrix &A, int N);
- friend void normM(Matrix &A, int M);
- //Переопределенные операции
- Matrix& operator =(Matrix const& M2)
- {
- int i, j;
- if (this == &M2)
- return *this;
- else
- {
- n = M2.n;
- m = M2.m;
- M = new int[n*m];
- for (i = 0; i < n; i++)
- {
- for (j = 0; j < m; j++)
- {
- *(M + i*m + j) = *(M2.M + i*M2.m + j);
- }
- }
- return *this;
- }
- }
- };
- Matrix::Matrix(int _n, int _m)
- {// конструктор с параметрами
- n = _n;
- m = _m;
- M = new int[n*m];
- cout << "Конструктор с параметрами класса Matrix отработал" << endl;
- }
- Matrix::~Matrix()
- {// деструктор
- delete[] M;
- cout << "Деструктор класса Matrix" << endl;
- }
- Matrix::Matrix(Matrix &Z)
- {// Конструктор копирования
- n = Z.get_n();
- m = Z.get_m();
- M = new int[n*m];
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- *(M + i*m + j) = Z.get_X(i, j);
- }
- }
- cout << "Конструктор копирования класса Matrix" << endl;
- }
- void Formation(Matrix &Z)
- {// Инициализация матрицы случайными числами
- for (int i = 0; i < Z.n; i++)
- {
- for (int j = 0; j < Z.m; j++)
- {
- *(Z.M + i*Z.m + j) = -10 + rand() % 20;
- }
- }
- }
- void Print(Matrix &Z)
- {// Вывод матрицы на экран
- for (int i = 0; i<Z.n; i++)
- {
- for (int j = 0; j<Z.m; j++)
- cout << setw(5) << *(Z.M + i*Z.m + j);
- cout << endl;
- }
- cout << endl;
- }
- void BubbleSort(Matrix &Z, int _n, int _m)
- {
- for (int i = 0; i < _m; i++)
- for (int j = 0; j < _n - 1; j++)
- for (int k = 0; k < _n - j - 1; k++)
- if (*(Z.M + i*Z.m + k) > *(Z.M + i*Z.m + k+1))
- swap(*(Z.M + i*Z.m + k), *(Z.M + i*Z.m + k + 1));
- }
- Matrix const operator < (Matrix &M1, Matrix &M2)
- {//M3=M1 < M2 – элементы строк М1 и М2
- //сортируются по убыванию, затем выполняется операция M1*M2;
- int i, j, l, t, m1, m2, n1, n2;
- m1 = M1.m;
- n2 = M2.n;
- m2 = M2.m;
- n1 = M1.n;
- BubbleSort(M1, m1, n1);
- BubbleSort(M2, m2, n2);
- cout << "Sort\n";
- Print(M1);
- Print(M2);
- // нормализация размеров матриц
- if (n1 > n2)
- normN(M2, n1);
- else if (n1 < n2)
- normN(M1, n2);
- if (m1 > m2)
- normM(M2, m1);
- else if (m1 < m2)
- normM(M1, m2);
- // Создание матрицы М3
- Matrix M3(M1.n, M1.m);
- M3.n = M1.n;
- M3.m = M1.m;
- M3 = M1*M2;
- return M3;
- }
- Matrix const operator *(Matrix &M1, Matrix &M2)
- {// Операция * - сумма произведений элементов i-го
- // столбца М1 и j-ой строки М2
- int i, j, l, t, m1, m2, n1, n2;
- m1 = M1.m;
- m2 = M2.m;
- n1 = M1.n;
- n2 = M2.n;
- if (n1 > n2)
- normN(M2, n1);
- else if (n1 < n2)
- normN(M1, n2);
- if (m1 > m2)
- normM(M2, m1);
- else if (m1 < m2)
- normM(M1, m2);
- Matrix M3(M1.n, M1.m);
- M3.n = M1.n;
- M3.m = M1.m;
- t = M1.n;
- if (M1.n > M1.m) t = M1.m;
- for (i = 0; i < M3.n; i++)
- for (j = 0; j < M3.m; j++)
- *(M3.M + i*M3.m + j) = 0;
- for (i = 0; i < M3.n; i++)
- for (j = 0; j < M3.m; j++)
- for (l = 0; l<t; l++)
- *(M3.M + i*M3.m + j) += (*(M1.M + i*M1.m + l) * *(M2.M + l*M2.m + j));
- return M3;
- }
- int getMax(Matrix &M1, Matrix &M2, int i, int j)
- {
- if (*(M1.M + i*M1.m + j) > *(M2.M + i*M2.m + j))
- return *(M1.M + i*M1.m + j);
- else
- return *(M2.M + i*M2.m + j);
- }
- Matrix const operator &(Matrix &M1, Matrix &M2)
- {
- int i, j, t, m1, m2, n1, n2;
- m1 = M1.m;
- m2 = M2.m;
- n1 = M1.n;
- n2 = M2.n;
- if (n1 > n2)
- normN(M2, n1);
- else if (n1 < n2)
- normN(M1, n2);
- if (m1 > m2)
- normM(M2, m1);
- else if (m1 < m2)
- normM(M1, m2);
- Matrix M3(M1.n, M1.m);
- t = M1.n;
- if (M1.n > M1.m) t = M1.m;
- for (i = 0; i < M3.n; i++)
- for (j = 0; j < M3.m; j++)
- *(M3.M + i*M3.m + j) = getMax(M1, M2, i, j);
- return M3;
- }
- void normN(Matrix &A, int N)
- {// доопределение матрицы по N до максимального размера нулями
- int i, j;
- Matrix Tmp(A);
- A.n = N;
- A.M = new int[A.n*A.m];
- for (i = 0; i < A.n; i++)
- if (i >= Tmp.n)
- for (j = 0; j < A.m; j++)
- *(A.M + i*A.m + j) = 0;
- else
- for (j = 0; j < A.m; j++)
- *(A.M + i*A.m + j) = *(Tmp.M + i*Tmp.m + j);
- }
- void normM(Matrix &A, int M)
- {// доопределение матрицы по M до максимального размера нулями
- int i, j;
- Matrix Tmp(A);
- A.m = M;
- A.M = new int[A.n*A.m];
- for (j = 0; j < A.m; j++)
- if (j >= Tmp.m)
- for (i = 0; i < A.n; i++)
- *(A.M + i*A.m + j) = 0;
- else
- for (i = 0; i < A.n; i++)
- *(A.M + i*A.m + j) = *(Tmp.M + i*Tmp.m + j);
- };
- int main()
- {
- setlocale(LC_ALL, "Rus");
- srand(time(NULL));
- int n, m;
- cout << "Введите размерность матрицы A:\n";
- cout << "Введите количество строк: ";
- cin >> n;
- cout << "Введите количество столбцов: ";
- cin >> m;
- Matrix A(n, m);
- Formation(A); //Заполнение матрицы
- Print(A);
- cout << "Введите размерность матрицы B:\n";
- cout << "Введите количество строк: ";
- cin >> n;
- cout << "Введите количество столбцов: ";
- cin >> m;
- Matrix B(n, m);
- Formation(B); //Заполнение матрицы
- Print(B);
- cout << "Введите размерность матрицы C:\n";
- cout << "Введите количество строк: ";
- cin >> n;
- cout << "Введите количество столбцов: ";
- cin >> m;
- cout << endl;
- Matrix C(n, m);
- Formation(C); //Заполнение матрицы
- Print(C);
- Matrix D, F, G;
- //M3=M1&M2
- D = A & C;
- cout << "D=A & C" << endl;
- Print(D);
- //M3=M1 *M2
- F = B*C;
- cout << "F=B * C" << endl;
- Print(F);
- //M3 = M1 < M2
- G = A<B;
- cout << "G=A < B" << endl;
- Print(G);
- cout << endl;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment