Разработка программы подбора туристической путевки

Конструирование и разработка структуры программы. Выбор способа организации данных. Разработка перечня пользовательских функций программы. Разработка алгоритмов работы программы. Алгоритм функции 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.