Отчет по программированию. Отчет по курсовой за 2 семестр. База данных студентов
Скачать 131.92 Kb.
|
МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра автоматики и процессов управления ОТЧЕТ о курсовой работе по дисциплине «Программирование» Тема: База данных студентов
Санкт-Петербург 2016 Оглавление1.Задание курсовой работы 3 2.Структура программы 4 3.Сущность данных 5 4.Способ реализации с файловым вводом/выводом 9 5.Блок-схемы построения отчетов 12 6.Интерфейс программы 13 7.Особенности 13 Задание курсовой работыНеобходимо создать на языке С++ без использования vector базу данных для работы с потоком студентов. Для работы с потоком должно быть реализовано: Вывод среднего балла всего потока; Вывод студентов со средним баллом выше, чем у потока; Вывод отличников. Три данных отчета нужно сохранить в файле в виде текста с указанием в имени файла даты, времени и вида отчета. Работа с группами: Создание; Вывод; Удаление; Поиск; Вывод отличников; Вывод двоечников; Вывод среднего балла группы. Работа со студентами: Вывод студента; Добавление; Удаление. Также необходимо всю базу данных сохранять в текстовый и бинарный файлы, а также считывать ее из этих же файлов. Информация в текстовом файле должна быть представлена в таком виде: /Количество групп/ { /Первая группа/ /Количество студентов в этой группе/ /*Далее идет список студентов, которые представлены по такой схеме*/ { /Фамилия Имя/ /Номер студенческого билет/ /Дата рождения/ /Телефон/ /Оценки/ <…> } <…> } Структура программыПрограмма состоит из заголовочных файлов (.h) и файлов исходного кода (.cpp). Список всех файлов (всего из 13): Database.cpp //Определение функций для работы с БД Database.h //Содержит прототипы функций, описанных в Database.cpp FeedFunc.cpp //Определение функций для работы с потоком FeedFunc.h //Прототипы функций GroupFunc.cpp //Определение функций для работы с группами GroupFunc.h lib.h //Содержит все необходимы для программы библиотеки, а также заголовочные файлы; объявление глобальных переменных StudentFunc.cpp //Функции для работы со студентами StudentFunc.h main.cpp //Инициализация глобальных переменных, вход в программу через функцию FirstMenu() menu.cpp //Функции для работы с меню menu.h structs.h //Содержит описание 2 структур (студент, группа) Данное разбиение выбрано для удобства работы с объектами в целом, т.е. со студентами, группами, потоком, самой базой данных, меню (сложная структура, поэтому лучше было переместить в отдельные файлы). Сущность данныхЗдесь приведены все функции, используемые в программе: Database.h: void SaveDB(); //Сохраняет всю базу данных в бинарном и текстовом файле void LoadDBMenu(); //Выводит список файлов с расширением .txt и .bin, позволяет выбрать загружаемый файл void DBMenu(); //Меню для управления загрузкой/сохранением базы данных FeedFunc.h: void ShowAllGroups(); //Выводит список всех групп с количеством студентов. Показывает общее число студентов double AverageGrade(); //Находит среднее значение потока void ExcellentPupil(); //Выводит отличников потока GroupFunc.h: Group* SearchGroup(); //Поиск группы по номеру, возвращает указатель на эту группу Group* CreateGroupAuto(int); //Создание группы в результате считывания файла, т.е. от пользователя не требуется никакого ввода в консоль void CreateGroup(); //Создает группу при условии, что она еще не создана void PrintGroup(); //Выводит в консоль всю группу, проверяет на существование и заполненность void DeleteGroup(); //Удаляет группу double AverageGradeOfGroup(); //Возвращает среднее арифметическое группы StudentFunc.h: bool Grades(Student*, int); //Проверяет, что у студента все оценки равны определенному значению (2/5) bool AverageGrade(Student*, double); //Проверяет, что у студента среднее арифметическое оценок больше какого-то числа Student* CreateStudentAuto(Group*&, std::istream&); //Аналогично с CreateGroupAuto void AddStudent(); //Добавляет студента в группу, проверяя при этом студента по номеру студенческого билета void DeleteStudent(); //Удаляет студента void PrintStudent(); //Выводит в консоль все поля, кроме ср. ариф., определенного студента void Losers(); //Выводит двоечников группы void ExcellentPupilOfGroup(); //Выводит отличников группы void HigherThanTheAverageGrade(); //Выводит студентов, чей средний балл выше среднего балла потока menu.h: int Point(); //Отвечает за перемещение стрелки меню void FirstMenu(); //Отвечает за первый уровень меню void SecondMenu(); //Второй уровень меню void ListOfGroups(); //Выводи список существующих групп для выбора их в меню void ListOfStudents(Group*); //Аналогично с ListOfGroups, только для студентов int MenuGroup(); //Обрабатывает перемещение по списку групп Group* SearchGroupAuto(); //Возвращает указатель на группу после нажатия пользователем Enter, когда стрелка указывала на одну из групп int MenuStudent(Group*); //Аналогично с MenuGroup Student* SearchStudentAuto(Group*); //Аналогично с SearchGroupAuto Также опишем структуры: structs.h: struct Student //Структура студента { std::string name; //Имя студента int number; //Номер студенческого билета std::string dateofbirth; //Дата рождения std::string phone; //Номер телефона int grade[AMOUNTofGRADES]; //Массив оценок Student* next; //Указатель на следующего по списку студента Student* prev; //На предыдущего double averg = 0; //Среднее арифметическое оценок }; struct Group //Структура группы { int number; //Номер группы int count = 0; //Количество студентов группы Group(int count) //Конструктор { number = count; averg = 0; stud = NULL; last = NULL; } Group* next; //Указатель на следующую группу в списке Group* prev; //На предыдущую Student* stud; //Указатель на начало списка студентов Student* last; //На конец double averg; //Среднее арифметическое группы }; Lib.h: #define AMOUNTofGRADES 7 #include #include #include #include #include #include #include #include #include "structs.h" #include "StudentFunc.h" #include "FeedFunc.h" #include "GroupFunc.h" #include "menu.h" #include "Database.h" extern char point[]; //В main.cpp будет присвоено значение ‘->’ extern int amount, N, fmenu, smenu, stop, gmenu, stmenu, dbmenu, filemenu; //Отвечают за количество групп, номер группы, номера пунктов меню, а также за ограничение движения стрелки в консоли (stop) extern COORD m; //Положение меню extern COORD c; //Положение стрелки extern HANDLE h; //Дескриптор потока вывода extern Group* start; //Начало всего потока extern Group* finish; //Конец потока extern Group* fordel; //Указатель на группу, где необходимо удалить студента Способ реализации с файловым вводом/выводомПодключены библиотеки fstream и windows.h, ctime. Первая используется для создания переменных типа ofstream (вывод в файл; если файла не существует, то он создается) и ifstream (считывание с файла). Отчеты сохраняются только в текстовый файл (.txt), база данных еще и в бинарный (.bin). Файлы имеют имена следующего вида: <Тип отчета> <Дата> <Время>.<Расширение> Тип может принимать значения: DB – База данных; AG – Среднее значение потока; EP – Отличники потока; HTTAG – Студенты, у которых средний балл выше среднего балла потока. Например, DB May 6 2016 12:34:00.txt Windows.h позволяет находить в какой-либо папке файлы с именами, подходящие критерию, который необходим разработчику. Например: file = FindFirstFile("./*.txt", &f); //Находит в каталоге программы первый файл с расширением .txt if (file != INVALID_HANDLE_VALUE) //Если такой файл найден, то { do { std::cout << " " << f.cFileName << std::endl; //Выводим его имя в консоль } while (FindNextFile(file, &f)); //Ищем следующий файл, удовлетворяющий условию } Текстовый вывод на примере создания отчета о среднем значении потока: std::string type, date, time; //Используются для имени файла type = "AG "; date = __DATE__; date += " "; time = __TIME__; type += date; type += time; std::string fdate = type + ".txt"; std::ofstream fout(fdate.c_str()); fout << "The average grade of feed: "; fout << "\n" << aver; //Вывод значения в файл fout.close(); //Закрытие файла Бинарный вывод: std::string bdate = type + ".bin"; //Имя файла std::ofstream bout(bdate.c_str(), std::ios::binary | std::ios::out); //Открытие/создание для бинарного ввода bout.write((char*)p, sizeof(Group)); //Пример записи целой структуры bout.write((char*)&t->name, sizeof(t->name)); //Запись поля структуры Ввод выполняет аналогично, только вместо fout<< -> fin >>, bout.write(…) -> bin.read(…), где fout/fin, bout/bin имена переменных. Блок-схемы построения отчетовВсе три отчета строятся по похоже алгоритму, только в функция нахождения среднего балла потока не ссылается на другие функции. Блок-схема нахождения среднего арифметического балла: Интерфейс программыИнтерфейс программы выполнен в стиле «user friendly», т.е. при работе с программой пользователь знает с чем работает. Перемещение в меню осуществляется с помощью стрелок на клавиатуре, выбор пункта – нажатием Enter. Ввода пунктов меню от пользователя не требуется. Максимальный уровень меню 4. Основное меню состоит из 5 пунктов: F eed – для работы с потоком; Group – для работы с группами; Student – для работы со студентами; DataBase – для работы с базой данных в целом; Exit – выход из программы. Контроль ввода Перемещение по списку групп Добавление первой группы в БД Еще примеры работы программы: ОсобенностиПроверка оценок на принадлежность к диапазону от 2 до 5; Проверка введенных значений на принадлежность к целым числам, если происходит ввод для целочисленной переменной; Проверка при добавлении студента на существование студента с таким же номером студенческого билета; Сортировка студентов и групп по возрастанию при добавлении; Перемещение в меню с помощью стрелок, выбор пункта меню нажатием Enter; Поиск и вывод файлов в виде списка для загрузки БД; Вывод списка групп и списка студентов также для выбора с помощью стрелок. |