diff --git a/lesson_3/exercise_1.cpp b/lesson_3/exercise_1.cpp new file mode 100644 index 0000000..695413f --- /dev/null +++ b/lesson_3/exercise_1.cpp @@ -0,0 +1,54 @@ +/* + * exercise_1.cpp + * + * Created on: 29 сент. 2021 г. + * Author: alexander + */ + +#include +#include "exercise_1.hpp" + +using namespace std; + +void printList(list &l) +{ + cout << "{ "; + + for (list::const_iterator iter = l.begin(); iter != l.end(); ++iter) + { + cout << *iter << (next(iter, 1) == l.end() ? " " : ", "); + } + + cout << '}' << endl; +} + +void pushBackList(list &l) +{ + float sum = 0; + + for (const float &value : l) + { + sum += value; + } + + l.push_back(sum / l.size()); +} + +void exercise_1() +{ + list l { 54.46, 43.32, 37.89, 19.99 }; + size_t countCycle = 15; + + for (size_t i = 0; i < countCycle; ++i) + { + // Печать листа через каждых 5-и добавлений элементов + if (i % 5 == 0) + { + printList(l); + } + + pushBackList(l); + } + + printList(l); +} diff --git a/lesson_3/exercise_1.hpp b/lesson_3/exercise_1.hpp new file mode 100644 index 0000000..2eff723 --- /dev/null +++ b/lesson_3/exercise_1.hpp @@ -0,0 +1,15 @@ +/* + * exercise_1.hpp + * + * Created on: 29 сент. 2021 г. + * Author: alexander + */ + +#pragma once + +#include + +void printList(std::list &l); +void pushBackList(std::list &l); + +void exercise_1(); diff --git a/lesson_3/exercise_2.cpp b/lesson_3/exercise_2.cpp new file mode 100644 index 0000000..ec7837e --- /dev/null +++ b/lesson_3/exercise_2.cpp @@ -0,0 +1,151 @@ +/* + * exercise_2.cpp + * + * Created on: 29 сент. 2021 г. + * Author: alexander + */ + +#include +#include +#include +#include +#include "exercise_2.hpp" + +using namespace std; + +Matrix::Matrix(const int size) : matrixSize(size), matrixCapacity(size * size) +{ + array = new double[matrixCapacity]; +} + +/* + * Перегрузка операторов [][] + */ +Matrix::Iterator::Iterator(double *row) : currentRow(row) +{ +} + +double& Matrix::Iterator::operator[](size_t i) +{ + return *(currentRow + i); +} + +Matrix::Iterator Matrix::operator[](size_t i) +{ + return Iterator(array + i * matrixSize); +} +/* + * Расчет определителя + */ +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; +} + +double Matrix::calculateDeterminant(Matrix &arr, const size_t size) +{ + double determinant = 0; + + if (size == 1) + { + determinant = arr[0][0]; + } + else if (size == 2) + { + determinant = arr[0][0] * arr[1][1] + arr[1][0] * arr[0][1]; + } + else + { + int sign = 1; + + for (size_t i = 0; i < size; ++i) + { + Matrix newArray = getModifiedMatrix(arr, i); + determinant += sign * arr[i][0] * calculateDeterminant(newArray, size - 1); + sign = -sign; + } + } + + return determinant; +} + +void Matrix::fillRandom() +{ + random_device rd; + mt19937 mersenne(rd()); // x32-битное число + uniform_real_distribution urd(-10.0, 10.0); // диапазон вещественных чисел от -10 до 10 + + for (size_t i = 0; i < matrixCapacity; ++i) + { + *(array + i) = round(urd(mersenne) * 10) / 10; + } + + matrixDeterminant = calculateDeterminant((*this), matrixSize); +} + +void Matrix::print() const +{ + cout << '['; + + for (size_t i = 0; i < matrixCapacity;) + { + cout << setw(5) << *(array + i++); + + if (!(i % matrixSize)) + { + cout << ']' << endl; + + 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() +{ + Matrix m(7); + m.fillRandom(); + m.print(); + cout << "Определитель матрицы: " << setprecision(10) << m.determinant() << endl; // манипулятор для вывода без экспоненты +} + diff --git a/lesson_3/exercise_2.hpp b/lesson_3/exercise_2.hpp new file mode 100644 index 0000000..70b4b0b --- /dev/null +++ b/lesson_3/exercise_2.hpp @@ -0,0 +1,47 @@ +/* + * exercise_2.hpp + * + * Created on: 29 сент. 2021 г. + * Author: alexander + */ + +#pragma once + +#include + +/* + * Т.к. определитель (детрминант) вычисляется только для квадратной матрицы, + * то класс инициализируется одним положительным целочисленным значением. + */ +class Matrix +{ +private: + const size_t matrixSize; + const size_t matrixCapacity; + double *array; + double matrixDeterminant { 0.0 }; + + Matrix getModifiedMatrix(Matrix &arr, const size_t item); + double calculateDeterminant(Matrix &arr, const size_t size); +public: + Matrix(const int size); + void fillRandom(); // заполнить массив случайными значениями + void print() const; // распечатать массив + size_t size() const; // получить размер массива + double determinant() const; // получить определитель матрицы + + class Iterator + { + private: + double *currentRow; + public: + Iterator(double *row); + double& operator[](size_t i); + }; + + Iterator operator[](size_t i); + + ~Matrix(); +}; + +void exercise_2(); diff --git a/lesson_3/main.cpp b/lesson_3/main.cpp index ba4325c..c60dec9 100644 --- a/lesson_3/main.cpp +++ b/lesson_3/main.cpp @@ -4,14 +4,14 @@ * Created on: 27 сент. 2021 г. * Author: alexander */ -#include -#include -using namespace std; +#include "exercise_1.hpp" +#include "exercise_2.hpp" int main() { - +// exercise_1(); + exercise_2(); return 0; }