Факультет Информационных Технологий, I семестр Курс: Объектно-ориентированное программирование Задание №1. Понятия класса и объекта. Механизм переопределения операций на примере классов Vector и Matrix. Необходимо определить класс Vector, представляющий собой вектор в трехмерном пространстве, с началом в точке (0,0,0) и концом в точке (x,y,z). Использовать float переменные для представления координат вектора. Vector должен хранить указатель на массив float. Массив создается динамически в конструкторе через оператор new. В массиве хранятся координаты конца вектора. Определить в классе Vector следующие операции (функции): конструктор копирования оператор присваивания деструктор +, -, =, +=, -=, * (друг с другом) *, /, *=, /= (со скалярным аргументам) [] (взятие координаты вектора, например: v[0], v[1]) конструктор копирования операторы >> и << для ввода/вывода вектора через cin/cout invert() // поворот вектора на 180 градусов Определить операцию умножения на скаляр (когда он первый аргумент, например v1=3*v2) как внешнюю функцию (не функцию-член класса Vector). Написать тестовую глобальную функцию, показывающую работу каждого оператора. Защитить состояние объекта от некорректного доступа. Везде, где возможно, использовать в качестве аргументов константные ссылки, возвращать ссылки и использовать модификатор const для функций/операторов. Например: Vector operator+(const Vector& v1, const Vector& v2); Vector& operator+=(const Vector& v); float operator[](int pos) const; float& operator[](int pos); void print() const; 2) Используя класс Vector написать класс Matrix, представляющий матрицу 3*3, как массив из 3 объектов типа Vector. Массив создается динамически через оператор new внутри конструктора (как и в случае с Vector). Определить стандартные операции с матрицами. По крайней мере, необходимо реализовать следующие операции: конструктор копирования оператор присваивания деструктор [] *, *=, /, /= (со скаляром) * (c Vector) операторы >> и << для ввода/вывода матрицы через cin/cout transposition() // транспонирование матрицы (вокруг главной диагонали) det() //подсчет детерминанта матрицы 1 Факультет Информационных Технологий, I семестр Курс: Объектно-ориентированное программирование Написать тестовую глобальную функцию, показывающую работу каждого оператора. Защитить состояние объекта от некорректного доступа. Везде, где возможно, использовать в качестве аргументов константные ссылки, возвращать ссылки и использовать модификатор const для функций/операторов. 3) Используя созданные классы Vector и Matrix, реализовать утилитный класс для решения уравнений методом Гаусса. Класс должен содержать публичную статическую функцию: Vector gauss(const Matrix& variables, const Vector& values) которая решает уравнение вида: a1x+b1y+c1z=v1 a2x+b2y+c2z=v2 a3x+b3y+c3z=v3 методом исключения Гаусса. Этот класс должен содержать два специальных статических поля типа Vector с публичным доступом. Первое поле должно быть проинициализировано объектом Vector(FLT_MAX, FLT_MAX, FLT_MAX) (надо подключить <float.h>). Второе поле надо проинициализировать объектом Vector(FLT_MIN, FLT_MIN, FLT_MIN). Если решение уравнения найти невозможно, то возвращать первый объект. Если решение не единственное, то возвращать второй обект. Таким образом, тот код, который вызывает метод решения уравнения, может сравнить возвращаемое значение с известным статическим полем и понять, что решения нет или их бесконечно много. Псевдокод: Vector v = … // вызов функции решения уравнения if (v == …) { // сравниваем с первым статическим полем cout << “No Solution”; } else if (v == …) { // сравниваем со вторым статическим полем cout << “Infinity Set of Solutions”; } else { cout << “Solution: \n“ << v.print(); } 4) Создать тестовую глобальную функцию, которая предоставляет консольный интерфейс для ввода параметров: a1-a3, b1-b3, c1-c3, v1-v3 и выдачи результата (используя утилитный класс). 2