Если пользователь авторизован с правами администратора, то программа выведет соответствующее сообщение (рисунок 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Введите притание «;