# Лабораторная работа № 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. Использование операций чтения и записи из потоков в методах классов вектора и матрицы не допускается за исключением операторов `<<` и `>>`. 5. Разбить программу на отдельные .h/.cpp файлы. 6. В файле Main.cpp в функции main привести тесты всех операций с выводом названий операций на консоль. 7. Выполнить тестирование методов с использование сложных выражений, включающих разные операции, например: `Vector res = - c1 * m1 * (v1 - c2 * v2) + v3 * c3` ## Литература 1. Баландин М.Ю., Шурина Э.П. Методы решения СЛАУ большой размерности. 2. Канатников А.Н., Крищенко А.П. Аналитическая геометрия.