Библиографический список
Основные результаты курсовой работы
1. Разработана программа «База данных авиакомпании СИБИРЬ».
2. Программа считывает данные из файла и записывает модифицированную базу в тот же файл при желании на то пользователя.
3. Программа позволяет осуществлять поиск в базе данных по месту назначения, а также по месту назначения и времени вылета.
4. Программа позволяет редактировать данные из базы в режиме диалога: возможно покупать билеты и редактировать время вылета.
5. Программа протестирована для всех возможных ситуаций. В этих ситуациях программа работает корректно. Непредсказуемых результатов не возникает.
6. Разработано руководство оператора для данной программы.
1. Павловская Т.А. С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2008. – 461 с.: ил.
2. Панюкова Т.А., Панюков А.В. Языки и методы программирование: Учебное пособие. – М.: Книжный дом «Либроком», 2013. – 144 с.
ПРИЛОЖЕНИЕ. Текст программы
#include <cstdlib>
#include <iostream>
#include <ios>
#include <iomanip>
#include <fstream>
#include <locale>
using namespace std;
const int cF=30;//Максимальная длина строки
//Структура для хранения данных о времени
struct Time{
int hr; //часы
int min; //минуты
};
//Структура для хранения списка с информацией о совершаемых рейсах
struct Flight{
int Num; //номер рейса
char Destination [cF];//пункт назначения
Time Dep; //время вылета
int way; //время в пути
int FreePlace; //наличие свободных мест
Flight *Next; //Указатель на следующий элемент списка
};
Flight *head; //Указатель на голову списка
//************ Прототипы использованных функций (оглавление) *******************
Flight* Add(Flight * head, const Flight& fl);
int Menu();
Flight NewFlight();
Flight * ReadBase (char *FileName);
void FilePrint (char *FileName, Flight *head);
void Print (Flight *head);
int BuyTicket(Flight * head);
int EditFlight(Flight * head);
void FindFlight (Flight *head);
void FindTimeAndDestination (Flight *pv, char *Place, Time t);
void FindDestination (Flight *pv, char *Place);
Flight *FindNum(Flight * pv, int Num, Flight **prev);
Flight *Remove(Flight *head);
int GetNumFlight();
//*********** ДОБАВЛЕНИЕ РЕЙСА В СПИСОК **************************************
Flight* Add(Flight * head, const Flight& fl){
//Формирование нового элемента
Flight * pv=new Flight;
*pv=fl;
pv->Next=0;
if (head){ //Если список не пуст
Flight* tmp=head;
while(tmp->Next)
tmp=tmp->Next;//Поиск конца списка
tmp->Next=pv;
//Присоединение нового элемента
}else
head=pv;
return head;
}
//************ Запрос по номеру рейса ******************************************
int GetNumFlight(){
int cNum;
cout<<"Введите номер рейса\n";
cin>>cNum;
return cNum;
}
//*********** Удаление рейса по номеру *****************************************
Flight *Remove(Flight **head){
int N=GetNumFlight();//Ввод номера удаляемого рейса
Flight *prev;
Flight *pv=FindNum(head,N, &prev);
if (pv){ //Если удаляемый элемент найден
if (pv==head)
//Если удаление из начала списка
head=head->Next;
else
//Удаление из середины или конца списка
prev->Next=pv->Next;
delete pv;
//Освобождение памяти из-под элемента
}
return head;
}
//************ Поиск рейса по номеру *******************************************
Flight *FindNum(Flight * pv, int Num, Flight **prev){
*prev=0;
while (pv){ // Пока не достигли конца списка...
if (pv->Num==Num){ //Если номер рейса текущего элемента совпадает с искомым...
// Вывести информацию о найденном рейсе на экран
cout<<(pv->Destination)<<" "<<(pv->Dep.hr)<<" "<<(pv->Dep.min);
cout<<" "<<(pv->way)<<" "<<(pv->FreePlace)<<"\n";
//Возврат из функции: может быть только одна запись с указанным номером рейса
return pv;
}
// Переход к следующему элементу списка
*prev=pv;
pv=pv->Next;
}
//Если список просмотрен, но ничего не выведено на экран, значит,
//рейса с заданным номером нет в базе
cout<<"Рейс с номером "<<Num<<" не найден\n";
return 0;
}
// ************** Поиск рейса по месту назначения ******************************
void FindDestination (Flight *pv, char *Place){
cout<<"\n Найденные рейсы:\n";
while (pv){// Пока не достигли конца списка...
//Если название направления совпадает с тем, которое необходимо найти
if (strstr(pv->Destination,Place)){
// Вывести информацию на экран. Возврат из функции не осуществляется
// так как в одном направлении может быть несколько рейсов
cout<<(pv->Num)<<" "<<(pv->Destination)<<" "<<(pv->Dep.hr)<<" "<<(pv->Dep.min);
cout<<" "<<(pv->way)<<" "<<(pv->FreePlace)<<"\n";
}
// Переход к следующему элементу списка
pv=pv->Next;
}
}
// *************** Поиск рейса по месту назначения и времени вылета ************
void FindTimeAndDestination (Flight *pv, char *Place, Time t){
while (pv){// Пока не достигли конца списка...
//Если название направления и время вылета совпадает с тем, что необходимо найти
if (strstr(pv->Destination,Place)&&(pv->Dep.hr==t.hr && pv->Dep.min==t.min)){
// Вывести информацию на экран. Возврат из функции не осуществляется
// так как в одном направлении может быть несколько рейсов в одно и то же время
//(хотя и маловероятно ^_^)
cout<<(pv->Num)<<" "<<(pv->Destination)<<" "<<(pv->Dep.hr)<<" "<<(pv->Dep.min);
cout<<" "<<(pv->way)<<" "<<(pv->FreePlace)<<"\n";
}
// Переход к следующему элементу списка
pv=pv->Next;
}
}
// ******************** Функция поиска *****************************************
void FindFlight (Flight *head){
char B[cF]; //Временная переменная для ввода места назначения
//Объявляется в начале функции, т.к. она искользуется в 2 ветках switch
Time t; //Временная переменная для ввода времени вылета
int option; //Переменная, в которой сохраняется номер выбранного пункта меню
//Вывод меню на экран
cout<<"Выберите режим поиска:\n";
cout<<"1 - Поиск по месту назначения\n";
cout<<"2 - Поиск по месту назначения и времени вылета\n";
cout<<"0 - Выход из меню\n";
//Ввод с клавиатуры выбранного пункта
cin>>option;
//Обработка ввода и вызов соответствующих функций
switch (option){
case 0:{return;}
case 1: {
cout<<"Введите место назначения\n";
cin>>B;
FindDestination(head,B);
break;
}
case 2:{
cout<<"Введите место назначения\n";
cin>>B;
do{
cout<<"Введите время вылета\n";
cin>>t.hr>>t.min;
}while(t.hr>23||t.min>59);
FindTimeAndDestination(head,B,t);
break;
}
default: cout<<"Неверный режим\n";
}//switch
}
//****************** Покупка билета ********************************************
int BuyTicket(Flight * head){
int N; // Номер рейса
int s; //Количество покупаемых билетов
N=GetNumFlight(); //Ввод номера рейса
// Поиск рейса по номеру
Flight *prev;
Flight *pv=FindNum(head,N,&prev);
//Если рейс не найден, прекратить выполнение функции
if (!pv) return 1;
//Оформление покупки билетов
cout<<"Сколько билетов куплено?\n";
cin>>s;
//Если количество приобретаемых билетов больше, чем количество свободных мест,
//сообщить клиенту о невозможности совершения покупки
if (s>pv->FreePlace)
cout<<"К сожалению, недостаточно свободных мест на рейсе.\n";
else{
//Оформить покупку и уменьшить количество доступных для продажи мест
cout<<"Поздравляем с покупкой!";
pv->FreePlace-=s;
}
return 0;
}
//****************** Корректировка сведений ************************************
int EditFlight(Flight * head){
int N=GetNumFlight(); //Ввести номер рейса
Time B; //Время вылета
//Поиск рейса по номеру
Flight *prev;
Flight *pv=FindNum(head,N,&prev);
//Если рейс не найден, прекратить выполнение функции
if (!pv) return 1;
//Корректировка времени вылета рейса
//Значения вводятся в цикле do...while до тех пор, пока они не будут введены
//корректно: часы <24, а минуты <60.
do{
cout<<"Введите новое время вылета\n";
cin>>B.hr>>B.min;
}while(B.hr>23||B.min>59);
//Сохранить введенные значения в соответствующее поле найденного элемента
pv->Dep=B;
return 0;
}
// ******************* Вывод базы на экран *************************************
void Print (Flight *head){
//Перейти в голову списка
Flight* pv=head;
//Вывести шапку таблицы БД
cout<<"----------------------------------------------------------------------------\n";
cout<<"|Номер |\t Направление |\t Вылет |\t В пути (мин) |\t Своб.мест |\n";
cout<<"----------------------------------------------------------------------------\n";
//Просмотреть последовательно весь список и вывести его на экран построчно
//функция setw(N) используется, чтобы установить ширину табличного поля (в символах)
// символ - "\t" - табуляция
while (pv){
cout<<"|"<<setw(5)<<(pv->Num)<<"|\t"<<setw(20)<<(pv->Destination);
cout<<"|\t"<<(pv->Dep.hr)<<":"<<(pv->Dep.min);
cout<<"\t|"<<setw(20)<<(pv->way)<<"|\t"<<(pv->FreePlace)<<"\t|\n";
cout<<"----------------------------------------------------------------------------\n";
pv=pv->Next;
}
}
//****************** Вывод базы в файл *****************************************
void FilePrint (char *FileName, Flight *head){
//Открыть файл с именем, хранящимся в переменной FileName для перезаписи.
//Будем работать с выходным потоком
ofstream out;
out.open(FileName);
//Если не удалось открыть файл - сообщить об ошибке
if (!out){
cout<<"Ошибка открытия файла\n";
return;
}
//Перейти в голову списка
Flight* pv=head;
//Вывести последовательно все записи из списка в файл. Оформление отсутствует
while (pv){
out<<(pv->Num)<<"\t"<<(pv->Destination)<<"\t"<<(pv->Dep.hr)<<" "<<(pv->Dep.min);
out<<"\t"<<(pv->way)<<"\t"<<(pv->FreePlace)<<"\n";
pv=pv->Next;
}
//Закрыть файл
out.close();
}
//******************* Чтение базы из файла ************************************
Flight * ReadBase (char *FileName){
//Открыть файл с именем, хранящимся в переменной FileName для чтения.
//Будем работать с входным потоком
ifstream in;
Flight f, *head=0;
in.open(FileName);
//Если не удалось открыть файл - сообщить об ошибке
if (!in){
cout<<"Ошибка открытия файла\n";
return 0;
}
//Считать данные из файла в переменную f (имеющую тип Flight) и вызвать
//функцию добавления соответствующего элемента в список
while (in>>(f.Num)>>(f.Destination)>>(f.Dep.hr)>>(f.Dep.min)>>(f.way)>>(f.FreePlace)){
head=Add(head,f);
}
//Закрыть файл
in.close();
//Вернуть указатель на головной элемент списка
return head;
}
//********************** Пополнение базы данных ********************************
Flight NewFlight(){
Flight f;// Временная переменная для сбора данных о рейсе
//Ввод данных о рейсе с проверкой корректности ввода времени
cout<<"Введите номер рейса\n";
cin>>f.Num;
cout<<"Введите пункт назначения\n";
cin>>f.Destination;
do{
cout<<"Введите время вылета\n";
cin>>f.Dep.hr>>f.Dep.min;
}while(f.Dep.hr>23||f.Dep.min>59);
cout<<"Введите время в пути (в минутах)\n";
cin>>f.way;
cout<<"Введите количество свободных мест\n";
cin>>f.FreePlace;
//В качестве возвращаемого значения передать введенную информацию
return f;
}
// ******************* Пользовательское меню ***********************************
int Menu(){
int option;
//Выводить меню и запрашивать выбор одного из его пунктов,
//пока не будет введено допустимое значение
do{
cout<<"ВАС ПРИВЕТСТВУЕТ АВИАКОМПАНИЯ <<СИБИРЬ>>.";
cout<<"ДЛЯ ДАЛЬНЕЙШЕЙ РАБОТЫ ВЫБЕРИТЕ ДЕЙСТВИЕ.\n";
cout<<"1 - Добавление нового рейса в базу\n";
cout<<"2 - Удаление рейса из базы\n";
cout<<"3 - Поиск рейса\n";
cout<<"4 - Корректировка времени вылета\n";
cout<<"5 - Покупка билета\n";
cout<<"6 - Вывод базы на экран\n";
cout<<"7 - Вывод базы в файл\n";
cout<<"0 - Выход\n";
cin>>option;
}while (option<0||option>7);
return option;
}
//******************************************************************************
int main(int argc, char *argv[])
{
setlocale (LC_ALL, "Russian"); //Подключение кириллицы
Flight * head=ReadBase("flights.txt"); //Считать базу из файла flights.txt
if (!head){//Если база не существует, завершить выполнение программы
cout<<"Невозможно сформировать список\n";
system("PAUSE");
return 1;
}
//До тех пор, пока пользователь не выбрал опцию "Выход", отображать меню
//и выполнять выбранные действия. Номер действия является целочисленным значением,
//возвращаемым функцией Menu()
while (true){
switch(Menu()){
case 0: { system("pause"); return 0;}//Выход из программы
case 1: {
//Добавление записи
Add(head, NewFlight());
cout<<"Запись добавлена в базу данных. Для просмотра базы нажмите 6.\n";
break;}
case 2:{
//Удаление записи
head=Remove(head);
cout<<"Запись удалена из базы данных. Для просмотра базы нажмите 6.\n";
break;}
case 3: {
//Поиск записи
FindFlight(head);
break;}
case 4: {
//Редактирование времени вылета
EditFlight(head);
cout<<"Время вылета изменено. Для просмотра базы нажмите 6.\n";
break;
}
case 5: {
//Покупка билета
BuyTicket(head);
cout<<"Покупка совершена. Для просмотра базы нажмите 6.\n";
break;
}
case 6:{
//Вывод базы на экран
Print(head);
break;}
case 7:{
//Вывод базы в файл
FilePrint("flights.txt", head);
cout<<"Информация занесена в файл flights.txt. Для просмотра базы нажмите 6.\n";
break;}
default:{
//Внезапно было возвращено недопустимое значение...
cout<<"Непредусмотренная ситуация\n";
};
}//switch
}//while
system("PAUSE");
return EXIT_SUCCESS;
}