README.md 4.23 KB
Newer Older
# Лабораторная работа № 2 «Классы, перегрузка операций и исключения»
## Задача


1.  Создать класс `Vector` вещественных векторов, реализующий следующие операции:

*  конструктор, принимающий размер вектора и начальное значение элементов (по умолчанию принять 0);
*  копирующий конструктор;
*  деструктор;
*  операторы: `=`, `+=`, `-=`, `+` (бинарный и унарный), `-` (бинарный и унарный), `*` (произведение вектора на число, на вектор (скалярно), на матрицу, а также произведение числа на вектор), `[]`, `<<`, `>>`, оператор приведения типа к указателю на double;
*  метод вычисления длины вектора;
*  метод, возвращающий размерность вектора.

2.  Создать класс вещественных матриц:

**Вариант 1** – несимметричные разреженные матрицы, формат хранения CSR [1] (класс `CSRMatrix`):
*	конструктор, принимающий необходимые массивы (данные необходимо скопировать во внутренние массивы);
*	деструктор;
*	операторы умножения * матрицы на число и вектор [1], а также числа на матрицу;
*	операторы считывания из потока (`>>`) для инициализации внутренних массивов и форматированного вывода в поток (`<<`);
*	методы, возвращающие размерность матрицы и количество ненулевых элементов;

**Вариант 2** – симметричные разреженные матрицы, формат хранения CSLR [1] (класс `CSLRMatrix`):
*	требования те же, что и для варианта 1.

 3.	Для классов вектора и матрицы создать класс исключения OutOfRangeException, который наследуется от стандартного класса std::exception (располагается в файле exception.h), переопределяет метод what() и выводит сообщение, описывающее суть ошибки. Аналогично, создать класс исключения IncompatibleDimException для обработки ошибок, связанных с выполнением операций над матрицами и векторами с некорректными размерностями.

## Требования:

1.	Для внутренних массивов использовать тип `double`.
2.	Подумать, какие из функций реализовать в виде членов класса, какие в виде дружественных функций и какие в виде обычных функций.
3.	Использование операций чтения и записи из потоков в методах классов вектора и матрицы не допускается за исключением операторов `<<` и `>>`.
4.	Разбить программу на отдельные .h/.cpp файлы.
5.	В файле Main.cpp в функции main привести тесты всех операций с выводом названий операций на консоль.
6.	Выполнить тестирование методов с использование сложных выражений, включающих разные операции, например:

`Vector res = - c1 * m1 * (v1 - c2 * v2) + v3 * c3`

## Литература

1.	Баландин М.Ю., Шурина Э.П. Методы решения СЛАУ большой размерности.
2.	Канатников А.Н., Крищенко А.П. Аналитическая геометрия.