Библиографический список

Основные результаты курсовой работы

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;

}