Task_1.2 - Факультета информационных технологий НГУ

advertisement
Факультет Информационных Технологий, I семестр
Курс: Объектно-ориентированное программирование
Семинарист: Анойкин Д.А., http://ccfit.nsu.ru/~den
Задание №2. Понятия класса и объекта. Механизм
переопределения операций на примере классов Vector и
Matrix.
1) Необходимо определить класс Vector, представляющий собой вектор в трехмерном
пространстве, с началом в точке (0,0,0) и концом в точке (x,y,z). Использовать float
переменные для представления координат вектора. Определить в классе Vector
следующие операции (функции):
 конструктор копирования
 оператор присваивания
 деструктор
 +, -, =, +=, -=, * (друг с другом)
 *, /, *=, /= (со скалярным аргументам)
 [] (взятие координаты вектора, например: v[0], v[1])
 конструктор копирования
 print() // для распечатки внутреннего состояния вектора
 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. Определить стандартные операции с матрицами. По
крайней мере, необходимо реализовать следующие операции:
 конструктор копирования
 оператор присваивания
 деструктор
 []
 *, *=, /, /= (со скаляром)
 * (c Vector)
 print() // для распечатки внутреннего состояния матрицы
 transposition() // транспонирование матрицы (вокруг главной диагонали)
 det() //подсчет детерминанта матрицы
Написать тестовую глобальную функцию, показывающую работу каждого оператора.
Защитить состояние объекта от некорректного доступа. Везде, где возможно,
использовать в качестве аргументов константные ссылки, возвращать ссылки и
использовать модификатор const для функций/операторов.
1
Факультет Информационных Технологий, I семестр
Курс: Объектно-ориентированное программирование
Семинарист: Анойкин Д.А., http://ccfit.nsu.ru/~den
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
Download