Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Lab_5/var17.cpp
- #include "stdafx.h"
- #include <iostream>
- #include <iomanip>
- #include <conio.h>
- #include <time.h>
- using namespace std;
- //17. (B - C / (B * A))
- //V = M1*M2 – строки матриц упорядочены по возрастанию
- //и элементы вектора равны произведениям соответствующих диагональных элементов;
- //М2 = M1 / V – Элементы строк матрицы делятся на ∏i k-тое = 0 Vk, где V_k≠0
- //М3 = М1 - М2 – результатом является М1, элементы столбцов которой уменьшаются
- //на разность средних арифметических М1 и М2.
- 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 void BubbleSort(Matrix&, int, int);
- friend Matrix const operator *(Matrix&, Matrix&);
- friend Matrix const operator /(Matrix&, Matrix&);
- friend Matrix const operator -(Matrix&, Matrix&);
- friend double srArifm(const Matrix &A);
- 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) = -5 + 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;
- }
- 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)
- {// Операция * - строки матриц упорядочены по возрастанию
- //и элементы вектора равны произведениям соответствующих диагональных элементов;
- 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;
- t = M1.n;
- if (M1.n > M1.m) t = M1.m;
- // заполнение 0
- for (i = 0; i < M3.n; i++)
- {
- for (j = 0; j < M3.m; j++)
- *(M3.M + i*M3.m + j) = 0;
- }
- int proizvedenieDiagElem;
- for (i = 0; i < M1.n; i++)
- {
- for (j = 0; j < M1.m; j++)
- {
- if (i == j)
- {
- int stroka = i;
- proizvedenieDiagElem = *(M1.M + i*M1.m + j) * *(M2.M + i*M2.m + j);
- for (int j = 0; j < M1.m; j++)
- {
- *(M3.M + stroka*M3.m + j) = proizvedenieDiagElem;
- }
- cout << "Произведение [" << i << "," << j << "] элементов M1 и M2 = " << proizvedenieDiagElem << endl;
- }
- }
- }
- return M3;
- }
- Matrix const operator /(Matrix &M1, Matrix &V)
- {// Элементы строк матрицы делятся на ∏i k-тое = 0 Vk, где V_k≠0
- int proizv[10] = { 1,1,1,1,1,1,1,1,1,1 }; //массив для хранение произведения строк V
- int count = 0;
- for (int i = 0; i<V.n; i++)
- {
- for (int j = 0; j < V.m; j++)
- {
- if(*(V.M + i*V.m + j)!=0)
- proizv[count] *= *(V.M + i*V.m + j);
- }
- cout << "Произведение " << i+1 << " строки V =" << proizv[count] << endl;
- count++;
- }
- // Создание матрицы М3
- Matrix M3(M1.n, M1.m);
- M3.n = M1.n;
- M3.m = M1.m;
- int t = M1.n;
- if (M1.n > M1.m) t = M1.m;
- // заполнение 0
- for (int i = 0; i < M3.n; i++)
- {
- for (int j = 0; j < M3.m; j++)
- *(M3.M + i*M3.m + j) = 0;
- }
- for (int i = 0; i<M1.n; i++)
- {
- for (int j = 0; j < M1.m; j++)
- {
- *(M3.M + i*M3.m + j) /= proizv[i];
- }
- }
- return M3;
- }
- Matrix const operator -(Matrix &M1, Matrix &M2)
- {// Результатом является М1, элементы столбцов
- //которой уменьшаются на разность средних арифметических М1 и М2.
- double raznicaArifm = srArifm(M1) - srArifm(M2);
- cout << "Разница средних арифметических матриц M1 и M2: " << srArifm(M1) << "-" << srArifm(M2) << "=" << raznicaArifm << endl;
- for (int j = 0; j < M1.m; j++)
- for (int i = 0; i<M1.n; i++)
- *(M1.M + i*M1.m + j) -= raznicaArifm;
- return M1;
- }
- double srArifm(const Matrix& A)
- {// Среднее арифметическое матрицы
- int i;
- float Sr, S = 0;
- for (int i = 0; i<A.n; i++)
- {
- for (int j = 0; j<A.m; j++)
- S += *(A.M + i*A.m + j);
- }
- Sr = S / (A.m*A.n);
- 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: " << endl;
- cout << "Введите количество строк: ";
- cin >> n;
- cout << "Введите количество столбцов: ";
- cin >> m;
- Matrix A(n, m);
- Formation(A); //Заполнение матрицы
- Print(A);
- cout << "Размерность матрицы B: " << endl;
- cout << "Введите количество строк: ";
- cin >> n;
- cout << "Введите количество столбцов: ";
- cin >> m;
- Matrix B(n, m);
- Formation(B); //Заполнение матрицы
- Print(B);
- cout << "Размерность матрицы C: " << endl;
- cout << "Введите количество строк: ";
- cin >> n;
- cout << "Введите количество столбцов: ";
- cin >> m;
- cout << endl;
- Matrix C(n, m);
- Formation(C); //Заполнение матрицы
- Print(C);
- cout << "-------------------------------------" << endl;
- Matrix V, M2, M3;
- cout << "V=A*B" << endl;
- V = A*B;
- Print(V);
- cout << "M2=A/V" << endl;
- M2 = A / V;
- Print(M2);
- cout << "M3=A-B" << endl;
- M3 = A-B;
- Print(M3);
- cout << "-------------------------------------" << endl;
- Matrix temp1;
- temp1 = B-C;
- Matrix temp2;
- temp2 = B * A;
- Matrix result;
- result = temp1 / temp2;
- Print(result);
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment