Курсач 3. ведение линейного списка
Скачать 1.73 Mb.
|
. В отличии от конструкторов, в классе может быть только один деструктор. |
| // структура объявления функций не возвращающих значений void /*имя функции*/(/*параметры функции*/) // заголовок функции { // тело функции } |
Функции, возвращающие значения, будут отличаться наличием зарезервированного слова return, после которого идет возвращаемое значение.
Функции можно определять в одном файле с главной функцией, так и во внешних с последующим их подключением.
1.6 Конструктор
Конструктор (англ. construct — создавать) – это специальный метод класса, который предназначен для инициализации элементов класса некоторыми начальными значениями.
Важно помнить, что:
Конструктор мы всегда объявляем в разделе public;
При объявлении конструктора тип возвращаемого значения не указывается;
Имя класса и конструктора должно быть одинаковым;
Допустимо создавать несколько конструкторов в одном классе. Если мы не передаем в конструктор параметров, он считается конструктором по умолчанию.
Как сказано выше, мы можем передавать конструктору параметры. Таким образом, мы можем передать конструктору любые данные, необходимые при инициализации объекта.
Конструктор срабатывает сразу, при создании объектов класса.
1.7 Деструктор
Деструктор автоматически запускается каждый раз, когда программа уничтожает объект. Чаще всего его используют тогда, когда в конструкторе, при создании объекта класса, динамически был выделен участок памяти и необходимо эту память очистить, если эти значения уже не нужны для дальнейшей работы программы.
Так же как и конструктор, деструктор объявляется в разделе public. У деструктора нет типа возвращаемых значений и деструктору нельзя передавать никаких параметров. Имя деструктора идентично имени конструктора (имени класса), но с приставкой
Деструктор срабатывает в тот момент, когда завершается работа программы и уничтожаются все данные.
1.8 Multimap
Класс multimap библиотеки стандартных шаблонов используется для хранения и извлечения данных из коллекции, где каждый элемент является парой, обладающей значением данных и ключом сортировки. Значение ключа может не быть уникальным и применяется для автоматической сортировки данных. Значение элементов в multimap, но не связанное с ним значение ключа, можно изменить напрямую.Значения ключей, связанные со старыми элементами, необходимо удалить и вставить новые значения ключей, связанные с новыми элементами.
Элементами multimap и map являются объекты pair - пары ключей и соответствующих им значений. Порядок сортировки ключей в контейнере определяется компараторным объектом-функцией less<тип>. В контейнере multimap допускается дублирование ключей. Это означает, что несколько значений могут быть ассоциированы с одним ключом (отношение ”один ко многим”).
Контейнер multimap поддерживает двунаправленные итераторы. Для работы с контейнерным классом multimap необходимо подключить заголовочный файл
2 Проектирование приложения
Постановка задачи
Необходимо реализовать программу с использованием класса DailySchedule и некоторой структуры, выполняющую следующие функции:
Добавление новой записи в расписание;
Удаление существующей записи;
Изменение существующей записи;
Поиск свободного времени в расписании;
Вывод списка невыполненных дел (С помощью создания нового объекта);
Вывод списка дел на экран и в файл;
Для реализации поставленной задачи нам понадобится структура с полями:
Время начала записи
Время окончания записи
Описание работы
Признак выполнения работы
Также будет создан класс DailySchedule содержащий список объектов структуры.
В классе необходимо создать функции для добавления, удаления и изменения записей в списке, поиска свободного времени в расписании, вывода невыполненных дел (используя объект Redo) и вывод списка дел на экран и в файл.
Приступим к выполнению задачи.
Анализ задания
Для решения задачи нам понадобится класс DailyScedule и структура DailyItem.
Создадим проект с главным файлом A_Diary. Добавим к проекту файлы DailySchedule.h и DailySchedule.cpp, содержащие объявление класса и структуры, а также определение полей класса. По условию программы, нас необходимо работать с данными, представляющие время, поэтому для удобства создадим новый файл Time.h со структурой Time.
В итоге проект будет содержать следующие файлы:
A_Diary – Главный файл проекта с функцией main;
DailySchedule.h – Объявление класса DailySchedule и структуры DailyItem;
DailySchedule.cpp - Определение методов класса;
Time.h – Вспомогательная структура для работы со временем.
Представим иерархию файлов проекта:
Time.h
DailySchedule.cpp
DailySchedule.h
A_Diary.cpp
Рисунок 1 – Структура файлов проекта
Разработка
3.1 Реализация структуры DailyItem
Для начала создадим структуру – запись в дневнике дел, назовем её DailyItem. Полями структуры будут две переменные пользовательского типа данных Time, определенного в файле Time.h, приготовленного заранее. Также полями будут являться переменные, содержащие информацию о работе и признаке её выполнения. Объявив поля, получим следующую структуру:
Рисунок 2 – поля структуры DailyItem
Для определения полей создадим конструктор с аргументами и будем присваиваем полям структуры аргументы, переданные при создании экземпляра. Также будет конструктор без аргументов и деструктор.
Рисунок 3 – конструкторы и деструктор структуры DailyItem
Теперь у нас есть всё необходимое и самое время перейти к созданию класса DailySchedule.
Класс DailySchedule
По условию класс должен содержать своим полем список дел на день. Для реализации списка будем использовать контейнерный класс vector, чтобы избежать ошибок с выделением и освобождением динамической памяти, а также упростить программу, так как не потребуется новых полей для индексирования и максимального размера динамического массива. Список объявим с модификатором private, чтобы получить доступ к нему можно было только в нашем классе.
Рисунок 3.1 – поле класса DailySchedule
Класс будет содержать конструктор и деструктор без аргументов.
Для выполнения необходимых задач, создадим в классе методы.
Метод Add_Work запрашивает ввод переменных у пользователя и добавляет их в вектор методом push_back(). Наряду с этим функция осуществляет проверку уникальности записи на определенное время (не должно быть пометок с пересекающимся временем) и проверяется ввод времени начала записи и окончания, чтобы начальное время не было больше конечного.
Рисунок 3.2 – метод добавления новой записи
Добавление записи есть, теперь напишем функцию удаления записи. Метод будет осуществлять поиск объекта в векторе и производить его удаление методом erase();
Рисунок 3.3 – метод удаления записи
Следующая задача – изменение записи, для этого напишем метод Amend на основе функции Add_Work, только с поиском необходимого элемента в векторе.
Самая сложная задача программы – поиск свободного времени. Для реализации этой задачи напишем функцию Search_Time, для поиска и вывода свободного времени. Задача довольно тривиальна, но требует особого подхода. Оптимальным решением будет контейнерный класс multimap, в который поместим время начала и конца записей в дневнике. Класс сам упорядочит ключи по возрастанию (ключом является время начала записи). В другой multimap будем помещать конечное время записи и начальное время следующей записи, тем самым мы найдем свободные интервалы. Найдя время входящее в пользовательский интервал и превышающее минимальное количество времени, выведем свободное время на экран.
Рисунок 3.4 – основной код метода Search_Time
Для генерации объекта Redo на основе существующего объекта DailySchedule создадим функцию Gen, принимающую в качестве аргумента существующий экземпляр класса. И записываем в Redo только невыполненные задачи.
Рисунок 3.5 – метод для заполнения объекта Redo
Все задачи выполнены, теперь организуем вывод на экран и в файл. Для этого определим методы Print и Write_In_File, выводящие информацию.
Рисунок 3.6 – метод вывода информации из вектора на экран в удобном для пользователя виде
Рисунок 3.7 – метод записи информации в файл
Реализация главной функции
Создание класса позади, осталось вызвать методы, используя экземпляр класса.
Для удобства реализуем следующий пользовательский интерфейс в бесконечном цикле.
Рисунок 3.8 – пользовательский интерфейс
Реализуем управление с помощью switch и функции getch(), вызывая в каждом case необходимый метод класса, не забывая про break.
Рисунок 3.9 – множественный выбор с помощью switch, где x-экземпляр класса DailySchedule
Тестирование программы
Осталось провести тест программы, для этого запустим, предварительно выполнив сборку проекта.
Программа запустилась и пред нами предстало меню:
Рисунок 3.10 – интерфейс программы
Осуществив добавление записей и проведя остальные функции, выведем полученные данные на экран.
Рисунок 3.11 – работоспособность программы проверена
ЗАКЛЮЧЕНИЕ
В процессе выполнения курсового проекта были выполнены следующие задачи:
изучена необходимая теория;
закреплены теоретические знания, полученные из курса лекций;
получены навыки работы с классами и структурами;
повышены общие навыки программирования;
получены умения создания пользовательского интерфейса.
Таким образом, можно говорить, что поставленные задачи были выполнены, а цель достигнута.
Список используемой литературы
Павловская Т.А. П12 С/С++. Программирование на языке высокого уровня – СПб.: Питер, 2004. – 461 с.: ил. ISBN 5-94723-568-4.
Павловская Т.А., Щупак Ю.А. П12 С/С++. Структурное программирование: Практикум. – СПб.: Питер, 2003. – 240 с.: ил. ISBN 5-94723-447-5.
Павловская Т.А. П12 С/С++. Программирование на языке высокого уровня – СПб.: Питер, 2004. – 461 с.: ил. ISBN 5-94723-568-4.
Наследование классов: [Электронный ресурс]. М., 2015 URL: http://cppstudio.com. (Дата обращения: 15.05.2016).
Указатель this: [Электронный ресурс]. С., 2000-2015 URL: http://www.cyberforum.ru. (Дата обращения: 16.05.2016).
Объединение файлов: [Электронный ресурс]. С., 2000-2015 URL: http://www.programmersforum.ru. (Дата обращения: 17.05.2016).