Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы объектно-ориентированного программирования задач на графах. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное образовательное
учреждение высшего образования
«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
Инженерно-технологическая академия
В. А. ЛИТВИНЕНКО
ПРОГРАММИРОВАНИЯ ЗАДАЧ НА ГРАФАХ
Учебное пособие
Ростов-на-Дону – Таганрог
Издательство Южного федерального университета
2019
УДК 004.438(075.8) ББК 32.973
Л641
Печатается по решению кафедры систем автоматизированного
проектирования Института компьютерных технологий и
информационной безопасности Южного федерального университета
(протокол № 9 от 7 марта 2019 г.)
Рецензенты:
доктор технических наук, профессор кафедры автоматизации
производственных процессов Донского государственного технического
университета (ДГТУ) Ю. О. Чернышев
кандидат технических наук, доцент кафедры ИБТС Института компьютер-
ных технологий и информационной безопасности ЮФУ С. А. Ховансков
Литвиненко, В. А.
Л641 Основы объектно-ориентированного программирования задач на
графах : учебное пособие / В. А. Литвиненко ; Южный федеральный университет. – Ростов-на-Дону ; Таганрог : Издательство Южного федерального университета, 2019. – 133 с.
ISBN 978-5-9275-3472-2
Рассматриваются основы объектно-ориентированного программирования на С++ задач на графах – от создания класса до разработки иерархии классов, осно­ванной на классификации способов задания графов.
Пособие предназначено для студентов вузов, обучающихся по направлениям «Информатика и вычислительная техника» и «Информационные системы и тех­нологии». Пособие может быть полезным для специалистов, занятых програм­мированием алгоритмов решения задач на графах и сетях.
УДК 004.438(075.8)
ББК 32.973
ISBN 978-5-9275-3472-2
© Южный федеральный университет, 2019 © Литвиненко В. А., 2019 © Оформление. Макет. Издательство
Южного федерального университета, 2019
3
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ ..................................................................................................... 6
1. УНИВЕРСАЛЬНОСТЬ ГРАФОВ ............................................................ 9
Вопросы для самоконтроля ......................................................................... 131
2. ПРЕДСТАВЛЕНИЕ ГРАФОВ ................................................................ 13
2.1. Матрица смежности ................................................................................ 13
2.2. Матрица инцидентности ......................................................................... 13
2.3. Списочная форма ..................................................................................... 15
Вопросы для самоконтроля ........................................................................... 16
3. РАЗРАБОТКА КЛАССА ДЛЯ РЕШЕНИЯ ЗАДАЧ НА ГРАФАХ ... 17
3.1. Описание класса ...................................................................................... 17
3.2. Объект класса .......................................................................................... 18
3.3. Конструктор класса ................................................................................. 19
3.4. Деструктор класса ................................................................................... 21
3.5. Функции класса ....................................................................................... 24
3.6. Ввод-вывод матрицы смежности графа ................................................. 25
3.7. Определение вершин графа, смежных двум заданным вершинам ...... 27
3.8. Пример выполнения программы ............................................................ 29
3.9. Программа для работы с классом ........................................................... 30
Выводы ........................................................................................................... 32
Вопросы для самоконтроля ........................................................................... 33
4. ПРОСТОЕ НАСЛЕДОВАНИЕ ПРИ РАЗРАБОТКЕ КЛАССОВ
ДЛЯ РЕШЕНИЯ ЗАДАЧ НА ГРАФАХ .................................................... 35
4.1. Базовый и производный класс ................................................................ 35
4.2. Функция для проверки смежности двух вершин графа ........................ 36
Оглавление
4
4.3. Вызов конструктора базового класса...................................................... 37
4.4. Главная функция ...................................................................................... 37
4.5. Пример выполнения программы ............................................................. 38
Вопросы для самоконтроля ............................................................................ 38
5. ПОЛИМОРФИЗМ ПРИ РАЗРАБОТКЕ КЛАССОВ
ДЛЯ РЕШЕНИЯ ЗАДАЧ НА ГРАФАХ ................................ ..................... 40
5.1. Виртуальные функции ............................................................................ 40
5.2. Переопределение функций ................................................................ ...... 41
5.3. Вызов виртуальных функций .................................................................. 42
5.4. Пример выполнения программы ............................................................. 43
Вопросы для самоконтроля ............................................................................ 44
6. ЗАДАЧИ НА ГРАФАХ И ПЕРЕГРУЗКА ОПЕРАЦИЙ ...................... 45
6.1. Функции-операции .................................................................................. 45
6.2. Унарные функции-операции для ввода-вывода графов ........................ 46
6.3. Унарная функция-операция для проверки смежности двух вершин
графа ................................................................................................................ 49
6.4. Перегрузка операций для виртуальных функций .................................. 52
6.5. Результат работы программы для унарных операций ........................... 54
6.6. Бинарные функции-операции .................................................................. 54
6.7. Бинарная функция-операция для определения вершин, смежных
заданной вершине графа ................................................................................ 55
6.8. Бинарная функция-операция для объединения двух графов ................ 56
6.9. Пример выполнения программы для бинарных функций-операций .... 60
Вопросы для самоконтроля ............................................................................ 63
7. ИЕРАРХИИ КЛАССОВ ДЛЯ РЕШЕНИЯ ЗАДАЧ НА ГРАФАХ ..... 65
7.1. Структура и назначение классов ............................................................. 65
Оглавление
7.2. Абстрактные классы и чистые виртуальные функции .......................... 67
7.3. Определение чистых виртуальных функций в классе Маtr .................. 69
7.4. Определение чистых виртуальных функций в классе List .................... 71
7.5. Главная функция ..................................................................................... 76
7.6. Пример выполнения программы для иерархии классов ....................... 77
Вопросы для самоконтроля ........................................................................... 79
8. ЗАДАЧИ НА ГРАФАХ ПОВЫШЕННОЙ СЛОЖНОСТИ ................ 80
8.1. Иерархия и назначение функций классов .............................................. 80
8.2. Программирование функции определения паросочетания графа ........ 84
8.3. Программирование функции выделения семества клик,
покрывающего все вершины графа ............................................................... 87
8.4. Структура главной функции в ООП ....................................................... 92
ЗАКЛЮЧЕНИЕ ............................................................................................ 98
СПИСОК ЛИТЕРАТУРЫ........................................................................... 99
ПРИЛОЖЕНИЯ ......................................................................................... 100
Приложение 1 ............................................................................................... 100
Приложение 2 ............................................................................................... 102
Приложение 3 ............................................................................................... 105
Приложение 4 ............................................................................................... 109
Приложение 5 ............................................................................................... 114
Приложение 6 ............................................................................................... 120
Приложение 7 ............................................................................................... 126
6
ВВЕДЕНИЕ
Стандарт подготовки по направлениям «Информатика и вычисли­тельная техника» и «Информационные системы и технологии» предусмат­ривает освоение студентами технологий программирования. Технология объектно-ориентированного программирования является одной из наибо­лее распространенных технологий программирования на языках высокого уровня. Это связано, в первую очередь, с тем, что практически все совре­менные информационные программные системы являются объектно­ориентированными. Одним из языков высокого уровня, который сохранил свои лидирующие позиции, является С++, что подтверждается постоянным развитием многоязыковой среды программирования MS Visual Studio для Windows, среды Embarcadero RAD Studio для Windows и Android, популяр­ностью таких сред, как Xcode для платформы Apple, NetBeans для
Windows, Mac и Linux, более простых, но популярных сред – CodeBlocks, CLion, Dev-C++, что является определяющим фактором для дальнейшего
освоения и использования С++. Все это и определило выбор языка С++ как основного языка программирования для освоения студентами, обущающи­мися по направлениям «Информационные системы и технологии» и «Ин­форматика и вычислительная техника», при изучении технологий програм­мирования, в том числе объектно-ориентированного программирования. В качестве одного из объектов для освоения объектно­ориентированного программирования графы выбраны не случайно. Графы – это универсальная модель, которая широко используется при ре­шении различных задач, имеющих практическое значение, например, в си­стемах автоматизированного проектирования. Кроме того, задачи на гра­фах являются хорошим практическим базисом для освоения программиро­вания комбинаторно-логических алгоритмов.
Пособие знакомит с основными понятиями теории графов, програм-
мированием задач на графах на С++ с использованием классов, перегрузки операций, виртуальных функций, абстрактных классов. Рассматривается объектно-ориентированное программирование задач на графах различного уровня сложности – от создания простого класса до разработки иерархии классов, основанной на классификации способов задания графов, таких как матрица смежности, матрица инцидентности, а также задание графов в
Введение
7
списочной форме. Программирование задач, рассмотренных в пособии, выполнено c использованием консольных приложений.
Основная цель настоящего учебного пособия – показать процесс объ-
ектно-ориентированного программирования задач на графах как можно проще и сделать основной упор на использование различных структур дан­ных, которые используются для программирования алгоритмов решения задач на графах, а также использования возможностей С++.
В первом разделе пособия рассмотрены основные понятия теории
графов, а также способы задания графов: табличный, списочный и графи­ческий. При этом в настоящем учебном пособии не ставится задача изуче­ния теории графов. Этому вопросу посвящено достаточно большое число публикаций [1–5]. Кроме того, подробно с графами, их классификацией, а также с алгоритмами решения задач на графах студенты знакомятся в кур­се «Дискретная математика».
Во втором разделе рассматривается выбор структуры данных для
программирования задач на графах, заданных матрицей смежности, матри­цей инцидентности, а также для графов, представленных в списочной фор­ме.
В третьем разделе разрабатывается простой класс для решения задач
на графах, рассматриваются основы построения классов, создание объектов класса, а также разработка функций для решения некоторых простых задач на графах, например, определения вершин графа смежных двум заданным вершинам.
В четвертом и пятом разделах продолжена разработка классов для
решения задач на графах. Рассмотрено простое наследование и использо­вание виртуальных функций при решении задач на графах, использование конструкторов базовых и производных классов.
Шестой раздел посвящен использованию перегрузки операций для
создания унарных и бинарных операций для объектов классов, предназна­ченных для работы с графами.
В седьмом разделе разрабатывается иерархия классов, основанная на
классификации графов по способу их задания. Рассматриваются классы для работы с графами, заданными матрицей смежности и в списочной форме. При создании классов используютcя абстрактные классы и чистые вирту­альные функции.
Введение
8
В восьмом разделе рассматривается разработка приложения для ре-
шения более сложных задач теории графов, таких как определение паросо­четаний графа и выделения максимальных полных подграфов (клик) сим­метрических графов. Кроме того, рассмотрен подход к разработке про­грамм на С++ с использованием функции класса, которая, по существу, выполняет роль главной функции.
Для каждого раздела приведены контрольные вопросы для самопро-
верки. В приложениях приводятся тексты разрабатываемых в пособии про­грамм.
9
1. УНИВЕРСАЛЬНОСТЬ ГРАФОВ
1.1. Способы задания графа
Граф – это универсальная абстрактная модель. Граф состоит из вершин и ребер. Вершины моделируют объекты, а ребра – отноше­ния между двумя объектами.
Рассмотрим следующий пример. Объекты – это студенты. Каждому студенту поставим в соответствие вершину графа. Сколько студентов, столько и вершин. Студенты могут дружить друг с другом или нет. «Дружба» – это отношение между студентами. Если два студента дру­жат, то между вершинами, которые им соответствуют, проведем ребро. Если два студента не дружат, то ребра нет.
Граф можно задать графически, таблицей или списком. На рис. 1 по­казан граф для пяти студентов. Это графическое задание графа. Линии – это ребра, кружки – вершины. Если вершины соединены ребром, то гово­рят, что они смежны. На рис. 2 показано табличное представление этого графа – матрица смежности.
Рис. 1. Граф для пяти студентов
Матрица смежности состоит из строк и столбцов. Если в графе пять вершин, то в матрице смежности будет пять строк и пять столбцов. Каждая строка и столбец имеет номер. Первая строка и первый столбец соответ­ствуют вершине графа с номером «1» – первой вершине. Вторая строка и второй столбец соответствуют вершине графа с номером «2» – второй вер­шине, и т.д. Если на пересечении первой строки и второго столбца постав-
1
2
3
4
5
1. Универсальность графов
10
лена «1», то это означает, что первая и вторая вершины соединены ребром. Если стоит «0», то эти вершины ребром не соединены.
Рис. 2. Матрица смежности графа
Граф отражает отношения между любыми парами вершин, т.е. би-
нарные отношения между объектами. В нашем примере объекты – это сту­денты, а отношение – «дружны два студента или нет». Граф (см. рис. 1) показывает, что Первый студент дружит только со Вторым, Второй студент дружит, кроме Первого, еще с Третьим и Пятым студентами, а Четвер­тый – не дружит ни с кем.
Для того чтобы проверить дружат ли два студента, нужно узнать,
есть ли ребро между вершинами графа, которые соответствуют этим сту­дентам. По графическому изображению графа (см. рис. 1) это можно сде­лать визуально. По матрице смежности это можно узнать, проверив значе­ние элемента на пересечении строки и столбца, которые соответствуют этим вершинам.
Если требуется рассадить по партам наших студентов, то решить та­кую задачу можно, выделив в графе ребра, каждая пара которых имеет раз­ные номера вершин. В нашем примере за одну парту можно посадить Пер­вого и Второго студента, Пятого и Третьего. Четвертому студенту придется сидеть в гордом одиночестве. В теории графов эта задача называется зада­чей выделения в графе максимального паросочетания, т.е. такого паросоче­тания, количество ребер в котором наибольшее из всех возможных комби­наций.
Паросочетание графа – это множество попарно непересекащихся между собой ребер графа.
1 2 3 4 5
1 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0
1
2
3
4
5
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]