Untitled

 avatar
unknown
c_cpp
3 years ago
9.0 kB
6
Indexable
//Файл Header.
#include <iostream>
#include <cassert>

using namespace std;

//Клас Vector.
#include "Header.h"

class Vector {
private:
    double* array;
    int size;

public:
    Vector();
    Vector(double*, int);
    explicit Vector(int size);
    void Display();
    void Add(const double& value);
    void Remove();
    int getSize() const;
    double& operator[](const int i);
    Vector operator+(Vector & r);
    Vector operator-(Vector & r);
    Vector & operator=(const Vector & r);
    void Delete();
    ~Vector();
};

//Конструктор за замовчуванням
Vector::Vector() {
    this->array = nullptr;
    this->size = 0;
}
//Конструктор ініціалізації
Vector::Vector(double *arr, int size) {
    this->size = size;
    this->array = new double[size];
    for (int i = 0; i < size; ++i) {
        this->array[i] = arr[i];
    }
}
//Конструктор ініціалізації нулями
Vector::Vector(int size) {
    this->size = size;
    this->array = new double[size]{};
}
//Деструктор
Vector::~Vector() {
    delete[] this->array;
}
//Виводить на екран вектор
void Vector::Display() {
    for (int i = 0; i < this->size; ++i) {
        cout << this->array[i] << ' ';
    }
    cout << endl;
}
//Додавання нового елементу до вектора (в кінець)
void Vector::Add(const double& value) {
    double* temp = this->array; //Тимчасовий масив для зберігання поточного
    this->array = new double[this->size + 1];
    for (int i = 0; i < this->size; ++i) {
        this->array[i] = temp[i];
    }
    this->array[this->size] = value; //Додаємо в кінець поточного масиву потрібне значення
    this->size++;
    delete[] temp;
}
//Видалення елементу з кінця
void Vector::Remove() {
    size--;
    auto* temp = new double[size];;
    for (int i = 0; i < size; i++)
        temp[i] = array[i];
    delete[] array;
    array = temp;
}
//Перевантаження операції []
double &Vector::operator[](const int idx) {
    assert(idx >= 0 && idx < size); //Перевірка на правильність індекса
    return this->array[idx];
}
//Перевантаження операції +
Vector Vector::operator+(Vector &r) {
    assert(this->size == r.size); //Перевірка на розмір векторів (додаємо лише однакові за розміром)
    double* res = new double[size];
    for (int i = 0; i < this->size; ++i) {
        res[i] = this->array[i] + r.array[i];
    }

    return Vector(res, size);
}
//Перевантаження операції +
Vector Vector::operator-(Vector &r) {
    assert(this->size == r.size); //Перевірка на розмір векторів (додаємо лише однакові за розміром)
    double* res = new double[size];
    for (int i = 0; i < this->size; ++i) {
        res[i] = this->array[i] - r.array[i];
    }

    return Vector(res, size);
}
//Перевантаження операції =
Vector & Vector::operator=(const Vector &r) {
    delete[] this->array;

    this->size = r.size;
    this->array = new double[size];
    for (int i = 0; i < size; ++i) {
        this->array[i] = r.array[i];
    }

    return *this;
}
//Видалення вектора
void Vector::Delete() {
    delete[] this->array;

    this->array = nullptr;
    this->size = 0;
}

int Vector::getSize() const {
    return this->size;
}

//Клас Matrix.
#include "Header.h"
#include "Vector.h"

class Matrix {
private:
    Vector* rows;
    int rowsCount;

public:
    Matrix();
    explicit Matrix(Vector* vector, int size);
    void Display();
    Matrix operator*(const Matrix &r);
    Matrix operator*(Vector &r);
    Matrix operator+(const Matrix &r);
    Matrix operator-(const Matrix &r);
    ~Matrix();
};

//Конструктор за замовчуванням
Matrix::Matrix() {
    this->rows = nullptr;
    this->rowsCount = 0;
}
//Конструктор ініціалізації
Matrix::Matrix(Vector *vector, int size) {
    this->rowsCount = size;
    this->rows = new Vector[size];
    for (int i = 0; i < size; ++i) {
        this->rows[i] = vector[i];
    }
}
//Виводить на екран матрицю
void Matrix::Display() {
    for (int i = 0; i < this->rowsCount; ++i) {
        this->rows[i].Display();
    }
}
//Множення матриць
Matrix Matrix::operator*(const Matrix &r) {
    assert(r.rowsCount != 0); //на нульову матрицю не множимо
    for (int i = 0; i < this->rowsCount; ++i) {
        assert(this->rows[i].getSize() == r.rowsCount); //перевірка чи можна множити матрицю (m=n)
    }
    int colCount = r.rows[0].getSize();

    for (int i = 0; i < r.rowsCount; ++i) {
        assert(colCount == r.rows[i].getSize());
    }

    Vector* res = new Vector[colCount];
    auto* sum = new double[colCount];

    for (int i = 0; i < colCount; i++) {
        for (int j = 0; j < this->rowsCount; j++) {
            sum[j] = 0;
            for (int k = 0; k < r.rowsCount; k++) {
                sum[j] += this->rows[i][k] * r.rows[k][j];
            }
        }
       res[i] = Vector(sum, colCount);
    }
    return Matrix(res, this->rowsCount);
}
//Множення матриці на вектор
Matrix Matrix::operator*(Vector &r) {
    assert(r.getSize() != 0); //на нульовий вектор не множимо
    for (int i = 0; i < rowsCount; ++i) {
        assert(this->rows[i].getSize() == r.getSize()); //перевірка чи можна множити вектор (m=n)
    }

    auto* sum = new double;
    Vector* res = new Vector[r.getSize()];
    for (int i = 0; i < r.getSize(); ++i) {
        sum[0] = 0;
        for (int j = 0; j < r.getSize(); ++j) {
            sum[0] += this->rows[i][j] * r[j];
        }
        res[i] = Vector(sum, 1);
    }

    return Matrix(res, r.getSize());
}
//Додавання матриць
Matrix Matrix::operator+(const Matrix &r) {
    assert(this->rowsCount == r.rowsCount); //додаємо лише однакові за розміром матриці
    Vector* res = new Vector[rowsCount];
    for (int i = 0; i < rowsCount; ++i) {
        res[i] = this->rows[i] + r.rows[i];
    }

    return Matrix(res, rowsCount);
}
//
//Віднімання матриць
Matrix Matrix::operator-(const Matrix &r) {
    assert(this->rowsCount == r.rowsCount); //віднімаємо лише однакові за розміром матриці
    Vector* res = new Vector[rowsCount];
    for (int i = 0; i < rowsCount; ++i) {
        res[i] = this->rows[i] - r.rows[i];
    }

    return Matrix(res, rowsCount);
}
//Деструктор
Matrix::~Matrix() {
    delete[] this->rows;
}

//Файл main.cpp.
#include "Headers/Header.h"
#include "Headers/Vector.h"
#include "Headers/Matrix.h"

int main() {
    //Масиви для створення об'єкта класу Vector
    const int size = 2;
    auto* firstArr = new double[size]{3, 7};
    auto* secondArr = new double[size]{6, 2};
    //Створення об'єктів класу Vector
    Vector firstVector(firstArr, size);
    Vector secondVector(secondArr, size);
    //Масиви об'єктів класу Vector для створення об'єкта класу Matrix
    auto* firstVectorArr = new Vector[size]{
        firstVector,
        secondVector
    };
    auto* secondVectorArr = new Vector[size]{
        secondVector,
        firstVector
    };
    //Створення об'єктів класу Matrix
    Matrix firstMatrix(firstVectorArr, size);
    Matrix secondMatrix(secondVectorArr, size);
    //Виведемо матриці на екран
    cout << "First matrix: " << endl;
    firstMatrix.Display();
    cout << "Second matrix: " << endl;
    secondMatrix.Display();
    //Додавання матриць
    cout << "\nFirst matrix + Second matrix: " << endl;
    (firstMatrix + secondMatrix).Display();
    //Віднімання матриць
    cout << "\nFirst matrix - Second matrix: " << endl;
    (firstMatrix - secondMatrix).Display();
    //Множення матриці на вектор
    cout << "\nFirst matrix * first Vector: " << endl;
    (firstMatrix * firstVector).Display();
    //Множення матриці на матрицю
    cout << "\nFirst matrix * Second matrix: " << endl;
    (firstMatrix * secondMatrix).Display();

    cout << "\n\nHave a nice day =)" << endl;
    return 0;
}
Editor is loading...