Колинько 4 семестр 2018 / АиСД 1 лаб
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра вычислительной техники
отчет
по лабораторной работе №1
по дисциплине «Алгоритмы и структуры данных»
Тема: «Работа с иерархией объектов: наследование и полиморфизм»
Вариант №42
Студенты гр. 6307 |
|
Лазарев С.О. Медведев Е.Р. |
Преподаватель |
|
Колинько П.Г. |
Санкт-Петербург
2018
СОДЕРЖАНИЕ
ЗАДАНИЕ 3
ДОБАВЛЕННЫЕ КЛАССЫ 4
ПЕРЕОПРЕДЕЛЁННЫЕ ФУНКЦИИ-ЧЛЕНЫ 5
КОНТРОЛЬНЫЙ ПРИМЕР РАБОТЫ ПРОГРАММЫ 7
ВЫВОДЫ 10
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 11
ПРИЛОЖЕНИЕ: ТЕКСТ ПРОГРАММЫ 12
ЗАДАНИЕ
Постановка задачи: доработка учебной программы «Библиотека фигур», а именно: добавление в коллекцию фигур прямоугольного треугольника с косым крестом, реализовать для данной фигуры поворот на влево и вправо, отражение относительно горизонтальной и вертикальной осей.
Фигура:
Позиции для дополнения: 13, 15 – перья, 1 – воротник.
Ожидаемый результат:
(примечание: красные фигуры – добавленные по заданию)
ДОБАВЛЕННЫЕ КЛАССЫ
Добавлен класс «cross»:
class cross: public rectangle, public reflectable {
public:
cross(point a, point b) : rectangle(a, b) {}
void draw();
void flip_horisontally() {
int swy = sw.y, ney = ne.y;
ne.y = swy;
sw.y = ney;
}; // Отразить горизонтально
void flip_vertically() {
int nex = ne.x, swx = sw.x;
ne.x = swx;
sw.x = nex;
}; // Отразить вертикально
};
ПЕРЕОПРЕДЕЛЁННЫЕ ФУНКЦИИ-ЧЛЕНЫ
Переопределённые функции-члены: flip_horisontally() и flip_vertically(). Для нашей фигуры предусмотрено отображение. Для прямоугольника отображения не предусмотрено, но т.к за основу нашей фигуры взят прямоугольник, и к тому же мы наследуем методы классов отображения и поворота, нам пришлось переопределить функции отображения.
void flip_horisontally() {
int swy = sw.y, ney = ne.y;
ne.y = swy;
sw.y = ney;
} // Отразить горизонтально
void flip_vertically() {
int nex = ne.x, swx = sw.x;
ne.x = swx;
sw.x = nex;
} // Отразить вертикально
НЕДОСТУПНЫЕ ФУНКЦИИ-ЧЛЕНЫ
В данной работе ни одна функция-член не была реализована недоступной, так как при выполнении используются все описанные функции-члены.
КОНТРОЛЬНЫЙ ПРИМЕР РАБОТЫ ПРОГРАММЫ
Этап 1:
Этап 2:
Этап 3:
Результат совпал с ожидаемым!
ВЫВОДЫ
В ходе выполнения данной работы освоены принципы полиморфизма и наследования классов. Применение данных принципов даёт большую выгоду при разработке более широких классов, на основе имеющихся, позволяя не описывать заново часть кода.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
-
Алгоритмы и структуры данных. – Лекция от 6.02.2018.
-
Алгоритмы и структуры данных. – Методические указания к лабораторным работам, практическим занятиям и курсовому проектированию, часть 2, глава 1 «Работа с иерархией объектов: наследование и полиморфизм».
ПРИЛОЖЕНИЕ: ТЕКСТ ПРОГРАММЫ
Класс cross:
class cross: public rectangle, public reflectable, public rotatable {
public:
cross(point a, point b) : rectangle(a, b) {}
void draw();
void flip_horisontally() {
int swy = sw.y, ney = ne.y;
ne.y = swy;
sw.y = ney;
}; // Отразить горизонтально
void flip_vertically() {
int nex = ne.x, swx = sw.x;
ne.x = swx;
sw.x = nex;
}; // Отразить вертикально
void rotate_right() // Поворот вправо относительно se
{
int w = ne.x - sw.x, h = ne.y - sw.y;
sw.x = ne.x - h * 2; ne.y = sw.y + w / 2;
}
void rotate_left() // Поворот влево относительно sw
{
int w = ne.x - sw.x, h = ne.y - sw.y;
ne.x = sw.x + h * 2; ne.y = sw.y + w / 2;
}
};
Функции не члены класса:
void cross::draw() {
put_line(swest(), nwest());
put_line(seast(), swest());
put_line(seast(), nwest());
put_line(swest(), point(south().x, east().y));
put_line(west(), south());
}
void up_right(shape& p, const shape& q) // поместить p над q СПРАВА
{ //Это ОБЫЧНАЯ функция, а не член класса!
point n = q.neast();
point s = p.nwest();
p.move(n.x - s.x, n.y - s.y+1);
}
void up_left(shape& p, const shape& q) // поместить p над q СЛЕВА
{ //Это ОБЫЧНАЯ функция, а не член класса!
point n = q.nwest();
point s = p.nwest();
p.move(n.x - s.x, n.y - s.y + 1);
}
void down(shape &p, const shape &q) // поместить p под q (изменены point n и point s)
{
point n = q.south();
point s = p.swest();
p.move(n.x - s.x, n.y - s.y - 1);
}