Учась на первом курсе института, в рамках одной из дисциплин мне был задан курсовой проект на С++ в стиле ООП с предметной областью отдела кадров. По сути маленькая БД из txt файлов и интерфейсом в консоли. Эта статья является пояснительной запиской к созданной мной программе.
ВВЕДЕНИЕ
В данном курсовом проекте необходимо разработать программное приложение на языке С++ в парадигме объектно-ориентированного программирования. Приложение должно частично автоматизировать работу сотрудников некоего вымышленного предприятия. В текущей курсовой работе предметной областью является «Отдел кадров».
Задачей данного курсового проекта является разработка базы данных для вымышленного предприятия. Так как в любом предприятии маленьком или большом существует HR отдел, то база данных облегчит работу для этого отдела.
Результатом курсового проектирования является реально функционирующая программа, решающая поставленную задачу. Целью проектирования является разработка программного продукта с заданным функциональным назначением, включающая весь процесс создания программы от описания поставленной задачи и ее анализа, ее реализация на языке программирования (редактирование, поиск и исправление ошибок) до появления отлаженного законченного программного продукта с детальным описанием.
Приложение должно позволять просматривать, создавать, редактировать и удалять данные. Интерфейс приложения будет консольным. Хранение данных производится в текстовых файлах. Организация хранения – один файл один объект.
ПОСТАНОВКА ЗАДАЧИ
Предметной областью данного курсового проекта является «Отдел кадров». Требуется создать базу данных, где каждый объект это один файл. В базе будет изначально существовать необходимое количество объектов для демонстрации полного функционала приложения.
Приложение, которое будет создано в рамках текущего курсового проекта, будет облегчать заполнение информацией базу данных. Отдел кадров постоянно работает с большим потоком новых людей. Ей не требуется постоянная и сложная база данных, так как при найме на работу берется известная информация и характеристики человека. Все люди проходящие собеседования не остаются долго в базе данных, так как либо их берут на работу по указанной вакансии, и они уходят в соответствующий отдел, либо им отказывают в найме на работу. Создаваемое приложение будет достаточно гибким и в нем будет предусмотрена возможность добавления новых значений и критериев для найма человека на работу.
База отдела кадров должна включать в себя кандидатов. Каждый кандидат имеет одинаковые поля для заполнения информацией, поэтому будет создан класс candidate, полями которого будут:
- фамилия, имя и отчество – например, Иванов Иван Иванович;
- дата рождения – в формате 12.05.1984;
- номер телефона – в виде +7(920)542-96-32;
- стаж в годах – например, 25;
- образование – для найма в данную организацию требуется люди с средним, средним проф. и высшим образованием;
- вакансия, на которую устраивается человек – на данный момент будут вакансии на следующие позиции: кладовщик, водитель, программист, инженер, менеджер по продажам.
Будет два основных метода класса:
- SetInfo – метод для заполнения полей класса.
- GetInfo– метод для вывода полей класса в консоль с требуемым оформлением.
Также будет две дружественных функции для перегрузки операторов ввода и вывода, что значительно облегчит и упростит получение и запись информации из файла и в файл.
В текущей курсовой работе не было необходимости применять один из основных принципов объектно-ориентированного программирования, а именно наследование.
На рисунке 1 приведена UML диаграмма класса.
В основе каждой базы данных идет возможность показать или вывести текущую информацию об объектах. Поэтому будет написана функция Showdata, которая будет открывать каждый файл и выводить информацию из него на консоль, для последующего прочтения и исследования.
Следующей важной задачей базы данных является способность добавить новые элементы в базу. Для решения этой задачи будет написана функция Adddata, которая получит возможность создавать новый файл и добавлять туда информацию от пользователя.
Так как существует добавление новых элементов, то должна существовать и возможность удаление объектов и их файлов из базы данных. Будет реализована функция Removedata, которая станет удалять выбранные элемент из базы данных, то есть его файл. Следовательно, чтобы не нарушить нумерацию следующих после удаленного элемента файлов, будет применено переименование последующих элементов.
Так как базы данных могут быть маленькими, например, 5 или 10 элементов, так и большими 100 и более. Чтобы ориентироваться в громадных базах данных существует возможности поиска элементов. Поэтому в данном курсовом проекте будет реализовано две функции поиска:
- Seekdatanumber– поиск и вывод информации об объекте с помощью его номера в списке файлов. Такой способ полезен, если персонал знает под каким номером находится искомый объект. Это самый быстрый способ поиска из двух реализованных.
- Seekdataname– поиск и вывод информации об объекте с помощью его полного ФИО. Такой способ полезен, если известно лишь имя искомого объекта, персоналу потребуется лишь ввести полное имя человека и приложение выведет всю хранящуюся о нем информацию. Это самый медленный из способов поиска, так как происходит сравнивание введенной строки и строк из файлов.
Важной способностью любой базы данных является возможность сортировки элементов. В данной курсовой работе будет создана функция Sortingdata, а также для более компактной и удобной записи и написания кода будет применена структура Sorting с полями:
- int course – для хранения индексов файлов;
- char symbol – для хранения первых букв фамилии.
Сама функция будет сортировать по первой букве фамилии объекты в базе данных по принципу от А до Я.
Вспомогательной функцией ко всем остальным будет функция преобразования числа в строку Path. Она необходима для того, чтобы, зная числовое значение файла трансформировать его в само название файла с расширением .txt.
Самый главной функций любого приложения на языке C++ является функция main. В ней будет реализован интерфейс для пользователя, то есть создано меню с выбором действий. Пользователь сможет воспользоваться всеми доступными функциями в неограниченном количестве. Таким образом приложение будет способно частично автоматизировать работу некоторого вымышленного предприятия в предметной области «Отдел кадров».
ПОШАГОВАЯ ДЕТАЛИЗАЦИЯ РЕШЕНИЯ
Чтобы лучше разобраться в работе приложения, а также облегчить решение поставленной задачи, требуется описать каждую функцию сначала в основном, а в дальнейшим детализировать ее с помощью упрощенных блок-схем.
В приложении будут включены несколько библиотек для комфортного написания программы:
- iostream – заголовочный файл с классами, функциями и переменными для организации ввода-вывода в языке программирования C++.
- string – класс с методами и переменными для организации работы со строками в языке программирования C++.
- locale – заголовочный файл стандартной библиотеки языка программирования С++, который используется для задач, связанных с локализацией.
- windows.h – является Windows-конкретный файл заголовков для языка C++ программирования, который содержит заявления для всех функций в Windows API, все общие макросы, которые используются программистами окон, и все типы данных, используемых различными функциями и подсистем
- fstream – заголовочный файл из стандартной библиотеки C++, включающий набор классов, методов и функций, которые предоставляют интерфейс для чтения/записи данных из/в файл.
Для начала стоит описать методы класса и ее дружественные функции. Первым методом является метод SetInfoтипа void. Эта функция не принимает в себя никаких параметров и ничего не возвращает. Она лишь считывает с консоли информацию и передает эти данные в поля класса, то есть заполняет объект. Используется команда getline, которая считывает введенные параметры и передает их в переменную buf типа string, которая в свою очередь отдает данные в поля. Также для лучшего понимая происходящего присутствуют комментарии для пользователя.
Вторым методом является функция GetInfoтипа void, она не принимает и не возвращает никакие значения. Эта функция реализует вывод данных из полей объекта на консоль с некоторыми комментариями для пользователя. Для этого применяется стандартная команда для C++ – команда cout.
Также для лучшего и более простого взаимодействия с объектов с файлами перегружается оператор ввода и оператор вывода. Это значительно облегчает запись объекта в файл, а также заполнение объекта данными из файла. Для этого создается две дружественные функции типа ostreamи istream соответственно. Какие данные получает каждая из функций уже было указано в диаграмме класса, а возвращают они переменные своего типа. Функция перегрузки оператора «>>» осуществляется с помощью команд getline, которая передает данные в поля объекта класса. Функция перегрузки оператора «<<» осуществляется с помощью самого оператора и выводит поля объекта класса.
Не существует большого смысла в оформлении блок –схем для методов и дружественных функций класса так как каждая из них производит однотипные действия.
Чтобы сократить время написание кода и его объем, следует автоматизировать трансформацию числовой информации в строковую, то есть тип int переделать в тип string. Эта трансформация упростит работу с файлами базы данных. Для этого и будет создана функция Path типа string. Она будет принимать в себя единственное значение типа int. Далее она преобразует полученное число в строку и вернет ее. На рисунке 2 приведена блок-схема функции Path.
Для лучшей организации приложения в отдельном файле quantity.txt записано число, которое обозначает какое количество объектов или файлов есть в базе данных на момент запуска приложения. С течением времени это число будет меняться в самой программе, а по завершении работы в приложении новое число будет вновь записано в этот файл.
Количество файлов будет передаваться в программе по ссылке во все функции и заключено в переменной size типа int. Часть кода, которая отвечает за считывание и перезаписывание этой переменной, находится в главной функции main и блок-схема этого «куска» будет описана позже.
Функция, которая выводит данные всех файлов в консоль имеет тип void и называется Showdata. Она принимает в себя значение переменной size. С помощью цикла с параметром будет открываться каждый файл и все данные будут записываться в динамический массив объектов класса размером size, а затем выводится на консоль с помощью метода класса. На рисунке 3 приведена блок-схема функции Showdata.
Функция, которая будет добавлять новые элементы в базу данных называется Adddata и имеет тип void. Она принимает значение переменной size и ничего не возвращает. Пользователь вводит сколько новых файлов он хочет создать. Это значение передается в динамический массив класса и задает его размер, а также в процессе добавляется к переменной size. Создаются с помощью цикла новые фалы и туда записываются данные с помощью метода SetInfo. На рисунке 4 и 5 приведена блок-схема функции Adddata.
Функция для удаления одного выбранного элемента называется Removedata типа void. Она принимает в себя переменную size и ничего не возвращает. Пользователь вводит число, которое должно соответствовать номеру того файла, который он хочет удалить. Затем этот файл удаляется, а все идущие за ним файлы, переименовываются на одно значение меньше. Например, при удалении 4 файла, 5 и 6 файлы получат название 4 и 5 соответственно, при условии, что в базе было изначально 6 файлов. Аналогично и для любого другого количества объектов в базе. Переменная size уменьшается на один, так как был удален один файл. На рисунке 6 и 7 приведены блок-схемы этой функции.
Первая функция поиска, которая ищет по номеру файла объект называется Seekdatanumber, ее тип void, она ничего не возвращает, а принимает size. Пользователь вводит номер файла, и программа выводит на консоль все данные хранящиеся в этом файле. На рисунке 8 продемонстрирована блок-схема функции Seekdatanumber.
Вторая функция поиска организована по сравнению введенным пользователь ФИО и ФИО, хранящимся в файлах. Функция называется Seekdataname, она ничего не возвращает, так как ее тип void, а принимает переменную size. Поочередно открывается каждый файл и сравнивается строка пользователя и первая строка файла, при совпадении информация из файла выводится в консоль. На рисунках 9 и 10 показаны блок-схемы этой функции.
Функция сортировки основывается на структуре Sorting, в которой находится два поля. Первое типа int, оно хранит число, отвечающее за имя файла. Второе типа char с помощью которого считывается первая буква фамилии и происходит непосредственно сортировка базы. Функция сортировки называется Sortingdata, она типа void, ничего не возвращает, а принимает size. Сама функция построена на нескольких циклах. Первый считывает во всех файлах первую букву и заполняет массив структур. Второй сортирует этот массив. Третий заполняет массив объектов класса данными из файла. И четвертый правильно перезаписывает все отсортированные данные в файл. На рисунках 11-14 продемонстрированы блок-схемы этой функции.
Главная функция main имеет тип int и возвращает 0, но ничего не принимает. В ней организовано меню и интерфейс взаимодействия с пользователем. Пользователь выбирает одно из 7 действий вводят числа от 0 до 6, где 0 – это выход из программы. Само меню зациклено, чтобы программа работала постоянная, пока пользователь не примет решение закончить работу. Также в начале работы функции программа получает значение size, затем происходит работа программы с помощью переменной выбора и команды switch, а затем измененная переменная size перезаписывается в свой файл. На рисунках 15-17 представлены блок-схемы функции main.
В итоге все программа разбивается на один класс с двумя методами и двумя дружественными функциями перегрузки, на восемь функция, включая главную, одну структуру с двумя переменными. Методами класса является функции, которые заполняют объект или же печатают данные объекта. Перегруженные операторы ввода и вывода упрощают работу с файлом. Еще одна функция облегчает преобразование строки в число, то есть создание название файлов. Следующая функция выводит текущую базу данных. Реализованы функции добавления и удаления объектов и их файлов, а также поиска по двум разным принципам. Последняя функция сортирует файлы ориентируясь на первую букву в фамилии объекта. Главная функция объединяет это в все в себе, реализует передачу параметров в побочные функции. Регулируется поведение программы выборами пользователя.
ТЕСТИРОВАНИЕ ПРИЛОЖЕНИЯ
Чтобы уменьшить количество скриншотов, иногда будет производиться сразу несколько действий, и только затем рисунок будет продемонстрирован.
На рисунке 18 показано, что находится в файле quantity.txt.
На рисунке 19 изображено как данные хранятся в файле каждого объекта базы данных.
На рисунке 20 приведено меню.
На рисунке 21 продемонстрированы текущие элементы базы данных.
Далее удалим элемент 2, но перед этим добавим новый объект, который имеет следующие данные:
- Иркутан Станислав Борисович
- 04.05.1984
- +7(928)546-87-21
- 15
- среднее проф.
- водитель
И затем вновь выведем полученную базу данных
На рисунках 23 и 24 показано результат работ функций поиска по номеру и ФИО соответственно.
Результат сортировки базы данных по первой букве в фамилии представлен на рисунке 25.
Заключительный рисунок 26 демонстрирует завершение работы приложения.
Приложение работает исправно. Работа программы не ограничена объемом объектов в количестве 4. Такое число выбрано специально, чтобы было максимально удобно и просто продемонстрировать работу приложения.
ЗАКЛЮЧЕНИЕ
Таким образом результатом курсового проекта является разработанное программное приложение на языке С++ в парадигме объектно-ориентированного программирования. Приложение способно частично автоматизировать работу сотрудников отдел кадров некоторого предприятия.
Такое приложение способно облегчить работу HRотдела, который присутствует в любой компании, будь она большая или маленькая. Программа способна хранить данные об элементах базы данных в отдельных txt файлах, а также обрабатывать их. А именно показывать содержимое базы, добавлять и удалять объекты. Находить двумя путями необходимый объект, сортировать существующую базу данных по первой букве фамилии. Все эти действия способны облегчить, упростить и ускорить работу отдела кадров, поэтому они были реализованы в этой программе.
Вся задача разработки приложения была разделена на маленькие кусочки, что позволило более точно и быстро найти и реализовать решение. Так как приложение создано в парадигме объектно-ориентированного программирования, то был разработан класс и его методы, что значительно облегчило создание и написание самого кода приложения. На приведенных рисунках была показана корректная работа приложения