Курсовой проект по дисциплине Основы объектноориентированного программирования
Скачать 0.99 Mb.
|
Министерство науки и высшего образования Российской Федерации федеральное государственное бюджетное образовательное учреждение высшего образования «Российский экономический университет имени Г.В. Плеханова» Высшая школа кибертехнологий, математики и статистики Базовая кафедра цифровой экономики института развития информационного общества КУРСОВОЙ ПРОЕКТ по дисциплине «Основы объектно-ориентированного программирования» на тему «Учёт пациентов в больнице с применением ООП» Выполнил обучающийся группы 15.11Д-ПИИП05/21б очной формы обучения высшей школы кибертехнологий, математики и статистики Московский Григорий Дмитриевич Научный руководитель: ст. преподаватель Иванов Е. А. Москва – 2022 г. Содержание ОглавлениеВВЕДЕНИЕ 3 ГЛАВА 1. ТЕОРИТЕЧЕСКИЕ ОСНОВЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ И АНАЛИЗ ТРЕБОВАНИЙ К ПРОГРАММЕ 5 1.1 Основы объектно-ориентированного программирования 5 1.2 Объектно-ориентированное программирование на языке C++ 9 1.3 Анализ требований к программе 10 ГЛАВА 2. РАЗРАБОТКА ПРОГРАММЫ 12 2.1 Архитектура программы 12 2.2 Реализация классов для учёта пациентов 12 2.3 Демонстрация работы программы 15 ЗАКЛЮЧЕНИЕ 21 СПИСОК ЛИТЕРАТУРЫ 22 ПРИЛОЖЕНИЯ 24 ВВЕДЕНИЕОбъектно-ориентированное программирование появилось как реакция на очередную фазу кризиса программного обеспечения, когда методы структурное программирование уже не могло справиться с повышающейся сложностью программных продуктов. Создание объектно-ориентированного программирования имело своей целью решение проблем, присущих процедурному подходу к программированию и алгоритмического подхода к декомпозиции. Первые программисты писали программы посредством использования машинных кодов. Такой подход был довольно затруднительным, в связи с чем появилась необходимость создать программу, которая преобразовывала бы написанный человеком и понятный ему текст в машинные коды. Такую программу назвали «компилятор», а используемый для написания исходного текста программы язык — «языком программирования». «Assembeler» был первым компилятором. Впоследствии было создано большое количество различных языков программирования, таких как: C, ADA, FoxPro, Fortran, Basic, Pascal и другие. Следующей же ступенью развития стало объектно-ориентированное программирование. Появились соответствующие данной парадигме языки, например: C++, Object Pascal. Актуальность темы исследования обосновывается популярностью применения объектно-ориентированного программирования в настоящее время. Цель данной работы – создание программы, реализующей классы для ведения учёта пациентов в больнице. Для достижения поставленной цели необходимо выполнить следующие задачи: 1. Рассмотреть основы объектно-ориентированного программирования 2. Выполнить анализ требований к разрабатываемой программе 3. Создать программу на языке C++ для ведения учёта пациентов в больнице. Предметом исследования является применение объектно-ориентированного программирования при разработке программы для учёта пациентов в больнице. Объектом исследование является создание программы для учёта пациентов в больнице. При решении поставленной задачи использовался следующие методы исследования: анализ литературы и метод моделирования. Работа состоит из введения, 2-х глав, заключения, списка литературы, а также приложения. ГЛАВА 1. ТЕОРИТЕЧЕСКИЕ ОСНОВЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ И АНАЛИЗ ТРЕБОВАНИЙ К ПРОГРАММЕ1.1 Основы объектно-ориентированного программированияООП — это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса (типа особого вида), а классы образуют иерархию на принципах наследуемости. При разработке приложений с использованием ООП может применяться объектно-ориентированная декомпозиция, тогда как прежде, в случае применения процедурного подхода к программированию, имела место алгоритмическая декомпозиция. Первым бросающимся в глаза отличием ООП от структурного программирования является использование классов. Класс — это тип, определяемый программистом, в котором объединяются структуры данных и функции их обработки. Конкретные переменные типа данных «класс» называются экземплярами класса, или объектами. Класс содержит константы и переменные, называемые полями, а также выполняемые над ними операции и функции. Функции класса называются методами (другое название — функции-члены). Предполагается, что доступ к полям класса возможен только через вызов соответствующих методов. Поля и методы являются элементами (членами) класса. Методы, расположенные в открытой части, формируют интерфейс класса и могут свободно вызываться клиентом через соответствующий объект класса. Доступ к закрытой секции класса возможен только из его собственных методов, а к защищенной — из его собственных методов, а также из методов классов-потомков. Класс — это совокупность свойств, методов и событий. При этом «совокупность» означает, что функционирование класса обеспечивается в совокупности методами, свойствами и событиями. Под объектом понимается экземпляр класса. Объект функционирует как единое целое, реагируя соответствующими методами на соответствующие события класса. Разница между понятиями объекта и класса заключается в том, что посредством класса осуществляется описание какой-либо сущности, что работает как шаблон, основа. Например, в случае с Delphi, для того, чтобы добавить на форму кнопку, следует объявить класс, описать свойства, методы и события, и, при переносе кнопки на форму, создается экземпляр этой кнопки, т.е. объект. Немаловажно, что каждый класс должен включать в себя два обязательных метода: создать объект (конструктор), уничтожить объект (деструктор), а процесс создания объекта именуется инициализацией. Эти методы выделяют под свойства объекта память и освобождают ее, а также заполняют свойства значениями по умолчанию. Существует так называемые права доступа, в зависимости от которых методы и классы видны другим классам. В C++ это private, protected и public. Открытыми для доступа должны быть лишь некоторые возможности класса. Роль классов в ООП заключается в том, что они выполняют две функции, всегда разделенные до появления объектно-ориентированных технологий: класс — это одновременно и модуль и тип. Под модулями понимаются структурные единицы, из которых состоит программа. Поскольку модуль всегда рассматривается как синтаксическая концепция, то разбиение них влияет только на форму записи исходных кодов, не определяя их функциональность. Тип — это статистическое описание определенных динамических объектов — элементов данных, обрабатываемых в процессе выполнения программы. Одним из важнейших достижений в области ООП является методология паттернов проектирования, иногда называемых шаблонами проектирования. Паттерн — это описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте. Паттерны выявляются по мере накопления опыта разработок, когда программист использует одну и ту же схему организации и взаимодействия объектов в разных контекстах. Паттерны предназначены, прежде всего, для инкапсуляции изменений. Основные свойства ООП К основным принципам ООП относятся: пакетирование или инкапсуляция; наследование; полиморфизм. Наследование (или наследственность) — определение объекта и его дальнейшее использование для построения иерархии порожденных объектов с возможностью для каждого порожденного объекта, относящегося к иерархии, доступа к коду и данным всех порождающих объектов. Как структурная, так и объектно-ориентированная методологии ставят перед собой цель построения дерева иерархии взаимосвязей между объектами. При этом структурная иерархия формируется по простому принципу разделения целого на составляющие, тогда как в случае объектно-ориентированной иерархии отражается наследование свойств вышележащих типов объектов нижележащим типам объектов. Абстрактными типами называют типы верхних уровней иерархии, которые, как правило, не имеют экземпляров. Конкретными экземплярами зачастую обладают типы нижних уровней иерархии. Наследственность в ООП — это его основа. Следует понимать, что потомок — класс, от которого происходят другие классы, наследует свойства предка — класса, который происходит либо порожден из другого класса. Следовательно, потомок всегда «знает», какими он обладает свойствами, а предок не может «знать» свойства своего потомка, поскольку не может «знать» те свойства, которые будут добавлены в новый класс. Данный метод наследования и принят в объектно-ориентированных языках. Именно наследование дает возможность повторно использовать уже существующий код, как отмечается автором. С целью применения существующего кода, программист создает новый класс на базе уже существующих классов. В итоге, наследование выполняет две функции: предотвращение дублирования кода, развитие работы в нужном направлении. Отношения между родительскими классами и его потомками именуется термином «Иерархия наследования». Под полиморфизмом подразумевается свойство родственных объектов решать схожие по смыслу проблемы разными способами. Например, действие «бежать» свойственно большинству животных. Но каждое из них действует различным образом. Полиморфизм — присваивание действию одного имени, которое затем совместно используется вниз и вверх по иерархии объектов, причем каждый объект иерархии выполняет это действие способом, именно ему подходящим. «Полиморфизм» представляет собой способность обладать несколькими формами. В объектно-ориентированной разработке это относится к сущностям (элементам структур данных), способным в процессе выполнения присоединяться к объектам разных типов. Полиморфизм дает возможность применения одних и тех же функций для решения различных задач и находит свое отражение в том, что под одним именем содержатся разные действия, наполнение которых зависит от типа объекта. Производные одного базового класса считаются полиморфными. Это подразумевает, что им присущи как общие характеристики, так и собственные свойства. Касательно средств, которые связаны с возможностью реализации полиморфизма, то следует упомянуть следующие виды методов в ООП: Статические методы класса включаются в код программы в процессе ее компиляции. Таким образом, до запуска программы уже известно, какая процедура будет вызвана в определенной точке. Виртуальные методы, которые подключаются к основному коду на этапе выполнения программы и дают возможность определить тип и конкретизировать экземпляр объекта в процессе исполнения, а затем вызвать методы этого объекта. Данный механизм обеспечивает полиморфизм и именуется также поздним связыванием. Полиморфизм дает возможность создавать множественные определения для операций и функций. Какое именно определение будет использоваться, зависит от контекста программы. ООП предоставляет возможности, связанные с полиморфизмом, такие как: шаблоны функций, перегрузка функций, перегрузка операций, использование виртуальных методов, шаблоны классов. Перегрузка операций позволяет применять для собственных классов те же операции, что используются для встроенных типов C++. Виртуальные методы обеспечивают возможность выбрать на этапе выполнения нужный метод среди одноименных методов базового и производного классов. Шаблоны классов позволяют описать классы, инвариантные относительно типов данных. 1.2 Объектно-ориентированное программирование на языке C++В языке программирования C++ для определения класса используется ключевое слово class, после которого следует название определяемого класса. 1.3 Анализ требований к программеКоммерческие приложения, позволяющие вести учёт пациентов в больнице, могу предоставлять различный функционал в зависимости от выбора приложения. Так, российский сервис Med.me предоставляет возможность пациентам записать «онлайн» на приём к врачу, а администратор может управлять медицинскими картами пациентов в личном кабинете. А система 1С: Медицина.Больница дополнена возможностью оповещений пациентов. Оповещения о приёме, переносе даты приёма, а также о других мероприятиях могут приходить как на сотовый телефон, так и на электронную почту пациента. Однако, основным функционалом приложений для учёта пациентов в больнице является следующий список: Создание базы данных пациентов Сохранение картотеки пациентов в электронном виде Составление списка обследований по каждому из пациентов Ведение пользовательских справочников Автоматизация работы регистратуры (отслеживание оплаты услуг и прочее) Генерация различных документов (медицинские заключения, результаты обследования и т.п.) Функционал создаваемого в рамках данной работы приложения ограничивается следующим: Добавление врачей в систему Вывод информации о враче по идентификатору Вывод информации о всех врачах Добавление пациентов в систему Выписка пациентов Вывод информации о пациентах, находящихся на лечении Вывод информации о пациентах, выписанных из больницы Прикрепление врача к пациенту Вывод списка врачей у пациента Вывод списка пациентов у врача ГЛАВА 2. РАЗРАБОТКА ПРОГРАММЫ2.1 Архитектура программыВ приложении используются следующие библиотеки: iostream – стандартная библиотека для организации ввода/вывода vector – позволяет использовать класс vector (используется как замена стандартному динамическому массиву) В программе реализовано 4 класса: класс Human, наследуемые от него классы Doctor и Patient, а также класс Hospital. Весь функционал реализуется методами класса Hospital с помощью методов классов Doctor и Patient. Пользователь работает с меню, для выхода он должен нажать 0, соответственно, вывод меню и работа с ним организованы с помощью цикла while. 2.2 Реализация классов для учёта пациентовКласс Human содержит следующие защищённые поля: string name – имя int age – возраст Также класс Human содержит один открытый метод, а именно конструктор: Human(string name_, int age_) : name(name_), age(age_) {} С помощью списка инициализации задаются имя и возраст человека. Класс Doctor наследуется от класса Human с модификатором наследования protected и содержит закрытые поля: string specialization – специализация врача unsigned int experience – стаж работы unsigned int id – идентификатор А также класс Doctor содержит следующие открытые методы: Doctor(string name_, int age_, string specialization_, unsigned int experience_, unsigned int id_) : Human(name_, age_), specialization(specialization_), experience(experience_), id(id_) {} – конструктор, с помощью списка инициализации задаётся значение всем полям string getName() – возвращает имя врача unsigned int getId() – возвращает идентификатор врача void showInfo() – выводит на экран всю информацию о враче Класс Patient также наследуется от класса Human с модификатором доступа protected, содержит следующие закрытые поля: string typeOfDesease – название заболевания string dateOfAdmission – дата поступления в больницу string dateOfDischarge- дата выписки unsigned int id – идентификатор vector Класс Patient содержит открытые методы: Patient(string name_, int age_, string typeOfDeasease_, string dateOfAdmission_, unsigned int id_) : Human(name_, age_), typeOfDesease(typeOfDeasease_), dateOfAdmission(dateOfAdmission_), id(id_) {} – конструктор string getName() – возвращает имя пациента unsigned int getId() – возвращает идентификатор пациента void showInfo() – выводит всю информацию о пациенте void addADoctor(Doctor* aDoctor) – добавляет переданный в качестве аргумента указатель на врача в массив listOfDoctors vector void setDateOfDischarge(string dateOfDischarge) – задаёт дату выписки void showDischargedInfo() – выводит информацию о пациенте, если он выписан Класс Hospital содержит следующие закрытые поля: vector patients – вектор, хранящий указатели на объекты типа Patient (информация о пациентах на лечении) vector vector И следующие открытые методы: void addADoctor(Doctor* aDoctor) – добавление врача в систему void deleteDoctor(unsigned int id_) – удаление врача из системы по идентификатору void showInfoAboutADoctor(unsigned int id_) – вывод полной информации о враче по идентификатору void showAllDoctors() – вывод списка врачей void admitNewPatient(Patient* patient) – добавление пациента в систему void dischargeAPatient(unsigned int id_, string date_) – выписка пациента по идентификатору с указанием даты void showInfoAboutAPatient(unsigned int id_) – вывод информации о пациенте по идентификатору void showInfoAboutDischargedPatient(unsigned int id_) – вывод информации о выписанном пациенте по идентификатору void addADoctorForAPatient(unsigned int patientId, unsigned int doctorId) – прикрепление врача к пациенту по идентификаторам пациента и врача void showListOfDoctors(unsigned int id_) – вывод списка лечащих пациента врачей void showListOfPatients(unsigned int id_) – вывод списка пациентов, находящихся на лечении у врача Ниже на рисунке представлена диаграмма классов 2.3 Демонстрация работы программыОставить основные скрины, добавить текста о работе проги Ниже продемонстрирована работа программы. При запуске на экран выводится меню, пользователь должен выбрать одну опцию из 10, для выхода из программы необходимо ввести 0. Также даётся подсказка о том, что для начала работы необходимо добавить как минимум одного врача и пациента, хотя программа работает корректно и в случае, если не добавлены ни пациент, ни врач. Рис. №. Стартовое меню На следующем рисунке продемонстрировано добавление врача в систему. При этом программа требует от пользователя ввести имя, возраст, специализацию, стаж работы и идентификатор врача. Рис. №. Добавление 1-го врача Аналогично происходит добавление пациента в систему, требуется указать основную информацию о пациенте. Рис. №. Добавление 1-го пациента Программа вывод информацию о враче по идентификатору (случай, когда указан отсутствующий идентификатор, представлен в приложении) Рис. №. Информация о враче Также имеется возможность вывести информацию обо всех врачах в системе. Рис. №. Информация обо всех врачах Аналогично происходит вывод информации о пациенте по идентификатору. Рис. №. Информация о пациенте После добавления в систему врачей и пациентов необходимо прикрепить врача к пациенту. Для этого пользователь указывает идентификатор пациента, к которому нужно прикрепить врача, и, соответственно идентификатор врача. Рис. №. Прикрепление врача с ID 1 к пациенту с ID 11 Для вывода списка лечащих врачей необходимо указать идентификатор пациента. Если идентификатор указан верно, то выводятся имена лечащих врачей. Рис. №. Список врачей у пациента с ID 11 Аналогично, есть возможность вывести список пациентов у врача, указав его идентификатор. Рис. №. Список пациентов у врача с ID 1 Для выписки пациента необходимо указать идентификатор выписываемого пациента и дату выписки. При этом пациент пропадает из списка пациентов в больнице и попадает в список выписанных пациентов. Рис. №. Выписка пациента с ID 11 После выписки пациента можно узнать информацию о нём, выбрав пункт 7 («Показать информацию о выписанном пациенте»). При этом также выводится информация о дате выписки. Рис. №. Информация о выписанном пациенте с ID 11 ЗАКЛЮЧЕНИЕРассмотрим результаты работы, целью которой было создание программы, реализующей классы для ведения учёта пациентов в больнице. В ходе работы были рассмотрены основы объектно-ориентированного программирования, особенности использования объектно-ориентированного программирования в языке C++, сформулированы требования к разрабатываемой программе. Нами была разработана архитектура программы, включающая в себя реализацию 4 классов с использованием наследования, создана программа для учёта пациентов в больнице, реализующая приведённые выше классы и позволяющая добавлять врачей в систему, положить пациента в больницу, выписать его из больницы, узнать информацию о враче/пациенте. При разработке программы были предусмотрены случаи некорректного ввода информации, связанные с указанием неверного идентификатора пациента/врача и с отсутствием врача/пациента в системе при попытке прикрепить врача к пациенту, выписать пациента из больницы или вывести информацию обо всех врачах в больнице. Благодаря этому, программа работает корректно, соответствуя всем поставленным требованиям. Таким образом, можно сделать вывод, что все поставленные задачи были выполнены, а цель работы достигнута полностью. СПИСОК ЛИТЕРАТУРЫРоманов С.С. Ключевые понятия и особенности объектно-ориентированного программирования // Таврический научный обозреватель. 2016. №12-2 (17). URL: https://cyberleninka.ru/article/n/klyuchevye-ponyatiya-i-osobennosti-obektno-orientirovannogo-programmirovaniya (дата обращения: 14.05.2022). Ашарина, И.В. Объектно-ориентированное программирование в С++: лекции и упражнения: Учебное пособие для вузов / И.В. Ашарина. - М.: РиС, 2015. - 336 c. Ашарина, И.В. Язык С++ и объектно-ориентированное программирование в С++. Лабораторный практикум: Учебное пособие для вузов / И.В. Ашарина, Ж.Ф. Крупская. - М.: ГЛТ , 2015. - 232 c. Васильев, А.Н. Объектно-ориентированное программирование на C++ / А.Н. Васильев. - СПб.: Наука и техника, 2016. - 544 c. Лафоре, Р. Объектно-ориентированное программирование в С++ / Р. Лафоре. - СПб.: Питер, 2019. - 928 c. Павловская, Т. С/С++.Процедурное и объектно-ориентированное программирование / Т. Павловская. - СПб.: Питер, 2018. - 496 c Хорев, П.Б. Объектно-ориентированное программирование / П.Б. Хорев. - М.: Academia, 2018. - 352 c. Г.С. Иванова Объектно-ориентированное программирование / Г.С. Иванова. - М.: Московский Государственный Технический Университет (МГТУ) имени Н.Э. Баумана, 2014. - 149 c. Залогова Л.А. ВЗАИМОДЕЙСТВИЕ ОБЪЕКТОВ В ОБЪЕКТНО-ОРИЕНТИРОВАННОМ ПРОГРАММИРОВАНИИ // Вестник Пермского университета. Серия: Математика. Механика. Информатика. 2016. №3 (34). URL: https://cyberleninka.ru/article/n/vzaimodeystvie-obektov-v-obektno-orientirovannom-programmirovanii (дата обращения: 14.05.2022) Кыштымов М. А., Уймин А. Г. Применение объектно-ориентированного программирования для разработки геоинформационных систем // Перспективы развития информационных технологий. 2012. №8. URL: https://cyberleninka.ru/article/n/primenenie-obektno-orientirovannogo-programmirovaniya-dlya-razrabotki-geoinformatsionnyh-sistem (дата обращения: 14.05.2022) ПРИЛОЖЕНИЯРис. №. Информация о враче (врачи отсутсвуют) Рис. №. Информация обо всех врачах (врачи отсутствуют) Рис. №. Выписка пациента (пациенты отсутствуют) Рис. №. Информация о пациенте (пациенты отсутствуют) Рис. №. Информация о выписанном пациенте (пациенты отсутствуют) Рис. №. Прикрепить врача к пациенту (отсутствуют врачи и пациенты) Рис. №. Показать список врачей у пациента (отсутствуют врачи и пациенты) Рис. №. Показать список пациентов у врача (отсутствуют врачи и пациенты) Рис. №. Добавление 2-го врача Рис. №. Добавление 3-го врача Рис. №. Добавление 2-го пациента Рис. №. Добавление 3-го пациента Рис. №. Информация о враче (Неверный идентификатор) Рис. №. Информация о пациенте (неверный идентификатор) Рис. №. Прикрепление врача с ID 1 к пациенту с ID 12 Рис. №. Прикрепление врача с ID 2 к пациенту с ID 11 Рис. №. Список врачей у пациента с ID 12 Рис. №. Список врачей у пациента с ID 13 Рис. №. Список пациентов у врача с ID 2 Рис. №. Список пациентов у врача с ID 3 Рис. №. Список пациентов у врача с ID 1 Рис. №. Информация о пациенте с ID 11 |