Главная страница
Навигация по странице:

  • Класс Классы в С++

  • Курсач 3. ведение линейного списка


    Скачать 1.73 Mb.
    Название ведение линейного списка
    Дата20.09.2022
    Размер1.73 Mb.
    Формат файлаdocx
    Имя файлаКурсач 3.docx
    ТипРеферат
    #686983


    Аннотация

    В курсовой работе кратко изложен теоретический материал к заданию по соответствующей теме и приведены решения по практической части в соответствии с индивидуальным вариантом.

    В курсовой работе описан класс DailySchedule реализующий однонаправленный линейный список для работы с данными, а так же описан интерфейс класса реализующий следующие действия:

    • ведение линейного списка;

    • поиск поездов, отправляющихся после времени, введенного с клавиатуры в течении ближайших двух часов;

    • поиск поездов, отправляющихся в пункт назначения, введенный с клавиатуры.

    СОДЕРЖАНИЕ

    4.Наследование классов: [Электронный ресурс]. М., 2015 URL: http://cppstudio.com. (Дата обращения: 15.05.2016). 20

    5.Указатель this: [Электронный ресурс]. С., 2000-2015 URL: http://www.cyberforum.ru. (Дата обращения: 16.05.2016). 20

    6.Объединение файлов: [Электронный ресурс]. С., 2000-2015 URL: http://www.programmersforum.ru. (Дата обращения: 17.05.2016). 20

    Введение

    Главная цель проекта – закрепление материала пройденного в течение учебного семестра. Помимо этого можно выделить следующие цели:

    • Углубленное изучение стандартной библиотеки шаблонов;

    • Получение навыков работы с пользовательскими типами данных;

    • Изучение материала для работы с файлами и потоками;

    • Навыки написания пользовательского интерфейса;

    • Написание многострочного проекта способствует развитию внимания;

    • И, наконец, для совершенствования навыков программирования.


    1 Объектно-ориентированное программирование

      1. Основные понятия ООП

    ООП - новая технология программирования, основанная на моделировании реального мира, при котором детали его реализации скрыты; либо взгляд на программирование, основанный на данных, в котором данные и поведение жестко связаны.

    В ООП существует три основных принципа построения классов:

    1. Инкапсуляция — это свойство, позволяющее объединить в классе и данные, и методы, работающие с ними и скрыть детали реализации от пользователя.

    2. Наследование — это свойство, позволяющее создать новый класс-потомок на основе уже существующего, при этом все характеристики класса родителя присваиваются классу-потомку.

    3. Полиморфизм — свойство классов, позволяющее использовать объекты классов с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.




      1. Класс

    Классы в С++ — это абстракция описывающая методы, свойства, ещё не существующих объектов. Объекты — конкретное представление абстракции, имеющее свои свойства и методы. Созданные объекты на основе одного класса называются экземплярами этого класса. Эти объекты могут иметь различное поведение, свойства, но все равно будут являться объектами одного класса. 

    Определение класса состоит из двух частей: заголовка, включающего ключевое слово class, за которым следует имя класса, и тела, заключенного в фигурные скобки. После такого определения должны стоять точка с запятой или список объявлений. Внутри тела объявляются данные-члены и функции-члены и указываются уровни доступа к ним. Таким образом, тело класса определяет список его членов. Каждое определение вводит новый тип данных. Даже если два класса имеют одинаковые списки членов, они все равно считаются разными типами.


      1. Структура

    Структура - это совокупность переменных, объединенных одним именем, предоставляющая общепринятый способ совместного хранения информации. Объявление структуры приводит к образованию шаблона, используемого для создания объектов структуры. Переменные, образующие структуру, называются членами структуры. (члены структуры также часто называются элементами или полями)

    Структура объявляется после ключевого слова struct, её объявления завершается точкой с запятой.


      1. Указатель this

    Каждый объект содержит свой экземпляр полей класса. Методы класса находятся в памяти в единственном экземпляре и используются всеми объектами совместно, поэтому необходимо обеспечить работу методов с полями именно того объекта, для которого они были вызваны. Это обеспечивается передачей в функцию скрытого параметра this, в котором хранится константный указатель на вызвавший функцию объект. Указатель this неявно используется внутри метода для ссылок на элементы объекта. В явном виде этот указатель применяется в основном для возвращения из метода указателя (return this;) или ссылки (return *this;) на вызвавший объект.
    1.5 Vector

    Вектор в C++ — это замена стандартному динамическому массиву, память для которого выделяется вручную. Класс vector является частью стандартной библиотеки C++.

    Для использования вектора необходимо включить заголовочный файл:

    #include

    Для доступа к отдельным элементам вектора применяется операция взятия индекса. Так же мы можем узнать размерность вектора, используя функцию size(), и проверить, пуст ли вектор, с помощью функции empty().

    Элементы вектора инициализируются значениями по умолчанию. Для числовых типов и указателей таким значением является 0. Если в качестве элементов выступают объекты класса, то инициатор для них задается конструктором по умолчанию. Однако инициатор можно задать и явно, используя форму:

    vector< int > ivec( 10, -1 );

    В данном примере все десять элементов вектора будут равны -1.

    Еще одним отличием вектора от массива встроенного типа является возможность инициализации одного объекта типа vector другим и использования операции присваивания для копирования объектов.
    1.6 Функция

    Функция — это фрагмент кода или алгоритм, реализованный на каком-то языке программирования, с целью выполнения определённой последовательности операций. Итак, функции позволяют сделать программу модульной, то есть разделить программу на несколько маленьких подпрограмм (функций), которые в совокупности выполняют поставленную задачу. Еще один плюс функций заключается в том, что их можно многократно использовать. Данная  возможность позволяет многократно использовать один раз написанный код, что в свою очередь, намного сокращает объем кода программы.

    Кроме того, что в С++ предусмотрено объявление своих функций, также можно воспользоваться функциями определёнными в стандартных заголовочных файлах языка программирования С++. Чтобы воспользоваться функцией, определённой в заголовочном файле, нужно его подключить. Например, чтобы воспользоваться функцией, которая возводит некоторое число в степень, нужно подключить заголовочный файл <сmath> и в запустить функцию pow() в теле программы.

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

    Для того, чтобы воспользоваться функцией из стандартного заголовочного файла С++ необходимо выполнить два действия:

    1) Подключить необходимый заголовочный файл;

    2) Запустить нужную функцию.

    Кроме вызова функций из стандартных заголовочных файлов, в языке программирования С++ предусмотрена возможность создания собственных функций. В языке программирования С++ есть два типа функций:

    1) Функции, которые не возвращают значений

    2) Функции, возвращающие значение

    Функции, не возвращающие значения, завершив свою работу, никакого ответа программе не дают. Рассмотрим структуру объявления таких функций.




    // структура объявления функций не возвращающих значений

    void /*имя функции*/(/*параметры функции*/) // заголовок функции

    {

    // тело функции

    }

    Функции, возвращающие значения, будут отличаться наличием зарезервированного слова return, после которого идет возвращаемое значение.

    Функции можно определять в одном файле с главной функцией, так и во внешних с последующим их подключением.
    1.6 Конструктор

    Конструктор (англ. construct — создавать) – это специальный метод класса, который предназначен для инициализации элементов класса некоторыми начальными значениями.

    Важно помнить, что:

    • Конструктор мы всегда объявляем в разделе public;

    • При объявлении конструктора тип возвращаемого значения не указывается;

    • Имя класса и конструктора должно быть одинаковым;

    • Допустимо создавать несколько конструкторов в одном классе. Если мы не передаем в конструктор параметров, он считается конструктором по умолчанию.

    Как сказано выше, мы можем передавать конструктору параметры. Таким образом, мы можем передать конструктору любые данные, необходимые при инициализации объекта.

    Конструктор срабатывает сразу, при создании объектов класса.
    1.7 Деструктор

    Деструктор автоматически запускается каждый раз, когда программа уничтожает объект. Чаще всего его используют тогда, когда в конструкторе, при создании объекта класса, динамически был выделен участок памяти и необходимо эту память очистить, если эти значения уже не нужны для дальнейшей работы программы.

    Так же как и конструктор, деструктор объявляется в разделе public. У деструктора нет типа возвращаемых значений и деструктору нельзя передавать никаких параметров. Имя деструктора идентично имени конструктора (имени класса), но с приставкой

    . В отличии от конструкторов, в классе может быть только один деструктор.

    Деструктор срабатывает в тот момент, когда завершается работа программы и уничтожаются все данные.
    1.8 Multimap

    Класс multimap библиотеки стандартных шаблонов используется для хранения и извлечения данных из коллекции, где каждый элемент является парой, обладающей значением данных и ключом сортировки. Значение ключа может не быть уникальным и применяется для автоматической сортировки данных. Значение элементов в multimap, но не связанное с ним значение ключа, можно изменить напрямую.Значения ключей, связанные со старыми элементами, необходимо удалить и вставить новые значения ключей, связанные с новыми элементами.

    Элементами multimap и map являются объекты pair - пары ключей и соответствующих им значений. Порядок сортировки ключей в контейнере определяется компараторным объектом-функцией less<тип>. В контейнере multimap допускается дублирование ключей. Это означает, что несколько значений могут быть ассоциированы с одним ключом (отношение ”один ко многим”). 

    Контейнер multimap поддерживает двунаправленные итераторы. Для работы с контейнерным классом multimap необходимо подключить заголовочный файл .
    2 Проектирование приложения

    1. Постановка задачи

    Необходимо реализовать программу с использованием класса DailySchedule и некоторой структуры, выполняющую следующие функции:

    1. Добавление новой записи в расписание;

    2. Удаление существующей записи;

    3. Изменение существующей записи;

    4. Поиск свободного времени в расписании;

    5. Вывод списка невыполненных дел (С помощью создания нового объекта);

    6. Вывод списка дел на экран и в файл;

    Для реализации поставленной задачи нам понадобится структура с полями:

    • Время начала записи

    • Время окончания записи

    • Описание работы

    • Признак выполнения работы

    Также будет создан класс DailySchedule содержащий список объектов структуры.

    В классе необходимо создать функции для добавления, удаления и изменения записей в списке, поиска свободного времени в расписании, вывода невыполненных дел (используя объект Redo) и вывод списка дел на экран и в файл.

    Приступим к выполнению задачи.


      1. Анализ задания

    Для решения задачи нам понадобится класс 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 – Структура файлов проекта


    1. Разработка

    3.1 Реализация структуры DailyItem

    Для начала создадим структуру – запись в дневнике дел, назовем её DailyItem. Полями структуры будут две переменные пользовательского типа данных Time, определенного в файле Time.h, приготовленного заранее. Также полями будут являться переменные, содержащие информацию о работе и признаке её выполнения. Объявив поля, получим следующую структуру:



    Рисунок 2 – поля структуры DailyItem
    Для определения полей создадим конструктор с аргументами и будем присваиваем полям структуры аргументы, переданные при создании экземпляра. Также будет конструктор без аргументов и деструктор.



    Рисунок 3 – конструкторы и деструктор структуры DailyItem
    Теперь у нас есть всё необходимое и самое время перейти к созданию класса DailySchedule.


      1. Класс 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 – метод записи информации в файл


      1. Реализация главной функции

    Создание класса позади, осталось вызвать методы, используя экземпляр класса.

    Для удобства реализуем следующий пользовательский интерфейс в бесконечном цикле.



    Рисунок 3.8 – пользовательский интерфейс
    Реализуем управление с помощью switch и функции getch(), вызывая в каждом case необходимый метод класса, не забывая про break.



    Рисунок 3.9 – множественный выбор с помощью switch, где x-экземпляр класса DailySchedule


      1. Тестирование программы

    Осталось провести тест программы, для этого запустим, предварительно выполнив сборку проекта.

    Программа запустилась и пред нами предстало меню:



    Рисунок 3.10 – интерфейс программы
    Осуществив добавление записей и проведя остальные функции, выведем полученные данные на экран.



    Рисунок 3.11 – работоспособность программы проверена


    ЗАКЛЮЧЕНИЕ

    В процессе выполнения курсового проекта были выполнены следующие задачи:

    • изучена необходимая теория;

    • закреплены теоретические знания, полученные из курса лекций;

    • получены навыки работы с классами и структурами;

    • повышены общие навыки программирования;

    • получены умения создания пользовательского интерфейса.

    Таким образом, можно говорить, что поставленные задачи были выполнены, а цель достигнута.


    Список используемой литературы

    1. Павловская Т.А. П12 С/С++. Программирование на языке высокого уровня – СПб.: Питер, 2004. – 461 с.: ил. ISBN 5-94723-568-4.

    2. Павловская Т.А., Щупак Ю.А. П12 С/С++. Структурное программирование: Практикум. – СПб.: Питер, 2003. – 240 с.: ил. ISBN 5-94723-447-5.

    3. Павловская Т.А. П12 С/С++. Программирование на языке высокого уровня – СПб.: Питер, 2004. – 461 с.: ил. ISBN 5-94723-568-4.

    4. Наследование классов: [Электронный ресурс]. М., 2015 URL: http://cppstudio.com. (Дата обращения: 15.05.2016).

    5. Указатель this: [Электронный ресурс]. С., 2000-2015 URL: http://www.cyberforum.ru. (Дата обращения: 16.05.2016).

    6. Объединение файлов: [Электронный ресурс]. С., 2000-2015 URL: http://www.programmersforum.ru. (Дата обращения: 17.05.2016).


    написать администратору сайта