Разработка программы подбора туристической путевки
Конструирование и разработка структуры программы. Выбор способа организации данных. Разработка перечня пользовательских функций программы. Разработка алгоритмов работы программы. Алгоритм функции main, аccounts, editFlight. Описание работы программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 15.04.2019 |
Размер файла | 1,5 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на Allbest.ru
Требования к программе
Разработка программы подбора туристической путевки.
Туристическая компания содержит сведения о предлагаемых путевках: тип путевки (отдых, экскурсионный тур, лечение, шопинг, круиз), страна пребывания, вид транспорта, количество дней, питание (завтраки/все включено), стоимость.
Индивидуальное задание: вывести все путевки требуемого типа (вводится с клавиатуры) стоимостью менее x в порядке убывания стоимости.
Общее для всех вариантов задание: реализовать авторизацию для входа в систему (без регистрации!), функционал администратора и функционал пользователя, как минимум три вида поиска, как минимум три вида сортировки (см. более подробно - в общих требованиях к курсовой работе).
Исходные требования к курсовой работе
разработка программа алгоритм
Язык программирования С++.
Среда разработки Microsoft Visual Studio версии 2010 и выше.
Вид приложения - консольное.
Парадигма программирования - объектно-ориентированная.
Способ организации данных - поля соответствующих классов.
Способ хранения данных - файл типа txt.
Каждая логически завершенная задача программы должна быть реализована в виде метода.
Функциональные требования к курсовой работе
Первым этапом работы программы является авторизация - предоставление прав. В рамках данного этапа необходимо считать данные учетной записи пользователей следующего вида:
login;
password;
role (данное поле служит для разделения в правах администраторов и пользователей).
После ввода пользователем своих персональных данных (логина и пароля) и сверки с информацией, находящейся в файле пользователя, необходимо предусмотреть возможность входа в качестве администратора (в этом случае, например, role = admin) или в качестве пользователя (в этом случае, например, role = users).
Если база данных с учетными записями пользователей не существует, то необходимо её программно создать и записать учетные данные администратора.
Регистрация новых пользователей в системе предусмотрена. Данную задачу выполняет администратор в режиме работы с учетными записями пользователей.
Вторым этапом работы программы является собственно работа с данными, которая становится доступной только после прохождения авторизации. Данные хранятся в фале.
Для работы с данными должны быть предусмотрены два функциональных модуля: модуль администратора и модуль пользователя.
Модуль администратора включает следующие подмодули (с указанием функциональных возможностей) :
Управление аккаунтами:
Просмотр всех аккаунтов;
Добавление нового аккаунта;
Редактирование данных аккаунта;
Удаление аккаунта;
Назад.
Работа с файлом данных:
Создание файла данных;
Открытие файла данных;
Удаление файла данных;
Назад.
Работа с данными:
Просмотр всех путевок;
Удаление путевки;
Добавление путевки;
Редактирование информации путевки;
Поиск путевки:
Тип путевки;
Страна пребывания;
Стоимость.
Сортировка:
Тип путевки;
Страна пребывания;
Стоимость.
Поиск рейсов с указанным типом путевки;
Назад.
Модуль пользователя включает подмодуль работы с данными со следующими функциональными возможностями:
Просмотреть все расписание;
Покатать все рейсы с прибытием не позднее чем за 12 часов до указанного времени;
Поиск:
Номер рейса;
Тип автобуса;
Пункт назначения.
Сортировк:
Номер рейса;
Тип автобуса;
Пункт назначения.
Для реализации перечисленных модулей/подмодулей необходимо создавать меню с соответствующими пунктами.
Предусмотреть:
обработку исключительных ситуаций:
имя пользователя или пароль не верны;
запись с указанным идентификатором не найдена;
пользователь с таким именем уже существует;
ведённые данные не соответствуют формату поля;
возможность возврата назад (навигация) ;
запрос на подтверждение удаления вида «Вы действительно хотите удалить файл (запись)?»;
вывод сообщения об успешности создания/редактирования/удаления файла/записи.
Требования к программной реализации
Все переменные и константы должны иметь осмысленные имена в рамках тематики варианта к курсовой работе.
Имена функций должны быть осмысленными и строится по принципу «глагол + существительное». Если функция выполняет какую-либо проверку и возвращает результат типа bool, то ее название должно начинаться с глагола is (например, isFileExist, isUnicLogin).
Код не должен содержать неименованных числовых констант (так называемых «магических» чисел), неименованных строковых констант (например, имен файлов и др.). Подобного рода информацию следует выносить в глобальные переменные с атрибутом const. По правилам хорошего стиля программирования тексты всех информационных сообщений, выводимых пользователю в ответ на его действия, также оформляются как константы.
Код необходимо комментировать (как минимум в части нетривиальной логики).
Код не должен дублироваться - для этого существуют методы и функции.
Одна функция решает только одну задачу (например, не допускается в одной функции считывать данные из файла и выводить их на консоль - это две разные функции). При этом внутри функции возможен вызов других функций.
Следует избегать длинных функций и глубокой вложенности: текст функции должен умещаться на один экран, а вложенность блоков и операторов должна быть не более трёх.
Конструирование программы
Реализация программы будет осуществляться на языке С++ в IDE-среде Microsoft Visual Studio 2017. Программа будет компилироваться и использоваться в операционных системах семейства Microsoft Windows версии 7 и выше.
Разработка структуры программы
Согласно требованиям к программе, необходимо наличие исполняемой программы, которая работает с базой пользователей программы и базой путевок. Следовательно, с точки зрения верхней архитектуры программы, можно выделить два основных модуля: модуль работы с базой пользователей и модуль работы с базой путевок. На рисунке 1 показаны основные модули программы.
Рисунок 1 - Основные модули программы
Функция аутентификации пользователя заключается в проверке существования данных пользователей введённого логина и соответствующего ему пароля. Авторизация пользователя подразумевает получение его роли из файла данных и предоставление ему соответствующих привилегий. Задачи аутентификации пользователя и запрос его роли можно реализовать в отдельном модуле либо непосредственно в модуле управления данными пользователей.
После успешной авторизации пользователя создаётся пользовательская сессия с соответствующими привилегиями, согласно роли пользователя. Сессия администратора имеет полный доступ к модулям управления обеими базами данных, а сессия пользователя, в свою очередь, имеет доступ только к модулю управления базой данных пациентов в режиме «только для чтения».
Программа подразумевает наличие консольного пользовательского интерфейса. Для организации связи слоёв интерфейса пользователя, логики и доменной модели выбран паттерн «MVC» (Model-View-Controller). В качестве модели (Model) здесь выступают модули управления данными.
Связь сессий пользователей с модулями управления данными будут осуществляться через контроллеры (Controller). Так, для сессии администратора требуется доступ к контроллеру базы пользователей и к контроллеру базы справочной автовокзала, а сессии пользователя - только к контроллеру базы справочной автовокзала.
На рисунке 2 показаны взаимосвязи основных классов программы.
Рисунок 2 - UML-диаграмма основных классов
Выбор способа организации данных
Пароль должен храниться в памяти максимально короткое время, необходимое для вычисления секретного ключа. Потому класс не содержит поля для хранения пароля. Секретный ключ, формируемый на основе пароля, хранится в базе данных и необходим только для проверки корректности вводимого пользователем пароля при прохождении процедуры аутентификации. Следовательно, хранение секретного ключа также не требуется в полях класса Accounts.
Для представления в программе объекта Рейс вводится класс Flights, содержащий: номер рейса, тип автобуса, пункт назначения, время отправления, время прибытия в конечный пункт.
class Flights
{
public:
Flights () ;
~Flights () ;
struct flight {
string typeTour;
string hostCountry;
string typeTransport;
int amountDays;
string food;
int cost;
};
}
В качестве БД был выбран текстовый файл.
Программа обслуживает данные, хранимые в двух базах данных: базе данных пользователей и базе данных автовокзала. Эти базы имеют различные схемы данных.
Схема базы данных пользователей
Для базы данных пользователей требуется хранить имя пользователя (login), пароль (password) и прот пользователя (role). Схема базы данных пользователей показана на рисунке 3.
login |
password |
role |
|
root |
root |
admin |
Рисунок 3- Схема базы данных пользователей
Схема базы путевок
База данных путевок, согласно требованиям, должна содержать следующую информацию:
Тип путевки;
Страна пребывания;
Вид транспорта;
Количество дней пребывания;
Питания;
Стоимость.
Схема базы данных показана на рисунке 4.
typeTour |
hostCountry |
typeTransport |
amountDays |
food |
const |
|
Разработка перечня пользовательских функций программы
Ниже приведено описание публичных интерфейсов всех основных классов.
class Flights
{
public:
Flights () ;
~Flights () ;
struct flight {
string typeTour;
string hostCountry;
string typeTransport;
int amountDays;
string food;
int cost;
};
}
class Accounts
{
public:
Accounts () ;
~Accounts () ;
struct account {
string login;
string password;
string role;
};
}
Разработка алгоритмов работы программы
Алгоритм функции main
Функция main является точкой входа в программу, вызывает основные функции инициализации, создаёт объект класс Application и передаёт ему управление. На рисунке 5 показана блок-схема алгоритма функции main.
Рисунок 5 - Блок-схема алгоритма функции main
Алгоритм функции Accounts: : accounts
Метод accounts класса Accounts проверяет наличие БД пользователей и создает новую БД вместе с 1 пользователем при ее отсутствии (рисунок 6).
Рисунок 6 - Блок-схема алгоритма метода Application: : StartAndWaitExit
Алгоритм функции Flights: : editTour
Редактирование выбранной записи путевки. Из предложенного списка путевок выбирается конкретная запись с последующим изменением ее значений.
Алгоритм метода editTour класса Flights показан на рисунке 7.
Рисунок 7 - Блок-схема алгоритма метода editFlight
Описание работы программы
При запуске программа пытается найти и открыть базу данных пользователей. Если база не найдена, то программа предлагает создать её. При создании новой базы необходимо сразу добавить в неё учётную запись.
Поиск и создание файла базы данных пользователей производится в текущей директории программы. Имя файла прописано в коде программы: «accounts. txt».
Если база данных успешно открыта, то программа проверяет в ней наличие учётных записей администратора и, если их нет, предлагает добавить (рисунок 8).
Рисунок 8 - Создание базы данных пользователей при запуске программы
Авторизация
После успешного открытия базы данных пользователей (только для чтения) программа запрашивает учётные записи пользователя (логин и пароль) для его авторизации до тех пор, пока авторизация не будет успешно пройдена, либо пока пользователь не решит отменить процедуру входа: в этом случае программа завершит работу.
Для проверки корректности ввода логина и пароля программа обращается напрямую к текстовому файлу пользователей, который инкапсулирует алгоритм обработки и проверки пароля и его соответствия имени пользователя.
После успешной аутентификации пользователя программа получает из текстового файла пользователей роль аутентифицированного пользователя и авторизует его, создав соответствующую роли сессию: сессию администратора, которой будет соответствовать в дальнейшем описании модуль администратора либо сессию пользователя, которой будет соответствовать модуль пользователя.
Если пользователь авторизован с правами администратора, то программа выведет соответствующее сообщение (рисунок 9).
Рисунок 9 - Авторизация пользователя (администратора)
Модуль администратора
Далее программа запускает диалоговое взаимодействие с пользователем путём отображения пронумерованных пунктов меню и запросом у пользователя ввода желаемого номера. На рисунке 10 показано главное меню модуля администратора.
Рисунок 10 - Главное меню модуля администратора
На рисунке 11 показано меню «Управление аккаунтами».
Рисунок 11 - Меню «Управление аккаунтами»
На рисунке 12 показано меню «Работа с файлом данных».
Рисунок 12 - Меню «Работа с файлом данных»
На рисунке 13 показано меню «Работа с данными маршрутов».
Рисунок 13 - Меню «Работа с данными маршрутов»
На рисунке 14 показано меню «Поиск маршрута».
Рисунок 14 - Меню «Поиск маршрута»
На рисунке 15 показано меню «Сортировка».
Рисунок 15 - Меню «Сортировка»
На рисунке 16 показан пример вывода всех учётных записей пользователей.
Рисунок 16 - Просмотр всех учётных записей пользователей
На рисунке 17 показан пример добавления новой учётной записи пользователя.
Рисунок 17 - Добавление новой учётной записи пользователя
На рисунке 18 показан пример изменения существующей учётной записи пользователя.
Рисунок 18 - Изменение учётной записи пользователя
На рисунке 19 показан пример удаления существующей учётной записи пользователя.
Рисунок 19 - Удаление учётной записи пользователя
На рисунке 20 показан пример создания нового файла данных с маршрутами. Файл автоматически становится активным.
Рисунок 20 - Создание файла данных
На рисунке 21 показан пример открытия файла данных с маршрутами.
Рисунок 21 - Открытие файла данных.
На рисунке 22 показан пример удаления существующего файла данных с маршрутами.
Рисунок 22 - Удаление файла данных маршрутов.
На рисунке 23 показан пример добавления новой записи об маршруте.
Рисунок 23 - Добавление маршрута
На рисунке 24 показан пример вывода всех маршрутов
Рисунок 24 - Просмотр всех маршрутов
На рисунке 25 показан пример изменения существующей записи маршрута.
Рисунок 25 - Изменение записи маршрута
На рисунке 26 показан пример удаления существующей записи путевки.
Рисунок 26 - Удаление записи
На рисунке 27 показан пример вывода списка маршрутов на которых можно прибыть в пункт назначения за 12 часов до указанного времени.
Рисунок 27 - Показ маршрутов для прибытия за 12 часов до указанного времени
На рисунке 28 показан пример поиска помаршрутов по номеру рейса. Программа выполняет поиск вхождения введённого значения с учётом регистра.
Рисунок 28 - Поиск маршрута по номеру рейса
На рисунке 29 показан пример поиска маршрута по типу автобуса. Программа выполняет поиск введённого значения с учётом регистра.
Рисунок 29 - Поиск маршрута по типу автобуса
На рисунке 30 показан пример поиска маршрута по пункту назначения. Программа выполняет поиск введённого значения с учётом регистра.
Рисунок 30 - Поиск маршрута по пункту назначения
На рисунке 31 показан пример вывода маршрутов, отсортированных по номеру рейса в порядке возрастания.
Рисунок 31 - Сортировка маршрутов по номеру рейса
На рисунке 32 показан пример вывода маршрутов, отсортированных по типу автобуса в порядке возрастания.
Рисунок 32 - Сортировка маршрутов по типу автобуса
На рисунке 33 показан пример вывода маршрутов, отсортированных по пункту назначения в порядке возрастания.
Рисунок 33 - Сортировка маршрутов по пункту назначения
Модуль пользователя
Если пользователь авторизован с правами пользователя, то программа выведет соответствующее сообщение (рисунок 34).
Рисунок 34 - Авторизация пользователя (пользователь)
Программа запускает диалоговое взаимодействие с пользователем путём отображения пронумерованных пунктов меню и запросом у пользователя ввода желаемого номера (рисунок 35).
Рисунок 35 - Главное меню модуля пользователя
Снимки экрана для всех операций в модуле пользователя совпадают со снимками экрана соответствующих операций в модуле администратора.
Исключительные ситуации
Обработка исключительных ситуаций, как правило, занимает существенную часть кода программы. Это неизбежно, потому что программа без обработки ошибок и пограничных ситуаций выглядит для пользователя некачественной и может приводить к множеству негативных последствий: повреждению данных, неверной трактовке результатов работы программы, нагрузкой на службу поддержки или разработчика. В связи с этим, в программу встроено достаточно много проверок данных и результатов выполнения функций, обработок программных исключений, сопровождающихся уведомлением пользователя о проблеме и, при возможности, логичной реакцией на ситуацию либо прерыванием работы программы, если программа не смогла обработать исключительную ситуацию.
Первая, простейшая исключительная ситуация: введён неверный логин пользователя либо пароль. Программа сообщает об этом пользователю и спрашивает у пользователя, желает ли он повторить ввод данных (рисунок 36).
Рисунок 36 - Имя пользователя или пароль не верны
Введён верный логин, но неверный пароль. Программа сообщает об этом пользователю и спрашивает у пользователя, желает ли он повторить ввод данных (рисунок 37).
Рисунок 37 - Не верный пароль
При попытке создания новой учётной записи с именем, которое уже существует, программа выведет соответствующее сообщение об ошибке (рисунок 38).
Рисунок 38 - Попытка создания учётной записи пользователя с уже существующим именем
При работе с поиском по маршрутам при вводе информации которая не существует, программа выведет соответствующее сообщение об ошибке (рисунок 39).
Рисунок 39 - Поиск не дал результатов
Приложение А (обязательное)
Листинг кода с комментариями
Класс FlightsBus
#include «stdafx. h»
#include «Accounts. h»
#include «Flights. h»
#include <string>
using namespace std;
void main ()
{
string role = «false»;
string login, password;
setlocale (LC_CTYPE, «Russian») ;
Accounts accs;
Flights flights;
accs. accounts () ;
cout << «\tАВТОРИЗАЦИЯ\n»;
while (role == «false») {
cout << «Введите логин: «; cin >> login;
cout << «Введите пароль: «; cin >> password;
role = accs. auth (login, password) ;
}
if (role == «admin») {
int id;
cout << «\nВы авторизовались в качестве администратора. « << endl;
while (true) {
cout << «\n\tМЕНЮ АДМИНИСТРАТОРА» <<
«\n[1] Управление аккаунтами» <<
«\n[2] Работа с файлом данных» <<
«\n[3] Работа с данными\n»;
id = flights. checkint (3, «\nВведите номер операции: «) ;
switch (id)
{
case 1: accs. operation () ; break;
case 2:
flights. checkFile () ;
flights. operationFile () ; break;
case 3:
flights. checkFile () ;
flights. operationData () ; break;
default: break;
}
}
}
if (role == «users») {
int id;
cout << «Вы авторизовались в качестве пользователя» << endl;
flights. checkFile () ;
while (true) {
cout <<
«\n\tМЕНЮ ПОЛЬЗОВАТЕЛЯ» <<
«\n[1] Просмотреть все путевки» <<
«\n[2] Показать рейсы с указанным типом путевки» <<
«\n[3] Поиск» <<
«\n[4] Сортировка\n»;
id = flights. checkint (4, «\nВведите номер операции: «) ;
switch (id)
{
case 1: flights. getAllFlights () ; break;
case 2: flights. task () ; break;
case 3: flights. findFlight () ; break;
case 4: flights. sortingFlight () ; break;
default: break;
}
}
}
cin. get () ;
}
Класс Flights
#pragma once
#include «stdafx. h»
#include <windows. h>
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <vector>
#include <iomanip>
#include <algorithm>
using namespace std;
class Flights
{
public:
Flights () ;
~Flights () ;
struct flight {
string typeTour;
string hostCountry;
string typeTransport;
int amountDays;
string food;
int cost;
};
int operationData () {
string idd;
int id;
while (true) {
std: : cout <<
«\n\tРАБОТА С ДАННЫМИ МАРШРУТОВ» <<
«\n[1] Просмотр всех путевок» <<
«\n[2] Удаление путевки» <<
«\n[3] Добавление путевки» <<
«\n[4] Редактирование информации путевки» <<
«\n[5] Поиск путевки» <<
«\n[6] Сортировка» <<
«\n[7] Поиск рейсов с указанным типом путевки» <<
«\n[8] Назад\n»;
id = checkint (8, «\nВведите номер операции: «) ;
switch (id) {
case 1: getAllTours () ; break;
case 2: dellTours () ; break;
case 3: addTours () ; break;
case 4: editTour () ; break;
case 5: findTours () ; break;
case 6: sortingTour () ; break;
case 7: task () ; break;
case 8: return 0; break;
default:
break;
}
}
}
int operationFile () {
int id;
string idd;
while (true) {
std: : cout << «\n----------------» <<
«\nРабота с файлом данных» <<
«\n----------------» <<
«\n[1] Создание файла данных» <<
«\n[2] Открытие файла данных» <<
«\n[3] Удаление файла данных» <<
«\n[4] Назад\n»;
id = checkint (4, «\nВведите номер операции: «) ;
switch (id) {
case 1: createFile () ; break;
case 2: system («Tours. txt») ; break;
case 3: dell_file () ; break;
case 4: return 0; break;
default:
break;
}
}
}
int checkFile () {
std: : ifstream file («Tours. txt») ;
if (file. is_open ()) return 0;
else {
cout << «Файл с данными путевок отсутствует. «;
createFile () ;
}
return 0;
}
int createFile () {
vector<flight> fli;
SetConsoleCP (1251) ;
SetConsoleOutputCP (1251) ;
ofstream file («Tours. txt») ;
file. close () ;
std: : cout << «Список путевок успешно создан!»;
return 0;
}
int dell_file () {
remove («Tours. txt») == 0? cout << «\nФайл успешно удален\n»: cout << «\nПри удалении возникла ошибка. \n»;
return 0;
}
// Вывод информации о путевке по типу и сортировка по убыванию
int task () {
SetConsoleCP (1251) ;
SetConsoleOutputCP (1251) ;
int i;
string str;
std: : cout << «\nВведите тип путевки: «; std: : cin >> str;
vector<flight> fli = flights («Tours. txt») ;
for (i = 0; i < fli. size () ; i++) {
if (fli[i]. typeTour. find (str) == -1) {
fli. erase (fli. begin () + i) ;
i--;
}
}
struct sTypeTour {
bool operator () (const flight& lhs, const flight& rhs) const {
return lhs. typeTour < rhs. typeTour;
}
};
std: : sort (fli. begin (), fli. end (), sTypeTour ()) ;
flights (fli) ;
return 0;
}
int findTours () {
SetConsoleCP (1251) ;
SetConsoleOutputCP (1251) ;
int id;
string str;
std: : cout << «\nid list»
<< «\n[1] Тип путевки»
<< «\n[2] Страна пребывания»
<< «\n[3] Стоимость» << endl;
id = checkint (3, «\nвведите номер параметра по которому хотите искать: «) ;
std: : cout << «\nвведите слово или фразу для поиска: «; std: : cin >> str;
vector<flight> fli = flights («Tours. txt») ;
int i;
switch (id) {
case 1:
for (i = 0; i < fli. size () ; i++) {
if (fli[i]. typeTour. find (str) == -1) {
fli. erase (fli. begin () + i) ;
i--;
}
}
break;
case 2:
for (i = 0; i < fli. size () ; i++) {
if ((fli[i]. hostCountry). find (str) == -1) {
fli. erase (fli. begin () + i) ;
i--;
}
}
break;
case 3:
for (i = 0; i < fli. size () ; i++) {
if (to_string (fli[i]. cost). find (str) == -1) {
fli. erase (fli. begin () + i) ;
i--;
}
}
break;
default: break;
}
if (i == 0) std: : cout << «\nпоиск не дал результатов\n»;
else flights (fli) ;
return 0;
}
int sortingTour () {
int id;
vector<flight> fli = flights («Tours. txt») ;
cout << «\nID LIST»
<< «\n[1] Тип путевки»
<< «\n[2] Страна пребывания»
<< «\n[3] Стоимость» << endl;
id = checkint (3, «\nВведите номер параметра сортировки: «) ;
switch (id) {
case 1:
struct sTypeTour {
bool operator () (const flight& lhs, const flight& rhs) const {
return lhs. typeTour < rhs. typeTour;
}
};
std: : sort (fli. begin (), fli. end (), sTypeTour ()) ;
break;
case 2:
struct sHostCountry {
bool operator () (const flight& lhs, const flight& rhs) const {
return lhs. hostCountry < rhs. hostCountry;
}
};
std: : sort (fli. begin (), fli. end (), sHostCountry ()) ;
break;
case 3:
struct sCost {
bool operator () (const flight& lhs, const flight& rhs) const {
return lhs. cost < rhs. cost;
}
};
std: : sort (fli. begin (), fli. end (), sCost ()) ;
break;
default:
break;
}
flights (fli) ;
return 0;
}
int editTour () {
getAllTours () ;
int id;
SetConsoleCP (1251) ;
SetConsoleOutputCP (1251) ;
std: : cout << «\nВведите номер записи, которую желаете редактировать: «;
std: : cin >> id;
std: : vector<flight> fli = flights («Tours. txt») ;
std: : cout << «Введите тип путевки: «;
std: : cin >> fli[id]. typeTour;
std: : cout << «Введите страну пребывания: «;
std: : cin >> fli[id]. hostCountry;
std: : cout << «Введите вид транспорта: «;
std: : cin >> fli[id]. typeTransport;
std: : cout << «Введите количество дней пребывания: «;
std: : cin >> fli[id]. amountDays;
std: : cout << «Введите питание: «;
std: : cin >> fli[id]. food;
std: : cout << «Введите стоимость: «;
std: : cin >> fli[id]. cost;
ofstream file («Tour. txt», ios_base: : out | ios_base: : trunc) ;
for (int i = 0; i < fli. size () ; i++) file << fli[i]. typeTour + « « << fli[i]. hostCountry + « « << fli[i]. typeTransport + « « << to_string (fli[i]. amountDays) + « « << fli[i]. food +» « << to_string (fli[i]. cost) + «\n»;
cout << «\nИнформация путевки изменена! \n»;
file. close () ;
return 0;
}
int addTours () {
SetConsoleCP (1251) ;
SetConsoleOutputCP (1251) ;
ofstream file («Tours. txt», ios_base: : out | ios_base: : app) ;
flight fli;
std: : cout << «\nВведите тип путевки: «;
std: : cin >> fli. typeTour;
std: : cout << «\nВведите страну пребывания: «;
std: : cin >> fli. hostCountry;
std: : cout << «\nВведите вид транспорта: «;
std: : cin >> fli. typeTransport;
std: : cout << «\nВведите количество дней пребывания»;
std: : cin >> fli. amountDays;
std: : cout << «\nВведите притание «;
std: : cin >> fli. food;
std: : cout << «\nВведите стоимость «;
std: : cin >> fli. cost;
file << «\n» << fli. typeTour + « « << fli. hostCountry + « « << fli. typeTransport + « « << fli. amountDays + « « << fli. food + « « << fli. cost;
std: : cout << «Путевка добавлена в список! \n»;
file. close () ;
return 0;
}
int dellTours () {
getAllTours () ;
int id;
std: : vector<flight> fli = flights («Tours. txt») ;
id = checkint (fli. size () - 1, «\nВведите номер записи, которую желаете удалить: «) ;
fli. erase (fli. begin () + id) ;
ofstream file («Tours. txt», ios_base: : out | ios_base: : trunc) ;
for (int i = 0; i < fli. size () ; i++) file << fli[i]. typeTour + « « << fli[i]. hostCountry + « « << fli[i]. typeTransport + « « << to_string (fli[i]. amountDays) + « « << fli[i]. food + « « << to_string (fli[i]. cost) + «\n»;
cout << «Запись удалена! \n»;
file. close () ;
return 0;
}
// Вывод всего списка путевок
int getAllTours () {
std: : vector<flight> flightss = flights («Tours. txt») ;
flights (flightss) ;
return 0;
}
// Вывод списка путевок
int flights (vector<flight> fl) {
system («cls») ;
ifstream file («Tours. txt») ;
std: : cout << «\nСписок путевок\n----------------\n»
<< «ID « << setw (12) << left << «Тип путевки»
<< setw (12) << «Страна пребывания»
<< setw (12) << «Вид транспорта»
<< setw (12) << «Количество дней»
<< setw (12) << «Питание»
<< setw (12) << «Стоимость» << std: : endl;
for (int i = 0; i < fl. size () ; i++) {
std: : cout << i << «. «
<< setw (12) << left << fl[i]. typeTour
<< setw (14) << fl[i]. hostCountry
<< setw (17) << fl[i]. typeTransport
<< setw (19) << fl[i]. amountDays
<< setw (19) << fl[i]. food
<< setw (17) << fl[i]. cost << std: : endl;
}
file. close () ;
return 0;
}
vector<flight> flights (string path) {
std: : vector<flight> fli;
std: : ifstream file (path) ;
flight ft;
while (file >> ft. typeTour >> ft. hostCountry >> ft. typeTransport >> ft. amountDays >> ft. food >> ft. cost) fli. push_back (ft) ;
file. close () ;
return fli;
}
int checkint (int max, string str) {
int id;
while (true) {
std: : cout << str; std: : cin >> id;
if (std: : cin. fail ()) {
std: : cin. clear () ;
while (std: : cin. get ()! = '\n') ;
}
else if (max == -1) return id;
if (id <= max && id >= 0) return id;
else std: : cout << «Вы ввели некорректные данные. « << std: : endl;
}
}
};
Класс Accounts
#include «stdafx. h»
#include <windows. h>
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <vector>
#include <iomanip>
using namespace std;
class Accounts
{
public:
Accounts () ;
~Accounts () ;
struct account {
string login;
string password;
string role;
};
vector<account> accounts () {
std: : vector<account> acc;
std: : ifstream file («accounts. txt») ;
account z;
if (file. is_open ()) {
while (file >> z. login >> z. password >> z. role)
acc. push_back (z) ;
file. close () ;
return acc;
}
else {
cout << «Файла c аккаунтами не существует. Для создания данного файла введите данные учетной записи администратора»;
cout << «\nВведите логин администратора: «;
cin >> z. login;
cout << «Введите пароль администратора: «;
cin >> z. password;
std: : cout << «Введите роль»;
std: : cin >> z. role;
std: : cout << std: : endl;
acc. push_back (z) ;
ofstream file («accounts. txt») ;
file << acc[0]. login + « « << acc[0]. password + « « << (acc[0]. role) + « \n»;
file. close () ;
return acc;
}
}
int operation () {
int id;
while (true) {
cout <<
«\n\tУПРАВЛЕНИЕ АККАУНТАМИ» <<
«\n[1] Просмотр всех аккаунтов» <<
«\n[2] Добавление нового аккаунта» <<
«\n[3] Редактирование данных аккаунта» <<
«\n[4] Удаление аккаунта» <<
«\n[5] Назад\n»;
id = checkint (5, «\nВведите номер операции: «) ;
switch (id)
{
case 1: writeAccounts () ; break;
case 2: addAccount () ; break;
case 3: editAccount () ; break;
case 4: deleteAccount () ; break;
case 5: return 0; break;
default:
break;
}
}
}
int writeAccounts () {
int mlogin = 5, mpass = 8;
ifstream file («accounts. txt») ;
vector<account> acc = accounts () ;
for (int i = 0; i < acc. size () ; i++) {
if (mlogin < acc[i]. login. length ()) mlogin = acc[i]. login. length () ;
if (mpass < acc[i]. password. length ()) mpass = acc[i]. password. length () ;
}
mlogin = mlogin + 2;
mpass = mpass + 2;
cout << «\n\tСПИСОК УЧЕТНЫХ ЗАПИСЕЙ\n» << «ID « << setw (mlogin) << left << «LOGIN» << setw (mpass) << «PASSWORD» << setw (4) << «ROLE» << endl;
for (int i = 0; i < acc. size () ; i++) cout << i << «. « << setw (mlogin) << left << acc[i]. login << setw (mpass) << acc[i]. password << setw (4) << acc[i]. role << endl;
file. close () ;
return 0;
}
int editAccount () {
SetConsoleCP (1251) ;
SetConsoleOutputCP (1251) ;
writeAccounts () ;
int number;
std: : vector<account> acc = accounts () ;
number = checkint (acc. size () - 1, «\nВведите номер записи, которую желаете редактировать: «) ;
cout << «Введите логин»; cin >> acc[number]. login;
cout << «Введите новый пароль: «; cin >> acc[number]. password;
cout << «Введите роль»; cin >> acc[number]. role;
ofstream file («accounts. txt», ios_base: : out | ios_base: : trunc) ;
for (int i = 0; i < acc. size () ; i++) file << acc[i]. login + « « << acc[i]. password + « « << (acc[i]. role) + « \n»;
cout << «\nИзменения сохранены. \n»;
file. close () ;
return 0;
}
int addAccount () {
SetConsoleCP (1251) ;
SetConsoleOutputCP (1251) ;
ofstream file («accounts. txt», ios_base: : out | ios_base: : app) ;
string arr[3];
int p = 0;
std: : vector<account> acc = accounts () ;
while (p == 0) {
cout << «\nВведите логин: «; cin >> arr[0];
for (int i = 0; i < acc. size () ; i++) {
if (acc[i]. login == arr[0]) {
cout << «Логин занят. Придумайте другой. «;
p = 0;
break;
}
else p = 1;
}
}
cout << «Введите пароль: «; cin >> arr[1];
cout << «Введите роль: «; cin >> arr[2];
file << «\n» << arr[0] + « « << arr[1] + « « << arr[2];
cout << «Учетная запись создана! \n»;
file. close () ;
return 0;
}
int deleteAccount () {
writeAccounts () ;
int number;
std: : vector<account> acc = accounts () ;
number = checkint (acc. size () - 1, «\nВведите номер записи, которую хотите удалить: «) ;
acc. erase (acc. begin () + number) ;
ofstream file («accounts. txt», ios_base: : out | ios_base: : trunc) ;
for (int i = 0; i < acc. size () ; i++) file << acc[i]. login + « « << acc[i]. password + « « << (acc[i]. role) + « \n»;
cout << «Учетная запись удалена! \n»;
file. close () ;
return 0;
}
string auth (string login, string pass) {
std: : vector<account> acc = accounts () ;
for (int i = 0; i < acc. size () ; i++) {
if (acc[i]. login == login) {
if (acc[i]. password == pass) {
return acc[i]. role;
break;
}
}
}
return «false»;
}
int checkint (int max, string str) {
int id;
while (true) {
cout << str; cin >> id;
if (cin. fail ()) {
cin. clear () ;
while (cin. get ()! = '\n') ;
}
if (id <= max && id >= 0) {
return id;
}
else cout << «Вы ввели некорректные данные. « << endl;
}
};
Размещено на Allbest.ru
Подобные документы
Разработка и тестирование программы класса Точка. Спецификация программы. Сценарий диалога с пользователем. Разработка структур данных и алгоритмов. Таблица параметров функций программы. Текст программы на языке C++. Особенности тестирования программы.
лабораторная работа [43,1 K], добавлен 21.07.2012Преобразование матрицы по заданным правилам. Методика работы с массивами, основанная на классических алгоритмах. Разработка и описание блок-схемы алгоритма. Листинг программы, экраны работы и отладки программы. Инструкция для пользователей программы.
контрольная работа [338,4 K], добавлен 29.01.2013Создание программы для вычисления значения функции на основе определённой формулы. Уточнение структуры входных и выходных данных и определение ассемблерного формата их представления. Разработка алгоритмов для реализации работы программного обеспечения.
курсовая работа [240,6 K], добавлен 17.06.2013Разработка эскизного и технического проектов программы, ее назначение и область применения, описание алгоритма, организация входных и выходных данных. Выбор состава технических и программных средств, разработка рабочего проекта, спецификация программы.
курсовая работа [159,8 K], добавлен 26.01.2010Графическая схема алгоритма выполнения программы определения запасов сырья. Решение задачи с помощью программы MS Excel. Разработка макроса для построения диаграммы. Использование интерфейса программы для работы с таблицей. Разработка базы данных.
курсовая работа [1,2 M], добавлен 24.04.2014Осуществление работы разрабатываемой программы на основе алгоритма, использующего Z-буфер. Аналитическое описание программной реализации. Алгоритмы основных функций программы. Содержание руководства пользователя. Файлы программы, пункты главного меню.
курсовая работа [1,7 M], добавлен 15.04.2015Разработка функциональной и принципиальной схемы. Выбор управляющего контроллера. Описание МК PIC16F626, МК AVR, МК 51. Выбор элементной базы. Разработка управляющей программы. Описание алгоритма работы программы. Схема устройства, листинг программы.
курсовая работа [492,9 K], добавлен 28.12.2012Изучение условий поставленной задачи и используемых данных для разработки программы хранения информации о рейсах поезда. Описание разработанных функций, листинга, блок-схем алгоритмов и дерева функции. Рассмотрение сценария диалога данной программы.
курсовая работа [532,7 K], добавлен 20.07.2014Разработка программного обеспечения для работы с информацией и ее обработкой на языке программирования Delphi. Описание алгоритмов процедуры работы со стеком - добавление, удаление элементов, редактирование записи. Инструкция по использованию программы.
курсовая работа [2,9 M], добавлен 06.02.2013Организация вычислительных процессов и программирования на алгоритмическом языке. Создание программы "Калькулятор". Выбор языка и среды программирования. Функциональная схема работы программы, описание разработанных алгоритмов. Способы устранения ошибок.
курсовая работа [434,1 K], добавлен 27.08.2012