Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Lab_5_var18.cpp
- #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 Matrix operator <(Matrix&, Matrix&);
- friend Matrix operator /(Matrix&, Matrix&);
- friend Matrix operator >>(Matrix&, Matrix&);
- friend void normN(Matrix &A, int N);
- friend void normM(Matrix &A, int M);
- friend float srArifm(int, const Matrix&);
- //Переопределенные операции
- 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() % 100;
- }
- 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 – поэлементное деление элементов матриц, если делитель=0, то результат равен минимальному значению М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 < M1.n; i++)
- for (int j = 0; j < M1.m; j++)
- if (*(M2.M + i*M2.m + j) != 0)//если знаменатель не равен 0
- *(Tmp.M + i*Tmp.m + j) = *(M1.M + i*M1.m + j) / *(M2.M + i*M2.m + j);
- else
- *(Tmp.M + i*Tmp.m + j) = 0;
- return Tmp;
- }
- Matrix operator >> (Matrix &M1, Matrix &M2)
- { //М3=М1>>М2 – элементы периметра М2 заменяются элементами, стоящими по периметру М1. Результат в М3.
- float buf;
- // приведение матриц к квадратному виду
- 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++)
- {
- *(Tmp.M + i*Tmp.m + j) = *(M2.M + i*M2.m + j);
- }
- }
- for (int i = 0; i < M1.n; i++)
- {
- for (int j = 0; j < M1.m; j++)
- {
- if (i == 0)//первая строка
- {
- *(Tmp.M + i*Tmp.m + j) = *(M1.M + i*M1.m + j);
- }
- if (i == M1.n-1)//последняя строка
- {
- *(Tmp.M + i*Tmp.m + j) = *(M1.M + i*M1.m + j);
- }
- if (j == 0)//первый столбец
- {
- *(Tmp.M + i*Tmp.m + j) = *(M1.M + i*M1.m + j);
- }
- if(j == M1.m - 1)//последний столбец
- {
- *(Tmp.M + i*Tmp.m + j) = *(M1.M + i*M1.m + j);
- }
- }
- }
- return Tmp;
- }
- Matrix operator <(Matrix &M1, Matrix &M2)
- {
- //М3=М1<М2 – Сформировать матрицу из тех строк М1 и М2, для которых выполняется условие:
- //первый элемент строки больше среднего арифметического значения элементов этой строки.
- Matrix Tmp(M1.m, M1.m);
- Tmp.n = M1.n;
- Tmp.m = M1.m;
- for (int i = 0; i < M1.n; i++)
- {
- if (srArifm(i, M1) < *(M1.M + i*M1.m + 0)) //если М1 удовлетворяет условию
- {
- cout << "Среднее арифметическое [" << i << "] строки M1=" << srArifm(i, M1) << "<" << *(M1.M + i*M1.m + 0) << endl;
- for (int j = 0; j < M1.m; j++)
- {
- *(Tmp.M + i*Tmp.m + j) = *(M1.M + i*M1.m + j);
- }
- }
- else if (srArifm(i, M2) < *(M2.M + i*M2.m + 0)) //если М2 удовлетворяет условию
- {
- cout << "Среднее арифметическое [" << i << "] строки M2=" << srArifm(i, M2) << "<" << *(M2.M + i*M2.m + 0) << endl;
- for (int j = 0; j < M2.m; j++)
- {
- *(Tmp.M + i*Tmp.m + j) = *(M2.M + i*M2.m + j);
- }
- }
- else //если ни одно условие не выполняется - заполняем 0
- {
- for (int j = 0; j < M2.m; j++)
- {
- *(Tmp.M + i*Tmp.m + j) = 0;
- }
- }
- }
- return Tmp;
- }
- float srArifm(int num, const Matrix& A)
- {// Среднее арифметическое строки матрицы
- int i;
- float Sr, S = 0;
- for (i = 0; i < A.m; i++)
- {
- S += *(A.M + num*A.m + i);
- }
- Sr = S / A.m;
- return Sr;
- }
- 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 << "-------Каждое действие отдельно-------" << endl;
- D = A/B;
- Print(D);
- F = B >> C;
- Print(F);
- G = C < A;
- Print(G);
- cout << "-------C >> A <( B >>( C / A)) -------" << endl;
- I = C >> A < (B >> (C / A));
- Print(I);
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment