Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <iomanip>
- #include <time.h>
- using namespace std;
- 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 Print(Matrix&);
- friend Matrix operator~ (Matrix&);
- friend Matrix operator! (Matrix&);
- Matrix operator[](Matrix& M2)
- {/*V = M1[M2] – возвращается указатель на строку М1,
- максимальное значение которой > среднего арифметического элементов боковой диагонали М2.
- Если в М1 такой строки нет, то возвращается указатель на первую строку М2,
- в которой значение элемента на боковой диагонали меньше среднего арифметического;*/
- //строка
- Matrix Tmp(1, M2.m);
- Tmp.n = 1;
- Tmp.m = M2.m;
- double sr_ar = 0;
- if (M2.m != M2.n)
- {
- cout << "Кол-во столбцов не равно кол-ву строк. Расчёт Cреднего арифметического элементов побочной диагонали невозможен!" << endl;
- return Tmp;
- }
- else
- {
- for (int j = M2.n - 1, i = 0; i < M2.m, j >= 0; i++, j--)
- {
- sr_ar += *(M2.M + i*M2.m + j);
- }
- sr_ar /= M2.m;
- cout << "Cреднее арифметическое элементов побочной диагонали равно: " << sr_ar << endl;
- }
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- if (*(M + i*m + j) > sr_ar)
- {
- cout << "M1" << *(M + i*m + j) << " > " << sr_ar << endl;
- for (int j = 0; j < m; j++)
- {
- *(Tmp.M + i*Tmp.m + j) = *(M + i*m + j);
- }
- return Tmp;
- }
- }
- }
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- if (*(M2.M + i*m + j) > sr_ar)
- {
- cout << "M2" << *(M2.M + i*M2.m + j) << " < " << sr_ar << endl;
- for (int j = 0; j < m; j++)
- {
- *(Tmp.M + i*Tmp.m + j) = *(M2.M + i*M2.m + j);
- }
- return Tmp;
- }
- }
- }
- }
- friend Matrix operator &(Matrix&, Matrix&);
- friend Matrix 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 отработал" << "\n\n";
- }
- 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\n" << 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) = 0 + rand() % 15;
- }
- 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;
- }
- Matrix operator &(Matrix &M1, Matrix &M2)
- {// М3 = М1 & М2 – побитовая операция & над соответствующими элементами М1 и М2;
- // приведение матриц к квадратному виду
- if (M1.m > M1.n) normN(M1, M1.m);
- if (M1.n > M1.m) normM(M1, M1.n);
- if (M2.m > M2.n) normN(M2, M2.m);
- if (M2.n > M2.m) normM(M2, M2.n);
- Matrix Tmp(M1.n, M1.m);
- Tmp.n = M1.n;
- Tmp.m = M1.m;
- for (int i = 0; i < Tmp.n; i++)
- {
- for (int j = 0; j < Tmp.m; j++)
- {
- *(Tmp.M + i*Tmp.m + j) = (*(M1.M + i*M1.m + j)) & (*(M2.M + i*M2.m + j));
- cout << (*(M1.M + i*M1.m + j)) << " & " << (*(M2.M + i*M2.m + j)) << " = " << *(Tmp.M + i*Tmp.m + j) << endl;
- }
- }
- return Tmp;
- }
- Matrix operator >(Matrix &M1, Matrix &M2)
- {//V2 = M>V1 – V2[i]=V1[i], если V1[i]<M[i,i], иначе V2[i]= M[i,i].
- if (M1.m > M1.n) normN(M1, M1.m);
- if (M1.n > M1.m) normM(M1, M1.n);
- if (M2.m > M2.n) normN(M2, M2.m);
- if (M2.n > M2.m) normM(M2, M2.n);
- Matrix V2(1, M1.m);
- V2.n = 1;
- V2.m = M1.m;
- for (int i = 0; i < V2.n; i++)
- {
- for (int j = 0; j < V2.m; j++)
- {
- if (*(M1.M + i*M1.m + j) < *(M2.M + i*M2.m + j))
- *(V2.M + i*V2.m + j) = *(M1.M + i*M1.m + j);
- else
- *(V2.M + i*V2.m + j) = *(M2.M + i*M2.m + j);
- }
- }
- return V2;
- }
- 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;
- cout << "\n";
- Matrix A(n, m);
- Formation(A);
- Print(A);
- cout << "Введите размерность матрицы B:\n";
- cout << "Введите количество строк: ";
- cin >> n;
- cout << "Введите количество столбцов: ";
- cin >> m;
- cout << "\n";
- Matrix B(n, m);
- Formation(B);
- Print(B);
- cout << "Введите размерность матрицы C:\n";
- cout << "Введите количество строк: ";
- cin >> n;
- cout << "Введите количество столбцов: ";
- cin >> m;
- cout << "\n";
- Matrix C(n, m);
- Formation(C);
- Print(C);
- Matrix D, F, G, I;
- D = A & B;
- Print(D);
- F = A[B];
- Print(F);
- G = A > B;
- Print(G);
- cout << "========(C & B) > C[A]========" << endl;
- I = (C & B) > C[A];
- Print(I);
- cout << endl;
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement