Добавил:
github.com Кофедра ВТ-помойка Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
41
Добавлен:
17.11.2018
Размер:
83.22 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра вычислительной техники

отчет

по лабораторной работе №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:

Результат совпал с ожидаемым!

ВЫВОДЫ

В ходе выполнения данной работы освоены принципы полиморфизма и наследования классов. Применение данных принципов даёт большую выгоду при разработке более широких классов, на основе имеющихся, позволяя не описывать заново часть кода.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Алгоритмы и структуры данных. – Лекция от 6.02.2018.

  2. Алгоритмы и структуры данных. – Методические указания к лабораторным работам, практическим занятиям и курсовому проектированию, часть 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);

}

Соседние файлы в папке Колинько 4 семестр 2018