geekbrains_cpp_difficult_mo.../lesson_3/exercise_2.cpp

183 lines
3.4 KiB
C++
Raw Normal View History

2021-09-30 00:46:47 +00:00
/*
* exercise_2.cpp
*
* Created on: 29 сент. 2021 г.
* Author: alexander
*/
#include <iostream>
#include <iomanip>
#include <random>
#include <math.h>
#include "exercise_2.hpp"
using namespace std;
Matrix::Matrix(const int size) : matrixSize(size), matrixCapacity(size * size)
{
array = new double[matrixCapacity];
}
/*
2021-09-30 17:08:09 +00:00
* Перегрузка операторов итератора
2021-09-30 00:46:47 +00:00
*/
2021-09-30 17:08:09 +00:00
Matrix::Iterator::Iterator(double *pointer) : current(pointer)
2021-09-30 00:46:47 +00:00
{
}
double& Matrix::Iterator::operator[](size_t i)
{
2021-09-30 17:08:09 +00:00
return *(current + i);
}
Matrix::Iterator& Matrix::Iterator::operator ++()
{
++current;
return *this;
}
bool Matrix::Iterator::operator !=(const Iterator &iterator)
{
return current != iterator.current;
}
double& Matrix::Iterator::operator *()
{
return *current;
2021-09-30 00:46:47 +00:00
}
Matrix::Iterator Matrix::operator[](size_t i)
{
return Iterator(array + i * matrixSize);
}
2021-09-30 17:08:09 +00:00
Matrix::Iterator Matrix::begin()
{
return Iterator(array);
}
Matrix::Iterator Matrix::end()
{
return Iterator(array + matrixCapacity);
}
2021-09-30 00:46:47 +00:00
/*
* Расчет определителя
*/
Matrix Matrix::getModifiedMatrix(Matrix &arr, const size_t item)
{
Matrix newArray(arr.size() - 1);
size_t currentRow = 0;
for (size_t i = 0; i < arr.size(); ++i)
{
if (item == i)
{
currentRow = i;
continue;
}
for (size_t j = 0; j < newArray.size(); ++j)
{
newArray[currentRow][j] = arr[i][j + 1];
}
++currentRow;
}
return newArray;
}
2021-09-30 01:08:40 +00:00
double Matrix::calculateDeterminant(Matrix &arr)
2021-09-30 00:46:47 +00:00
{
double determinant = 0;
2021-09-30 01:08:40 +00:00
if (arr.size() == 1)
2021-09-30 00:46:47 +00:00
{
determinant = arr[0][0];
}
2021-09-30 01:08:40 +00:00
else if (arr.size() == 2)
2021-09-30 00:46:47 +00:00
{
determinant = arr[0][0] * arr[1][1] + arr[1][0] * arr[0][1];
}
else
{
int sign = 1;
2021-09-30 01:08:40 +00:00
for (size_t i = 0; i < arr.size(); ++i)
2021-09-30 00:46:47 +00:00
{
Matrix newArray = getModifiedMatrix(arr, i);
2021-09-30 01:08:40 +00:00
determinant += sign * arr[i][0] * calculateDeterminant(newArray);
2021-09-30 00:46:47 +00:00
sign = -sign;
}
}
return determinant;
}
void Matrix::fillRandom()
{
random_device rd;
mt19937 mersenne(rd()); // x32-битное число
uniform_real_distribution<double> urd(-10.0, 10.0); // диапазон вещественных чисел от -10 до 10
for (size_t i = 0; i < matrixCapacity; ++i)
{
*(array + i) = round(urd(mersenne) * 10) / 10;
}
2021-09-30 01:08:40 +00:00
matrixDeterminant = calculateDeterminant((*this));
2021-09-30 00:46:47 +00:00
}
void Matrix::print() const
{
cout << '[';
for (size_t i = 0; i < matrixCapacity;)
{
cout << setw(5) << *(array + i++);
if (!(i % matrixSize))
{
2021-09-30 01:08:40 +00:00
cout << " ]" << endl;
2021-09-30 00:46:47 +00:00
if (i < matrixCapacity)
{
cout << '[';
}
}
else
{
cout << ',';
}
}
}
size_t Matrix::size() const
{
return matrixSize;
}
double Matrix::determinant() const
{
return matrixDeterminant;
}
Matrix::~Matrix()
{
delete[] array;
}
void exercise_2()
{
2021-09-30 01:08:40 +00:00
for (size_t i = 1; i < 8; ++i)
{
cout << "Матрица " << i << 'x' << i << ':' << endl;
Matrix m(i);
m.fillRandom();
m.print();
cout << "Определитель матрицы: " << setprecision(10) << m.determinant() << "\n\n"; // манипулятор для вывода без экспоненты
}
2021-09-30 00:46:47 +00:00
}