Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовой проект Разработка программы управления авиарейсами.doc
Скачиваний:
115
Добавлен:
01.04.2014
Размер:
213.5 Кб
Скачать

4. Описание алгоритмов решения задачи

Алгоритм вычисления длины строки и поиска в ней другой подстроки был реализован при помощи ассемблерных вставок. Пошаговое описание алгоритма имеет следующий вид:

Шаг 1 Сохранить значение регистра ЕАХ

Шаг 2 Обнулить регистров ЕАХ и ЕСХ

Шаг 3 Поместить в ЕDI адрес строки, в которой ищем подстроку

Шаг 4 Уменьшить ЕСХ на 1

Шаг 5 Установить DF в 1

Шаг 6 Ищем нулевой байт

Шаг 7 Отрицание ЕСХ

Шаг 8 Вычитаем из ЕСХ 2 Длина строки в ЕСХ

Шаг 9 Помещаем в ЕDI адрес строки, в которой ищем подстроку

Шаг 10 В AL символ, который ищем

Шаг 11 Выполняем поиск

Шаг 12 ЕСЛИ символ не найден Шаг 14

Шаг 13 Вывод строки на экран

Шаг 14 Восстанавливаем значение ЕАХ

Шаг 15 Выход

Аналогично продемонстрируем действия выполняемые при добавлении рейса.

Шаг 1 Очистка экрана

Шаг 2 Заполнение атрибутов класса Oper, необходимыми значениями

Шаг 3 Добавление авиарейса. Вызов метода Add класса Raspis

Шаг 4 Добавление произведенного действия в список операций. Вызов метода Add класса SpisOper

Шаг 5 Очистка экрана

Шаг 6 Вывод добавленного рейса на экран

Шаг 7 Установка параметра mode 1

Алгоритм метода Save() класса Raspis:

Шаг 1 Инициализация объекта ofstream

Шаг 2 Связывание объекта с файлом

Шаг 3 Обнуление счетчика

Шаг 4 Сравниваем значение счетчика с количеством рейсов

Шаг 5 Если больше Шаг 8

Шаг 6 Записываем данные в файл

Шаг 7 Увеличиваем счетчик

Шаг 8 Закрываем поток

Шаг 9 Возвращаем 1

Блок схема алгоритма функции main() представлена на рисунке 3,4

Рисунок 3 - Блок схема алгоритма

Рисунок 4 – Блок схема алгоритма

5. Руководство пользователя

Разработанная программа предназначена для учета авиарейсов. Она позволяет:

  • хранить информацию об авиарейсах;

  • просматривать расписание самолетов;

  • добавлять, удалять, редактировать авиарейсы;

  • при неправильном вводе, ошибочном удалении и т.п. отменять последние действия;

  • искать необходимый авиарейс по названия города, дням курсирования;

  • бронировать билеты.

К достоинствам данной программы можно отнести:

  • удобный пользовательский интерфейс и простота в обращении;

  • не требует как-либо дополнительных знаний от пользователя;

  • не требовательна к ресурсам компьютера;

  • возможность хранить информацию о большом количестве авиарейсов и др.

Для запуска программы необходимо запустить файл avia.exe. В папке с данным файлом должны находиться:

  • файл data.dat, содержащий информацию об авиарейсах;

  • файл bilet.dat, содержащий информацию об зарезервированных билетах.

При отсутствии данных файлов, они будут созданы автоматически.

Программа имеет пользовательское меню. Некоторые пункты содержат подменю. Выбор пунктов меню осуществляется путем ввода номера соответствующего пункта меню. При неправильном вводе пользователю будет выдано сообщение (рисунок 5).

Главное меню состоит из следующих пунктов меню:

1. Выбор рейса…

2. Поиск рейса…

3. Добавление нового рейса

4. Отмена последней операции

5. Забронированные рейсы

6. Выход.

Рисунок 5 - Ошибка выбора пункта меню

При выборе первого пункта меню, пользователю необходимо будет выбрать необходимый ему рейс. После выбора появится подменю, позволяющее следующее:

  • удалить выбранный рейс;

  • редактировать рейс;

  • забронировать билет.

Второй пункт меню предназначен для поиска авиарейса по следующим критериям:

  • по городу отправления;

  • по городу отправления;

  • по дня курсирования.

При выборе третьего пункта пользователю необходимо будет ввести необходимые сведения об авиарейсе, после чего введенные сведения сохранятся в расписании.

Чтобы отменить последние действия, которые совершил пользователь, необходимо выбрать четвертый пункт меню. Отмена действия запросит подтверждение, пользователю в случае согласия необходимо ввести «y».

Для завершения работы с программой необходимо выбрать шестой пункт меню Выход.

Заключение

В результате выполнения курсовой работы были закреплены теоретические и практические навыки по дисциплине «Конструирование программ и языки программирования». Усвоены современные концепции и приемы разработки объектно-ориентированного программного обеспечения при помощи языка С++. Результатом является программа, которая позволяет автоматизировать процесс учета авиарейсов. Для реализации программного продукта были так же применены навыки низкоуровневого программирования на языке Ассемблер. При помощи языка UML разработана диаграмма классов, иллюстрирующая созданную структуру данных.

При разработке программы использовался модульный принцип программирования. Такая структура программы позволяет в дальнейшем модифицировать отдельные ее части без нарушения работоспособности и потери функциональности приложения.

Программа имеет достаточно ясный и понятный интерфейс, обеспечивающий удобство в работе и доступ к необходимой пользователю информации с наименьшими затратами времени.

В ходе тестирования разработанного программного модуля все функции программа выполняет без ошибок и задержек. Программа работает корректно и без сбоев.

Таким образом, разработанное в ходе выполнения курсовой работы приложение является законченным программным продуктом.

Литература

1. Р. Лафоре - Объектно-ориентированное программирование в С++. Классика Computer Science

2. Дьюхерст С. – «С++. Священные знания» - Пер. с англ. - СПб.: Символ-Плюс, 2007.

3. Шилд Герберт. – «Самоучитель C++» - СПб : BHV - Санкт-Петербург, 1997.

4. Либерти Дж.- «Освой самостоятельно C++ за 21 день. 3-е издание.» - М.: Издательский дом "Вильямс", 2000.

5. Кип Р. Ирвин - Язык ассемблера для процессора INTEL, 4-е издание, - М.: 2005г.

ПРИЛОЖЕНИЕ А (листинг программы с комментариями)

Листинг main.cpp

#include "windows.h"

#include "oper.h"

#include <iostream>

#include <string>

#include <fstream>

#include <locale>

using namespace std;

void SaveB(reis *r);

void LoadB();

void menu(int);

int menuCheck();

void clr(int);

void clrMenu();

void main()

{locale::global(locale(""));

int mode=0,temp,n;

reis r;

char s1[20],s2,c;

Raspis ras;

SpisOper so;

Oper o;

ras.Load();

system("cls");

ras.Pokaz();

while (true)

switch (mode)

{case 0://mode=1 Главное меню

menu(mode);

while (mode==0)

switch (menuCheck())

{

case 1://Выбор рейса

cout<<"Номер выбранного рейса ";

cin>>temp;temp--;

clr();

ras.inf(temp)->View(1);

mode=1;

break;

case 2: //Поиск рейса

mode=2;

break;

case 3: //Добавление рейса

clr();

o.data.Zap();

o.pos=ras.Size();

o.key=1;

ras.Add(o.data,o.pos);

so.Add(o);

clr();

ras.inf(o.pos)->View(1);

mode=1;

break;

case 4://Отмена последней операции

if (!so.o.empty())

if (so.Pokaz()==0)

{o=so.Delete();

switch (o.key)

{case 1://добавление

ras.Delete(o.pos);

break;

case 2://удаление

ras.Add(o.data,o.pos);

break;

case 3://редактирование

*ras.inf(o.pos)=o.data;

break;

}

}

clr();

ras.Pokaz();

mode=0;

break;

case 5: //Просмотр забронированных рейсов

clr();

LoadB();

cout<<"\nПродолжить (y/n):";

cin>>c;

clr();

ras.Pokaz();

mode=0;

break;

case 6://Выход

ras.Save();

return;

default:

cout<<"\nОшибка выбора меню"<<endl;

break;

}

break;

case 1://mode=1 Подменю 1 п. главного меню

menu(mode);

while (mode==1)

switch (menuCheck())

{

case 1://Редактирование рейса

o.key=3;

o.pos=temp;

o.data=*ras.inf(o.pos);

so.Add(o);

clr();

ras.inf(o.pos)->Zap();

clr();

ras.inf(o.pos)->View(1);

mode=1;

break;

case 2: //Удаление рейса

clr();

cout<<"Вы действительно хотите удалить рейс № "<<temp<<" (y/n)"<<endl;

cin>>s2;

o.data=*ras.inf(temp);

o.pos=temp;

o.key=2;

if (s2=='y')

{ so.Add(o);

ras.Delete(o.pos);

cout<<"Операция удаления рейса выполнена успешно";

}

else cout<<"Операция удаления отменена";

clr();

ras.Pokaz();

mode=0;

break;

case 3: //Бронирование

clr();

SaveB(ras.inf(temp));

clr();

ras.inf(temp)->View(1);

mode=1;

break;

case 4://Назад

clr();

ras.Pokaz();

mode=0;

break;

default:

cout<<"\nОшибка выбора меню"<<endl;

break;

}

break;

case 2://mode=3 Подменю 2 п. главного меню

menu(mode);

while (mode==2)

switch (menuCheck())

{

case 1://По городу отправления

clr();

cout<<"Поиск: "<<endl<<"Введите город отправления: ";cin>>s1;

cout<<setiosflags(ios::left)<<setw(4)<<"№"<<setw(15)<<"Откуда"<<setw(15)<<"Куда"<<"Дни\n";

for (int i=0;i<ras.Size();i++)

if (strcmp(s1,ras.inf(i)->GetCityIn())==0)

{cout<<setw(4)<<i+1;ras.inf(i)->View(2);cout<<endl; }

break;

case 2: //По городу прибытия

clr();

cout<<"Поиск: "<<endl<<"Введите город прибытия: ";cin>>s1;

cout<<setiosflags(ios::left)<<setw(4)<<"№"<<setw(15)<<"Откуда"<<setw(15)<<"Куда"<<"Дни\n";

for (int i=0;i<ras.Size();i++)

if (strcmp(s1,ras.inf(i)->GetCityOut())==0)

{cout<<setw(4)<<i+1;ras.inf(i)->View(2);cout<<endl; }

break;

case 3://По дню курсирования

clr();

cout<<"Введите день (1-Пн, 2-Вт,...,7-Вс): ";cin>>s2;

cout<<setiosflags(ios::left)<<setw(4)<<"№"<<setw(15)<<"Откуда"<<setw(15)<<"Куда"<<"Дни\n";

n=ras.Size();

__asm

{push eax

for_start:

mov ecx,0

for_loop:

mov temp,ecx

push ecx

}

strcpy(s1,ras.inf(temp)->GetDays()) ;

__asm

{;определение длины строки s1

xor eax,eax

xor ecx,ecx

lea edi,s1

dec ecx

cld

repne scasb

neg ecx

sub ecx,2

;проверяем есть ли s2 в s1

lea edi,s1

mov al,s2

cld

repne scasb

jnz _Exit

}

cout<<setw(4)<<temp+1;ras.inf(temp)->View(2);cout<<endl;

_asm

{_Exit:

pop ecx

inc ecx

cmp ecx, n

jne for_loop

pop eax

}

break;

case 4:////Назад

mode=0;

clr();

ras.Pokaz();

break;

default:

cout<<"\nОшибка выбора меню"<<endl;

break;

}

break;

}

}

void menu(int mode)

{

HANDLE hConsole;

clrMenu();

hConsole=GetStdHandle(STD_OUTPUT_HANDLE);

COORD coord1;

coord1.X=30;

coord1.Y=15;

SetConsoleCursorPosition(hConsole,coord1);

switch (mode)

{

case 0:

cout<<"****Меню****\n"<<endl;

cout<<"\t\t\t1 - Выбор рейса..."<<endl;

cout<<"\t\t\t2 - Поиск рейса..."<<endl;

cout<<"\t\t\t3 - Добавление нового рейса "<<endl;

cout<<"\t\t\t4 - Отмена последней операции "<<endl;

cout<<"\t\t\t5 - Забронированные рейсы"<<endl;

cout<<"\t\t\t6 - Выход"<<endl;

break;

case 1:

cout<<"****Меню****\n"<<endl;

cout<<"\t\t\tВыбор рейса"<<endl;

cout<<"\t\t\t 1 - Редактирование рейса "<<endl;

cout<<"\t\t\t 2 - Удаление рейса "<<endl;

cout<<"\t\t\t 3 - Бронирование билета "<<endl;

cout<<"\t\t\t 4 - Назад"<<endl;

break;

case 2:

cout<<"****Меню****\n"<<endl;

cout<<"\t\t\tПоиск рейса"<<endl;

cout<<"\t\t\t 1 - По городу отправления "<<endl;

cout<<"\t\t\t 2 - По городу прибытия "<<endl;

cout<<"\t\t\t 3 - По дню курсирования "<<endl;

cout<<"\t\t\t 4 - Назад"<<endl;

break;

}}

int menuCheck()

{

char buf[10];

int check;

HANDLE hConsole;

hConsole=GetStdHandle(STD_OUTPUT_HANDLE);

COORD coord1;

do

{

coord1.X=30;

coord1.Y=23;

SetConsoleCursorPosition(hConsole,coord1);

cout<<"Ввод: ";cin>>buf;

check=atoi(buf);

}

while (!check);

return check;

}

void clr()

{

HANDLE hConsole;

hConsole=GetStdHandle(STD_OUTPUT_HANDLE);

COORD coord1;

coord1.X=0;

coord1.Y=0;

SetConsoleCursorPosition(hConsole,coord1);

for (int i=0;i<17;i++)

for (int j=0;j<70;j++)

printf(" ");

SetConsoleCursorPosition(hConsole,coord1);

}

void clrMenu()

{

HANDLE hConsole;

hConsole=GetStdHandle(STD_OUTPUT_HANDLE);

COORD coord1;

coord1.X=0;

coord1.Y=16;

SetConsoleCursorPosition(hConsole,coord1);

for (int i=0;i<7;i++)

for (int j=0;j<100;j++)

printf(" ");

SetConsoleCursorPosition(hConsole,coord1);

}

void SaveB(reis *r)

{int a;

ofstream f("bilet.dat",ios::app);

cout<<"Бронирование места на авиарейс"<<endl;

cout<<"Направление: из "<<r->GetCityIn()<<" в "<<r->GetCityOut()<<endl;

cout<<"Выберите день( "<<r->GetDays()<<" ): ";cin>>a;

f<<r->GetCityIn()<<endl<<r->GetCityOut()<<endl<<a<<endl;

cout<<"Выберите класс(1, 2, 3): ";cin>>a;f<<a<<endl;

f.close();

}

void LoadB()

{int a;char city[15];

ifstream f("bilet.dat");

cout<<"Забронированные билеты на авиарейсы"<<endl;

cout<<setiosflags(ios::left)<<setw(15)<<"Откуда"<<setw(15)<<"Куда"<<setw(5)<<"День"<<"Класс\n";

while (!f.eof())

{

f>>city;cout<<setiosflags(ios::left)<<setw(15)<<city;

if (strcmp(city,""))

{f>>city;cout<<setiosflags(ios::left)<<setw(15)<<city;

f>>a;cout<<setiosflags(ios::left)<<setw(5)<<a;

f>>a;cout<<setiosflags(ios::left)<<a<<endl;}

}

f.close();

}

Листинг reis.h

#include <iomanip>

#include <iostream>

using namespace std;

#define N1 15

#define N2 7

void clr();

void clrMenu();

struct napr//+

{

char cityin[N1];

char cityout[N1];

int rast;

};

class reis

{

napr n;

char days[N2];

int m1;

int m2;

int m3;

public:

void Zap();//+

void ViewDays();//+

void View(int );

char *GetCityIn();

char *GetCityOut();

char *GetDays();

};

Листинг reis.cpp

#include "reis.h"

void reis::Zap()

{

cout<<"Откуда: ";cin>>n.cityin;

cout<<"Куда: ";cin>>n.cityout;

cout<<"По каким дням (1-Пн, 2-Вт, ... ,7-Вс): ";cin>>days;

cout<<"Расстояние: ";cin>>n.rast;

cout<<"Кол-во мест 1 класс: ";cin>>m1;

cout<<"Кол-во мест 2 класс: ";cin>>m2;

cout<<"Кол-во мест 3 класс: ";cin>>m3;

}

void reis::View(int mode)

{

switch (mode)

{

case 1:

cout<<"Направление :"<<n.cityin<<" - "<<n.cityout<<endl;

cout<<"Расстояние "<<n.rast<<" км "<<endl;

cout<<"1-ый класс Свободно: "<<setw(3)<<m1<<"мест Цена билета "<<n.rast*3<<endl;

cout<<"2-ый класс Свободно: "<<setw(3)<<m2<<"мест Цена билета "<<n.rast*2<<endl;

cout<<"3-ый класс Свободно: "<<setw(3)<<m3<<"мест Цена билета "<<n.rast*1<<endl;

cout<<"Дни курсирования: ";

ViewDays();

break;

case 2:

cout<<setiosflags(ios::left)<<setw(15)<<n.cityin<<setw(15)<<n.cityout;

ViewDays();

break;

}

}

void reis::ViewDays()

{

if (strcmp(days,"1234567")==0) {cout<<"eжедневно";return;}

if (strcmp(days,"12345")==0) {cout<<"по будням";return;}

if (strcmp(days,"67")==0) {cout<<"по выходным";return;}

for (int i=0;i<strlen(days);i++)

switch ( days[i] )

{

case '1':cout<<"Пн ";break;

case '2':cout<<"Вт ";break;

case '3':cout<<"Ср ";break;

case '4':cout<<"Чт ";break;

case '5':cout<<"Пт ";break;

case '6':cout<<"Сб ";break;

case '7':cout<<"Вс ";break;

}

}

char *reis::GetCityIn()

{

return n.cityin;

}

char *reis::GetCityOut()

{

return n.cityout;

}

char *reis::GetDays()

{

return days;

}

Листинг raspis.h

#include "reis.h"

#include <vector>

#include <fstream>

class Raspis

{

vector<reis> r;

public:

reis *inf(int);

void Pokaz();

int Load();

int Save();

void Add(reis &,int);

void Delete(int);

void Edit();

int Size();};

Листинг raspis.cpp

#include "raspis.h"

void Raspis::Pokaz()

{

cout<<setiosflags(ios::left)<<setw(4)<<"№"<<setw(15)<<"Откуда"<<setw(15)<<"Куда"<<"Дни\n";

for (int i=0;i<Size();i++){cout<<setw(4)<<i+1;r[i].View(2);cout<<endl;}

}

reis *Raspis::inf(int i)

{

return &r[i];

}

int Raspis::Size()

{

return int(r.size());

}

int Raspis::Load()

{

ifstream f;

reis t;

f.open("avia.dat",ios::binary);

while (!f.eof()&&f.read(reinterpret_cast<char *>(&t),sizeof(reis)))

r.push_back(t);

f.close();

return 0;

}

int Raspis::Save()

{

ofstream f1;

f1.open("avia.dat",ios::binary|ios::trunc);

for (int i=0;i<Size();i++)

f1.write(reinterpret_cast<char *>(&r[i]),sizeof(reis));

f1.close();

return 0;

}

void Raspis::Add(reis &t, int pos)

{

r.insert(r.begin()+pos,t);

}

void Raspis::Delete(int pos)

{

r.erase(r.begin()+pos);

}

Листинг oper.h

#include "raspis.h"

#include <stack>

struct Oper

{

int key; //1-добавление 2-удаление 3-редактирование

int pos;

reis data;

};

class SpisOper

{public:

stack<Oper> o;

void Add(Oper );

Oper Delete();

int Pokaz();

};

Листинг Oper.cpp

#include "oper.h"

void SpisOper::Add(Oper op)

{

o.push(op);

}

Oper SpisOper::Delete()

{

Oper op;

op=o.top(); o.pop();

return op;

}

int SpisOper::Pokaz()

{

clr();

cout<<o.top().pos+1<<endl; o.top().data.View(1);cout<<endl;

char ch;

switch (o.top().key)

{

case 1:cout<<"Последняя произведенная операция: Добавление";break;

case 2:cout<<"Последняя произведенная операция: Удаление";break;

case 3:cout<<"Последняя произведенная операция: Редактирование";break;

}

cout<<"\nОтменить да/нет(y/n)? ";

cin>>ch;

if (ch=='y') return 0;

else return 1;

}