Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <iomanip>
- #include <ctime>
- 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 int const operator +(Matrix&, Matrix&);
- friend Matrix operator &(Matrix&, int);
- 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) = 10 + rand() % 30;
- }
- 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;
- }
- int const operator +(Matrix &M1, Matrix &M2)
- { //K = М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);
- float sum = 0, count = 0;
- for (int i = 0; i < M1.n; i++)
- {
- for (int j = 0; j < M1.m; j++)
- {
- sum += *(M1.M + i*M1.m + j);
- sum += *(M2.M + i*M2.m + j);
- count += 2;
- }
- }
- double srArifm = sum / count;
- cout << "Общее среднее арифметическое матриц = " << srArifm << endl;
- int countResult = 0;
- for (int i = 0; i < M1.n; i++)
- {
- for (int j = 0; j < M1.m; j++)
- {
- if (*(M1.M + i*M1.m + j) > srArifm)
- countResult++;
- if(*(M2.M + i*M2.m + j) > srArifm)
- countResult++;
- }
- }
- return countResult;
- }
- Matrix operator &(Matrix &M1, int k)
- { //M2=M1&K – М2 равна матрице М1, в которой столбцы циклически сдвинуты вправо на К элементов,
- //и все элементы умножены на К;
- Matrix Tmp(M1.n + k, M1.m);
- Tmp.n = M1.n + k;
- Tmp.m = M1.m;
- int count = 0;
- cout << "Сдвиг на " << k << endl;
- for (int i = 0; i < Tmp.n; i++)
- for (int j = 0; j < Tmp.m; j++)
- *(Tmp.M + i*Tmp.m + j) = count++;
- for (int i = 0; i < M1.m; i++)
- {
- for (int j = 0; j < M1.n; j++)
- {
- int plusI = i + k;
- *(Tmp.M + plusI* Tmp.m + j) = *(M1.M + i* M1.m + j) * k;
- }
- }
- return Tmp;
- }
- Matrix operator >>(Matrix &M1, Matrix &M2)
- { //М3=М1!М2, где M3[i, j] = max{M1[i.j], M2[i.j]}.
- 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 < M1.n; i++)
- for (int j = 0; j < M1.m; j++)
- if (*(M1.M + i*M1.m + j) > -*(M2.M + i*M2.m + j))
- *(Tmp.M + i*Tmp.m + j) = *(M1.M + i*M1.m + j);
- else if (*(M1.M + i*M1.m + j) < -*(M2.M + i*M2.m + j))
- *(Tmp.M + i*Tmp.m + j) = *(M2.M + i*M2.m + j);
- return Tmp;
- }
- 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;
- cout << A + B;
- D = A & 2;
- Print(D);
- F = A >> C;
- Print(F);
- cout << (C + (B >> A >> B &(C + C))) << endl;
- Print(I);
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement