Основы объектно-ориентированного программирования задач на графах
Покупка
Основная коллекция
Тематика:
Программирование на C и C++
Издательство:
Южный федеральный университет
Год издания: 2019
Кол-во страниц: 133
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-9275-3472-2
Артикул: 756682.01.99
Рассматриваются основы обьектно-ориентированного программирования на C++ задач на графах - от создания класса до разработки иерархии классов, основанной на классификации способов задания графов. Пособие предназначено для студентов вузов, обучающихся по направлениям «Информатика и вычислительная техника» и «Информационные системы и технологии». Пособие может быть полезным для специалистов, занятых программированием алгоритмов решения задач на графах и сетях.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное автономное образовательное учреждение высшего образования «ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ» Инженерно-технологическая академия В. А. ЛИТВИНЕНКО ОСНОВЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ ЗАДАЧ НА ГРАФАХ Учебное пособие Ростов-на-Дону - Таганрог Издательство Южного федерального университета 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
ОГЛАВЛЕНИЕ ВВЕДЕНИЕ ....................................................... 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 3
Оглавление 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 4
Оглавление 7.2. Абстрактные классы и чистые виртуальные функции .......... 67 7.3. Определение чистых виртуальных функций в классе Matr.......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
ВВЕДЕНИЕ Стандарт подготовки по направлениям «Информатика и вычислительная техника» и «Информационные системы и технологии» предусматривает освоение студентами технологий программирования. Технология объектно-ориентированного программирования является одной из наиболее распространенных технологий программирования на языках высокого уровня. Это связано, в первую очередь, с тем, что практически все современные информационные программные системы являются объектноориентированными. Одним из языков высокого уровня, который сохранил свои лидирующие позиции, является С++, что подтверждается постоянным развитием многоязыковой среды программирования MS Visual Studio для Windows, среды Embarcadero RAD Studio для Windows и Android, популярностью таких сред, как Xcode для платформы Apple, NetBeans для Windows, Mac и Linux, более простых, но популярных сред - CodeBlocks, CLion, Dev-C++, что является определяющим фактором для дальнейшего освоения и использования С++. Все это и определило выбор языка С++ как основного языка программирования для освоения студентами, обущающи-мися по направлениям «Информационные системы и технологии» и «Информатика и вычислительная техника», при изучении технологий программирования, в том числе объектно-ориентированного программирования. В качестве одного из объектов для освоения объектноориентированного программирования графы выбраны не случайно. Графы - это универсальная модель, которая широко используется при решении различных задач, имеющих практическое значение, например, в системах автоматизированного проектирования. Кроме того, задачи на графах являются хорошим практическим базисом для освоения программирования комбинаторно-логических алгоритмов. Пособие знакомит с основными понятиями теории графов, программированием задач на графах на С++ с использованием классов, перегрузки операций, виртуальных функций, абстрактных классов. Рассматривается объектно-ориентированное программирование задач на графах различного уровня сложности - от создания простого класса до разработки иерархии классов, основанной на классификации способов задания графов, таких как матрица смежности, матрица инцидентности, а также задание графов в 6
Введение списочной форме. Программирование задач, рассмотренных в пособии, выполнено c использованием консольных приложений. Основная цель настоящего учебного пособия - показать процесс объектно-ориентированного программирования задач на графах как можно проще и сделать основной упор на использование различных структур данных, которые используются для программирования алгоритмов решения задач на графах, а также использования возможностей С++. В первом разделе пособия рассмотрены основные понятия теории графов, а также способы задания графов: табличный, списочный и графический. При этом в настоящем учебном пособии не ставится задача изучения теории графов. Этому вопросу посвящено достаточно большое число публикаций [1-5]. Кроме того, подробно с графами, их классификацией, а также с алгоритмами решения задач на графах студенты знакомятся в курсе «Дискретная математика». Во втором разделе рассматривается выбор структуры данных для программирования задач на графах, заданных матрицей смежности, матрицей инцидентности, а также для графов, представленных в списочной форме. В третьем разделе разрабатывается простой класс для решения задач на графах, рассматриваются основы построения классов, создание объектов класса, а также разработка функций для решения некоторых простых задач на графах, например, определения вершин графа смежных двум заданным вершинам. В четвертом и пятом разделах продолжена разработка классов для решения задач на графах. Рассмотрено простое наследование и использование виртуальных функций при решении задач на графах, использование конструкторов базовых и производных классов. Шестой раздел посвящен использованию перегрузки операций для создания унарных и бинарных операций для объектов классов, предназначенных для работы с графами. В седьмом разделе разрабатывается иерархия классов, основанная на классификации графов по способу их задания. Рассматриваются классы для работы с графами, заданными матрицей смежности и в списочной форме. При создании классов используются абстрактные классы и чистые виртуальные функции. 7
Введение В восьмом разделе рассматривается разработка приложения для решения более сложных задач теории графов, таких как определение паросо-четаний графа и выделения максимальных полных подграфов (клик) симметрических графов. Кроме того, рассмотрен подход к разработке программ на С++ с использованием функции класса, которая, по существу, выполняет роль главной функции. Для каждого раздела приведены контрольные вопросы для самопроверки. В приложениях приводятся тексты разрабатываемых в пособии программ.
1. УНИВЕРСАЛЬНОСТЬ ГРАФОВ 1.1. Способы задания графа Граф - это универсальная абстрактная модель. Граф состоит из вершин и ребер. Вершины моделируют объекты, а ребра - отношения между двумя объектами. Рассмотрим следующий пример. Объекты - это студенты. Каждому студенту поставим в соответствие вершину графа. Сколько студентов, столько и вершин. Студенты могут дружить друг с другом или нет. «Дружба» - это отношение между студентами. Если два студента дружат, то между вершинами, которые им соответствуют, проведем ребро. Если два студента не дружат, то ребра нет. Граф можно задать графически, таблицей или списком. На рис. 1 показан граф для пяти студентов. Это графическое задание графа. Линии -это ребра, кружки - вершины. Если вершины соединены ребром, то говорят, что они смежны. На рис. 2 показано табличное представление этого графа - матрица смежности. Рис. 1. Граф для пяти студентов Матрица смежности состоит из строк и столбцов. Если в графе пять вершин, то в матрице смежности будет пять строк и пять столбцов. Каждая строка и столбец имеет номер. Первая строка и первый столбец соответствуют вершине графа с номером «1» - первой вершине. Вторая строка и второй столбец соответствуют вершине графа с номером «2» - второй вершине, и т.д. Если на пересечении первой строки и второго столбца постав 9
1. Универсальность графов лена «1», то это означает, что первая и вторая вершины соединены ребром. Если стоит «0», то эти вершины ребром не соединены. Рис. 2. Матрица смежности графа Граф отражает отношения между любыми парами вершин, т.е. бинарные отношения между объектами. В нашем примере объекты - это студенты, а отношение - «дружны два студента или нет». Граф (см. рис. 1) показывает, что Первый студент дружит только со Вторым, Второй студент дружит, кроме Первого, еще с Третьим и Пятым студентами, а Четвертый - не дружит ни с кем. Для того чтобы проверить дружат ли два студента, нужно узнать, есть ли ребро между вершинами графа, которые соответствуют этим студентам. По графическому изображению графа (см. рис. 1) это можно сделать визуально. По матрице смежности это можно узнать, проверив значение элемента на пересечении строки и столбца, которые соответствуют этим вершинам. Если требуется рассадить по партам наших студентов, то решить такую задачу можно, выделив в графе ребра, каждая пара которых имеет разные номера вершин. В нашем примере за одну парту можно посадить Первого и Второго студента, Пятого и Третьего. Четвертому студенту придется сидеть в гордом одиночестве. В теории графов эта задача называется задачей выделения в графе максимального паросочетания, т.е. такого паросоче-тания, количество ребер в котором наибольшее из всех возможных комбинаций. Паросочетание графа - это множество попарно непересекащихся между собой ребер графа. 10