Newer
Older
# Лабораторная работа № 2 «Классы, перегрузка операций и исключения»
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
## Задача
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. Канатников А.Н., Крищенко А.П. Аналитическая геометрия.