Программный модуль управления авиарейсами
В данной работе для хранения информации используются бинарные файлы. Вся работа с данными производится в оперативной памяти, то есть чтение из файлов производится только при запуске программы, следовательно больших затрат по времени не будет, даже если файлы довольно большие. К тому же такой ход позволяет увеличить срок службы жесткого диска, т.к. он используется только в начале и в конце работы… Читать ещё >
Программный модуль управления авиарейсами (реферат, курсовая, диплом, контрольная)
В качестве средств для написания программы были выбраны язык программирования C++/CLI и компилятор MicrosoftVisual C++ 2010.
Язык С++ является языком программирования общего назначения. Естественная для него область применения — системное программирование, понимаемое в широком смысле этого слова. Кроме того, С++ успешно используется во многих областях, далеко выходящих за указанные рамки. Реализации С++ теперь есть на всех машинах, начиная с самых скромных микрокомпьютеров — до самых больших супер-ЭВМ, и практически для всех операционных систем.
Язык С++ был задуман для того, чтобы настоящие программисты получили удовольствие от самого процесса программирования. За исключением второстепенных деталей он содержит язык С как подмножество. Язык С расширяется введением гибких и эффективных средств, предназначенных для построения новых типов. Программист структурирует свою задачу, определив новые типы, которые точно соответствуют понятиям предметной области задачи. Такой метод построения программы обычно называют абстракцией данных. Информация о типах содержится в некоторых объектах типов, определенных пользователем. С такими объектами можно работать надежно и просто даже в тех случаях, когда их тип нельзя установить на стадии трансляции. Программирование с использованием таких объектов обычно называют объектно-ориентированным. Если этот метод применяется правильно, то программы становятся короче и понятнее, а их сопровождение упрощается.
C++/CLI — привязка языка программирования С++ к среде программирования .NET фирмы Microsoft. Она интегрирует С++ стандарта ISO с Объединённой системой типов (UnifiedTypeSystem, UTS), рассматриваемой как часть Общей языковой инфраструктуры (CommonLanguageInfrastructure, CLI). Она поддерживает и исходный уровень, и функциональную совместимость исполняемых файлов, скомпилированных с родного и управляемого C++. C++/CLI представляет собой эволюцию С++. C++/CLI стандартизирован в ECMA как ECMA-372.
MicrosoftVisual C++ 2010 предоставляет мощную и гибкую среду разработки, позволяющую создавать приложения для MicrosoftWindows и приложения, основанные на Microsoft .NET. Эту среду можно использовать в качестве интегрированной среды разработки, так и в качестве отдельных средств.
1. ПОСТАНОВКА ЗАДАЧИ
Целью данной работы является реализация приложения для работы с базой данных авиарейсов. Ядром любой базы данных является модель данных. С помощью модели данных могут быть представлены объекты предметной области и взаимосвязи между ними. Существуют три основных типа моделей данных: иерархическая, сетевая и реляционная. В данной работе используется иерархическая модель, которая строится по принципу иерархии типов объектов, то есть один тип объекта является главным, а остальные, находящиеся на низших уровнях иерархии, — подчиненными. Например, для авиарейса подчинёнными являются дни, по которым он летает, а для дней — люди, забронировавшие места на данный день.
В программе реализуются:
возможность добавления, редактирования и удаления авиарейса;
возможность добавления, удаления и редактирования записи о бронировании места на определённый день, в который совершается рейс;
поиск авиарейсов по нескольким полям;
наглядный вывод информации на экран в виде таблиц;
отмена последних действий.
Кроме всего вышеперечисленного в программе реализованы дополнительные возможности. К ним относится автосохранение данных, возможность изменения размера буфера, хранящего совершенные действия над данными.
В данной работе для хранения информации используются бинарные файлы. Вся работа с данными производится в оперативной памяти, то есть чтение из файлов производится только при запуске программы, следовательно больших затрат по времени не будет, даже если файлы довольно большие. К тому же такой ход позволяет увеличить срок службы жесткого диска, т.к. он используется только в начале и в конце работы с программой. Объем, же, оперативной памяти на современных компьютерах позволяет вполне успешно оперировать с файлами такого размера.
2. СТРУКТУРА ВХОДНЫХ И ВЫХОДНЫХ ДАННЫХ
Внешние данные, используемые в программе, хранятся в трёх файлах.
flights.dat — файл с информацией об авиарейсах. Состоит из записей — полей класса flight:
int number //Номеррейса
char days[7]// Днинедели
char DeparturePoint[50]//Пунктотправления
char DestinationPoint[50] //Пунктназначения
charDepartureTime[10]//Времяотправления
intclassType[3]//Количествоместпоклассам
intprice[3]//Цена на места по классам
intreservNum;// Количество списков бронирования
days.dat — файл с информацией о занятых местах по дням, в которые совершаются рейсы. Состоит из записей — полей класса reservation:
intreserved[3]; // Количество занятых мест по классам
chardate[30]; // Дата
people.dat — файл со списком людей, которые забронировали места. Состоит из записей — полей класса person:
char name[50]; // Полноеимя
intplaceType; // Тип забронированного места Для хранения и работы с авиарейсами в программе реализован контейнер list, а также итератор для него. Для работы со списком объектов классов reservationи personиспользуется STL-контейнер vector.
3. ОПИСАНИЕ КЛАССОВ
3.1 Классы управления данными
Шаблонный класс-контейнер list. Используется для хранения объектов различных типов.
templateclass list
{
element *start, *last, *after_last; // Указатели на начало и конец списка
int number; // Количество элементов списка
public:
templatefriendclass l_iterator;// Дружественный класс-итератор
templatefriendclass element;// Дружественный класс-элемент
// списка
typedef l_iterator iterator;
int size (); // Возвращает количество элементов списка
void push_back (const ListType &val);// Сохранение элемента в конец списка
void push_front (const ListType &val);// Сохранение элемента в начало списка
// Вставка перед элементом, на который ссылается итератор i
iterator insert (iterator i, const ListType &val);
// Удаляет элементы из диапазона [start;end]
iterator erase (iterator start, iterator end);
iterator erase (iterator del); // Удаляет элемент, на который ссылается итератор del
iterator begin (); // Возвращает итератор на начало списка
iterator end (); // Возвращает итератор на элемент за последним
void clear ();
list ();
~list ();
};
Шаблонный класс-итератор l_iterator. Является итератором для класса-контейнера list.
templateclass l_iterator
{
templatefriendclass list;// Дружественный класс-контейнер
templatefriendclass element;// Дружественный класс-элемент списка
element *cur; // Указатель на хранимый элемент
public:
operatorlonglong ();
ListType&operator*() const;// Доступ к элементу списка через итератор
l_iterator operator++(int x);// Переход к следующему элементу списка
l_iterator operator—(int x);// Переход к предыдущему элементу списка
l_iterator operator=(l_iterator &ptr);
l_iterator operator=(Object ^ ptr);
booloperator==(l_iterator &ptr) { return cur==ptr.cur? 1: 0;}
booloperator≠(l_iterator &ptr) { return cur≠ptr.cur? 1: 0;}
int getNumber (); // Номер элемента по итератору
};
Шаблонный класс element. Является элементом класса-контейнера list и служит для хранения одного объекта.
templateclass element
{
templatefriendclass list; // Дружественный класс-контейнер
templatefriendclass l_iterator; // Дружественный класс-итератор
element *prev, *next; // Указатели на предыдущий и
// следующий элементы
ListType *val; // Указатель на объект
public:
element ();
~element ();
};
Класс-контейнерlastActionsStack. Стек, содержащий объекты класса lastAction. Предназначен для реализации функции отмены последних действий.
templaterefclass lastActionStack
{
lastAction ^top; // Вершина стека
int count;// Количество элементов в стеке
lastAction ^bottom; // Дно стека
public:
int Count ();
lastActionStack ();
~lastActionStack ();
void push (int opType, int index, int dayIndex, DataGridViewRow^ Row, sType &savedObject);// Добавить в стек
returnElement^ pop ();// Достать из стека
void reduce ();// Удалить лишние элементы стека при превышении макс.
// количества
};
3.2 Классы данных
Класс flight — хранит данные об авиарейсах.
class flight
{
int number; // Номер рейса
char days[7]; // Дни недели
char DeparturePoint[50]; // Пункт отправления
char DestinationPoint[50]; // Пункт назначения
char DepartureTime[10]; // Время отправления
int classType[3]; // Количество по классам
int price[3]; // Цена на места по классам
int reservNum; // Количество списков бронирования для рейса
vector reserv; // Списки забронированных местна разные даты
public:
~flight ();
flight ();
void restoreDays ();// Пересборка дней
void reducePeopleLists ();// Удаление забронированных мест на прошедшие даты
void fromFile (ifstream &in);// Прочитать из файлового потока
void toFile (ofstream &out);// Записать в файловый поток
// Getи Set-методы
vector& getReserv (); // Получить ссылку на списки
int getNumber ();
int& СlassType (int i);
void setClassType (String^ cl1, String^ cl2, String^ cl3);
int& Price (int i);
void setPrice (String^ pr1, String^ pr2, String^ pr3);
int getReservNum ();
void setReservNum (int n);
void setNumber (int n);
char& Day (int i);
String^ getDeparturePoint ();
String^ getDestinationPoint ();
String^ getDepartureTime ();
void setDeparturePoint (String^ s);
voidsetDestinationPoint (String^ s);
void setDepartureTime (String^ s);
};
Класс reservation — хранит данные о занятых местах по дням, в которые совершаются рейсы.
class reservation
{
vector people; // Список людей на данный рейс
int reserved[3]; // Количество занятых мест по классам
char date[30]; // Дата
public:
reservation ();
~reservation ();
// Getи Set-методы
int& Reserved (int i);
String^ getDate ();
void setDate (String^ s);
vector& getPeople ();
void fromFile (ifstream &in); // Прочитать из файлового потока
void toFile (ofstream &out); // Записать в файловый поток
};
Класс person — хранит данные человеке, забронировавшем место.
class person
{
char name[50]; // Полное имя
int placeType;
public:
person ();
person (String^ s, char t);
// Getи Set-методы
String^ getName ();
int getPlaceType ();
void setName (String^ s);
void setPlaceType (int t)
};
Статический класс data. Хранит объекты, используемые во всей программе в единственном экземпляре.
class data
{
public:
static list lst; // Список авиарейсов
static list: iterator iter; // Итератор для списка
static flight currentFlight;// Объект класса flight
staticint autosaveInterval;// Период автосохранения (мин)
staticvoid loadFromFile (); // Загрузить данные из файла
staticvoid saveToFile (); // Сохранить данные в файл
};
3.3 Классы исключений
Класс baseException — абстрактный базовый класс исключений.
class baseException
{
protected:
char* code; // Код ошибки
char* description; // описание ошибки
public:
baseException (char* code, char* description);
virtualvoid showException () = 0; // Сообщение об исключительной ситуации
virtual ~baseException ();
};
Класс fileError. Используется при возникновении файловых ошибок.
class fileError: public baseException
{
public:
fileError (char* code, char* description): baseException (code, description);
void showException (); // Сообщение об исключительной ситуации
};
Класс fillException. Используется, еслинеправильно заполнены поля в некоторых формах.
class fillException: public baseException
{
public:
fillException (char* code, char* description): baseException (code, description);
void showException () // Сообщение об исключительной ситуации
};
3.4 Структура таблиц, используемых в программе
Таблица flightsView — список авиарейсов.
№ авиарейса.
Пункт отправления.
Пункт назначения.
Дни.
Время отправления.
(скрытый столбец) Итератор, указывающий на данный авиарейс в контейнере list.
Таблица reservedView — список забронированныхмест.
№ п/п.
Имя.
Тип места.
4. ОПИСАНИЕ АЛГОРИТМОВ РЕШЕНИЯ ЗАДАЧИ
Начало.
Объявление переменной idxтипа int для хранения значения количества строк в таблице flightsView.
Объявление объекта типа EditForm^.
Запуск диалогового окна EditForm.
Если результат диалога EditForm положительный, то переход к шагу 6, иначепереход к шагу 12.
Добавление пустой строки в таблицу flightsView.
Присвоение переменной idx значения количества строк в таблице flightsView.
Выполнение функции loadFromFlight (data:currentFlight, idx-1), которая загружает в последнюю строку таблицы, заполненные в диалоге поля об авиарейсе.
Выполнение функции data: lst. push_back (data:currentFlight), которая добавляет авиарейс в контейнер list.
Выполнение функции UndoStack->push () — добавления данного действия в стек последних действий.
Присвоение скрытой ячейке таблицы flightsView итератора на последний элемент списка list.
Конец.
ФункцияSystem:Void DeleteButton_Click (System:Object^ sender, System: EventArgs^ e) — удаление авиарейса Начало.
Объявление переменной idxтипа int и присвоение ей номера текущей строки в таблице flightsView.
Присвоение статической переменной data: iter значения итератора, указывающего на элемент в контейнере list, соответствующий строке таблицы flightsView.
Выполнение функции UndoStack->push () — добавления данного действия в стек последних действий.
Выполнение функции data: lst. erase (data:iter), которая удаляет авиарейс из контейнера list.
Удаление строки из таблицы по её номеру idx.
Конец.
ЗАКЛЮЧЕНИЕ
В результате работы создана программа для управления авиарейсами, в которой реализованы функции добавления, удаления, изменения, поиска. Так же хочется отметить, что присутствует возможность отмены последнего действия, поэтому в случае удаления информации её можно вернуть без потерь.
Программный продукт выполнен в системе MicrosoftVisual C++ 2010 с использованиеминтерфейса программирования приложенийWindows Forms.
В качестве расширения можно реализовать более удобный интерфейс, сортировку по полям, улучшить качество поиска.
1. Шилдт Г. Полный справочник по С++. 4-е издание — Издательский дом «Вильямс», Москва, Санкт-Петербург, Киев, 2006 г.
2. Луцик Ю. А., Ковальчук А. М., Лукьянова И. А — Учебное пособие покурсу «Основы алгоритмизации и программирования» — БГУИР, Минск, 2007.
3. Лафоре Р., — «Объектно-ориентированное программирование вС++» — Издательство «Питер», Санкт-Петербург, 2011.
4. Библиотека MSDN[Электронный ресурс] /Microsoft Corp. — 2012 — Режим доступа: http://msdn.microsoft.com/ru-ru/library/, свободный. — Загл. с экрана.
ПРИЛОЖЕНИЕ А
Диаграмма классов
ПРИЛОЖЕНИЕ Б
Блок-схемы алгоритмов
управление данные таблица программа алгоритм
Функция System: VoidUndoButton_Click (System:Object^ sender, System: EventArgs^ e) — отмена последнего действия с рейсами
ПРИЛОЖЕНИЕ В
Скриншоты с результатами работы
ПРИЛОЖЕНИЕ Г
Листинг программы
MainForm.h
// Загрузка из объекта класса flight в строку таблицы
private: void loadFromFlight (flight &flt, int idx)
{
flightsView->Rows[idx]->Cells[0]->Value = flt. getNumber ();
flightsView->Rows[idx]->Cells[1]->Value = flt. getDeparturePoint ();
flightsView->Rows[idx]->Cells[2]->Value = flt. getDestinationPoint ();
arraydays = gcnewarray {" пн" ," вт" ," ср" ," чт" ," пт" ," сб" ," вс" };
String^ s; int count=0;
for (int i=0; i<7; i++)
if (flt.Day (i)) { if (!s) s+=days[i]; else s+=", «+days[i]; count++;}
if (count==7) s="Ежедневно" ;
flightsView->Rows[idx]->Cells[3]->Value = s;
flightsView->Rows[idx]->Cells[4]->Value = flt. getDepartureTime ();
}
// Установка состояний всех кнопок в зависимости от наличия строк в таблице
private: void setAllButtonsState ()
{
if (!flightsView->RowCount)
{
DeleteButton->Enabled = false; toolStripDeleteButton->Enabled = false;
DeleteToolStripMenuItem->Enabled = false;
EditButton->Enabled = false; toolStripEditButton->Enabled = false;
EditToolStripMenuItem->Enabled = false;
InfoButton->Enabled = false; toolStripInfoButton->Enabled = false;
}
else
{
DeleteButton->Enabled = true; toolStripDeleteButton->Enabled = true;
DeleteToolStripMenuItem->Enabled = true;
EditButton->Enabled = true; toolStripEditButton->Enabled = true;
EditToolStripMenuItem->Enabled = true;
InfoButton->Enabled = true; toolStripInfoButton->Enabled = true;
}
}
// Поведение главной формы при запуске
private: System: Void MainForm_Load (System:Object^ sender, System: EventArgs^ e)
{
data:loadFromFile (); // Загрузка из файла
this->timer1->Interval = data: autosaveInterval; // Установка периода // автосохранения
data:iter = data: lst. begin ();
for (int i=0; i
{
flightsView->Rows->Add ();// Добавляем строку таблицы
// Добавляем итератор на последний элемент в скрытый столбец таблицы
flightsView->Rows[i]->Cells[5]->Value = (longlong) data: iter;
loadFromFlight (*data:iter, i); // Загружаем информацию в строку
data:iter++;
}
setAllButtonsState (); // Установка состояний всех кнопок в зависимости от
// наличия строк в таблице
}
// Кнопка «Добавить» в меню
private: System: Void AddToolStripMenuItem_Click (System:Object^ sender, System: EventArgs^ e)
{
AddButton_Click (sender, e);
}
// Кнопка «Изменить» в меню
private: System: Void EditToolStripMenuItem_Click (System:Object^ sender, System: EventArgs^ e)
{
EditButton_Click (sender, e);
}
// Кнопка «Удалить» в меню
private: System: Void DeleteToolStripMenuItem_Click (System:Object^ sender, System: EventArgs^ e)
{
DeleteButton_Click (sender, e);
}
// Добавление рейса
private: System: Void AddButton_Click (System:Object^ sender, System: EventArgs^ e)
{
EditFormform = gcnew EditForm ();
System:Windows:Forms:DialogResult dr;
dr=form->ShowDialog ();
// Если результат диалога положителен, то новй рейс в data: currentFlight
if (dr==System:Windows:Forms:DialogResult:OK)
{
UndoButton->Enabled = true; UndoToolStripMenuItem->Enabled = true;
flightsView->Rows->Add ();// Добавляем строку таблицы
int idx = flightsView->RowCount;// Количество строк
loadFromFlight (data:currentFlight, idx-1); // Загружаем строку в таблицу
data:lst.push_back (data:currentFlight); // Добавляем рейс в конец списка
// Добавление в стек отмены
StaticUndoStack:flightStack->push (1,data:lst.size ()-1, -1,
flightsView->Rows[idx-1], data: currentFlight);
// Добавляем итератор на последний элемент в скрытый столбец таблицы
flightsView->Rows[idx-1]->Cells[5]->Value = (longlong) data: lst. end ()—;
setAllButtonsState (); // Установка состояний всех кнопок в зависимости от
// наличия строк в таблице
}
}
// Изменение авиарейса
private: System: Void EditButton_Click (System:Object^ sender, System: EventArgs^ e)
{
int idx = flightsView->CurrentRow->Index;// Текущая строка
data:iter = flightsView->Rows[idx]->Cells[5]->Value; // Итератор на элемент,
// соотв. строке
data:currentFlight = *data:iter;
EditFormform = gcnew EditForm (true, flightsView->Rows[idx]);
System:Windows:Forms:DialogResult dr;
dr=form->ShowDialog ();
if (dr==System:Windows:Forms:DialogResult:OK)// Если результат диалога OK
{
UndoButton->Enabled = true; UndoToolStripMenuItem->Enabled = true;
data:currentFlight.reducePeopleLists (); // Подправляем списки людейloadFromFlight (data:currentFlight, idx); // Загружаем строку в таблицу
*data:iter = data: currentFlight; // Присваиваем редактируемому элементу
// списка изменённую версию
}
}
//Удаление авиарейса
private: System: Void DeleteButton_Click (System:Object^ sender, System: EventArgs^ e)
{
UndoButton->Enabled = true; UndoToolStripMenuItem->Enabled = true;
int idx = flightsView->CurrentRow->Index; // Текущая строка
data:iter = flightsView->CurrentRow->Cells[5]->Value; // Итератор на элемент,
// соотв. строке
// Добавление в стек отмены
StaticUndoStack:flightStack->push (3,data:iter.getNumber (), -1,
flightsView->Rows[idx],*(data:iter));
data:lst.erase (data:iter); // Удаляем элемент из списка
flightsView->Rows->RemoveAt (idx); // Удаляем из таблицы
setAllButtonsState ();// Установка состояний всех кнопок
// в зависимости от наличия строк в таблице
}
// Кнопка «Информация об авирейсе и бронирование билетов»
private: System: Void InfoButton_Click (System:Object^ sender, System: EventArgs^ e)
{
data:iter = flightsView->CurrentRow->Cells[5]->Value; // Итератор на элемент,
// соотв. строке
ReservationFormf = gcnew ReservationForm ();
f->ShowDialog ();
}
// Кнопка «Выход» в меню
private: System: Void выходToolStripMenuItem_Click (System:Object^ sender, System: EventArgs^ e)
{
this->Close ();
}
// «Сохранить» в меню
private: System: Void сохранитьToolStripMenuItem_Click (System:Object^ sender, System: EventArgs^ e)
{
data:saveToFile ();
}
// «Добавить» в панели инструментов
private: System: Void toolStripAddButton_Click (System:Object^ sender, System: EventArgs^ e)
{
AddButton_Click (sender, e);
}
// Поиск
private: System: Void toolStripSearchButton_Click (System:Object^ sender, System: EventArgs^ e)
{
SearchForm^ f = gcnew SearchForm (flightsView);
f->ShowDialog ();
}
// «Удалить» в панели инструментов
private: System: Void toolStripDeleteButton_Click (System:Object^ sender, System: EventArgs^ e)
{
DeleteButton_Click (sender, e);
}
// «Изменить» в панели инструментов
private: System: Void toolStripEditButton_Click (System:Object^ sender, System: EventArgs^ e)
{
EditButton_Click (sender, e);
}
// «Бронирование билетов и информация об авиарейсе» в панели инструментов
private: System: Void toolStripInfoButton_Click (System:Object^ sender, System: EventArgs^ e)
{
InfoButton_Click (sender, e);
}
// Отмена последних действий
private: System: Void UndoButton_Click (System:Object^ sender, System: EventArgs^ e)
{
returnElement^ temp = StaticUndoStack: flightStack->pop ();
if (temp->opType == 1) // Если отмена добавления
flightsView->Rows->RemoveAt (temp->index);
else// Если отмена удаления или изменения
{
if (temp->opType == 3) // Если отмена удаления
flightsView->Rows->Insert (temp->index, 1); // Вставляем пустую строку
for (int i=0; i < temp->Row->Cells->Count; i++)
flightsView->Rows[temp->index]->Cells[i]->Value =
temp->Row->Cells[i]->Value; // Копируем содержимое строки
}
if (!StaticUndoStack:flightStack->Count ()) { UndoButton->Enabled = false; UndoToolStripMenuItem->Enabled = false;}
setAllButtonsState (); // Установка состояний всех кнопок в зависимости от // наличия строк в таблице
}
// Действия при закрытии формы
private: System: Void MainForm_FormClosed (System:Object^ sender, System: Windows:Forms:FormClosedEventArgs^ e)
{
data:saveToFile ();
}
// Кнопка отмены в меню
private: System: Void UndoToolStripMenuItem_Click (System:Object^ sender, System: EventArgs^ e)
{
UndoButton_Click (sender, e);
}
// Автосохранение
private: System: Void timer1_Tick (System:Object^ sender, System: EventArgs^ e)
{
data:saveToFile ();
}
// Кнопка «О программе» в панели инструментов
private: System: Void toolStripAbout_Click (System:Object^ sender, System: EventArgs^ e)
{
Aboutform = gcnew About;
form->ShowDialog ();
}
// Кнопка «О программе» в меню
private: System: Void AboutToolStripMenuItem_Click (System:Object^ sender, System: EventArgs^ e)
{
Aboutform = gcnew About;
form->ShowDialog ();
}
// Кнопка «Настройки» в меню
private: System: Void SettingsToolStripMenuItem_Click (System:Object^ sender, System: EventArgs^ e)
{
Settingsform = gcnew Settings (timer1);
form->ShowDialog ();
}
ReservationForm.h
// Загрузка из списка забронированных мест в таблицу
private: void loadFromPeople ()
{
reservedView->Rows->Clear (); // Очищаем таблицу
// Количество человек на данную дату
int size = (*data:iter).getReserv ()[listBox1->SelectedIndex]. getPeople ().size ();
if (!size)
{
DeleteButton->Enabled = false; EditButton->Enabled = false;
return;
}
else { DeleteButton->Enabled = true; EditButton->Enabled = true; }
for (int i=0; i
{
reservedView->Rows->Add ();// Добавляем строку таблицы
reservedView->Rows[i]->Cells[0]->Value = i+1;// Номер с единицы
// Заполняем ячейки таблицы
reservedView->Rows[i]->Cells[1]->Value =(*data:iter).getReserv ()
[listBox1->SelectedIndex]. getPeople ()[i].getName ();
reservedView->Rows[i]->Cells[2]->Value = (*data:iter).getReserv ()
[listBox1->SelectedIndex]. getPeople ()[i].getPlaceType () + «класс» ;
}
}
// Установка состояния клавиши «Добавить»
private: void setAddReservedButtonState ()
{
if ((comboBox1->SelectedIndex==0 && (*data:iter).getReserv ()[listBox1->SelectedIndex]. Reserved (0) >= (*data:iter).СlassType (0))
|| (comboBox1->SelectedIndex==1 && (*data:iter).getReserv ()[listBox1->SelectedIndex]. Reserved (1) >= (*data:iter).СlassType (1))
|| (comboBox1->SelectedIndex==2 && (*data:iter).getReserv ()[listBox1->SelectedIndex]. Reserved (2) >= (*data:iter).СlassType (2)))
{AddReservedButton->Enabled = false; }
else {AddReservedButton->Enabled = true; }
}
// Установка количества свободных мест на форме
private: void UpdateFreeLabels (int SelectedItem)
{
int free = (*data:iter).СlassType (0) -// Кол-во свободных мест
(*data:iter).getReserv ()[SelectedItem]. Reserved (0);
label17->Text = Convert: ToString (free);// Обновление на форме
free = (*data:iter).СlassType (1) ;
(*data:iter).getReserv ()[SelectedItem]. Reserved (1);
label18->Text = Convert: ToString (free);
free = (*data:iter).СlassType (2) ;
(*data:iter).getReserv ()[SelectedItem]. Reserved (2);
label19->Text = Convert: ToString (free);
}
// Поведение формы при загрузке
private: System: Void ReservationForm_Load (System:Object^ sender, System: EventArgs^ e)
{
(*data:iter).restoreDays (); // Добавляем/Удаляем необходимые дни
this->Text = «Рейс № «+ (*data:iter).getNumber () + «. Информация и бронирование
мест" ;
for (int i=0; i<(*data:iter).getReserv ().size (); i++)
listBox1->Items->Add ((*data:iter).getReserv ()[i]. getDate ());
// Заполнение на форме информации о местах
label4->Text = Convert: ToString ((*data:iter).СlassType (0));
label9->Text = Convert: ToString ((*data:iter).Price (0));
label10->Text = Convert: ToString ((*data:iter).СlassType (1));
label11->Text = Convert: ToString ((*data:iter).Price (1));
label12->Text = Convert: ToString ((*data:iter).СlassType (2));
label13->Text = Convert: ToString ((*data:iter).Price (2));
listBox1->SelectedIndex = 0;
comboBox1->SelectedIndex = 0;
}
// Добавление человека
private:System:Void AddReservedButton_Click (System:Object^sender, System: EventArgs^e)
{
try{
if (textBox1->Text=="") throw fillException («4″ ,» Введите имя!");
// Установка состояний конопок
EditButton->Enabled = true; DeleteButton->Enabled = true;
UndoButton->Enabled = true;
reservedView->Rows->Add ();// Добавляем строку таблицы
int idx = reservedView->RowCount-1; // Индекс последней добавленной строки
// Установка номеров по порядку
if (idx == 0) reservedView->Rows[idx]->Cells[0]->Value = 1;
else reservedView->Rows[idx]->Cells[0]->Value =
((int) reservedView->Rows[idx-1]->Cells[0]->Value)+1;
// Заполнение строки таблицы значениями TextBox’ов
reservedView->Rows[idx]->Cells[1]->Value = textBox1->Text;
reservedView->Rows[idx]->Cells[2]->Value =
comboBox1->SelectedItem->ToString ();
char classN = (char)comboBox1->SelectedIndex+1;//Выбранный тип места
// Добавление в вектор
(*data:iter).getReserv ()[listBox1->SelectedIndex].
getPeople ().push_back (person (textBox1->Text, classN));
(*data:iter).getReserv ()[listBox1->SelectedIndex].
Reserved (comboBox1->SelectedIndex)++;
vector:iterator itr =
(*data:iter).getReserv ()[listBox1->SelectedIndex]. getPeople ().end () — 1;
// Добавление в стек отмены
StaticUndoStack:personStack->push (1, idx, listBox1->SelectedIndex,
reservedView->Rows[idx], *itr);
// Установка текущей строки
reservedView->CurrentCell = reservedView->Rows[idx]->Cells[0];
reservedView_SelectionChanged (sender, e);// Обработка изменения текущей
// строки
setAddReservedButtonState ();// Состояние клавиши «Добавить»
UpdateFreeLabels (listBox1->SelectedIndex); // Обновляем количество
// свободных мест
} catch (baseException &e) {e.showException ();}
}
// Изменение выделения даты
private: System: Void listBox1_SelectedIndexChanged (System:Object^ sender, System: EventArgs^ e)
{
UpdateFreeLabels (listBox1->SelectedIndex);// Обновление информации о
// свободных местах
loadFromPeople ();// Загрузка списка в таблицу
setAddReservedButtonState ();// Состояние клавиши «Добавить»
reservedView_SelectionChanged (sender, e);// Обработка изменения выделения
StaticUndoStack:personStack->~lastActionStack (); // Очистка стека
UndoButton->Enabled = false;// Отключение отмены
}
// Выделение новой строки в таблице
private: System: Void reservedView_SelectionChanged (System:Object^ sender, System: EventArgs^ e)
{
if (!reservedView->RowCount) return;// Если таблица пуста
elseif (Convert:ToString (reservedView->Rows[0]->Cells[1]->Value)=="") return;
int idx = reservedView->CurrentRow->Index; // Текущая строка
// Заполнение textBox’а и comboBox’а именем и типом места
textBox1->Text = Convert: ToString (reservedView->Rows[idx]->Cells[1]->Value);
int classN = Convert: ToString (reservedView->Rows[idx]->Cells[2]->Value)[0];
comboBox1->SelectedIndex = classN — 49;
}
// Удаление человека из списка
private: System: Void DeleteButton_Click (System:Object^ sender, System: EventArgs^ e)
{
int i = reservedView->CurrentRow->Index;
int prevType = (*data:iter).getReserv ()[listBox1->SelectedIndex].
getPeople ()[i].getPlaceType ();
//i — номер удаляемого человека (если считать с 1)
i = Convert: ToInt32(reservedView->Rows[i]->Cells[0]->Value);
vector:iterator itr = (*data:iter).// Итератор на удалемого человека
getReserv ()[listBox1->SelectedIndex]. getPeople ().begin () + i-1;
// Добавление в стек отмены
StaticUndoStack:personStack->push (3, i-1, listBox1->SelectedIndex,
reservedView->CurrentRow, *(itr));
(*data:iter).getReserv ()[listBox1->SelectedIndex]. Reserved (prevType-1)—;
UpdateFreeLabels (listBox1->SelectedIndex); // Обновляем количество свободных мест
// Удаляем из таблицы и вектора
reservedView->Rows->RemoveAt (reservedView->CurrentRow->Index);
(*data:iter).getReserv ()[listBox1->SelectedIndex]. getPeople ().erase (itr);
// Установка состояний кнопок в зависимости от наличия строк в таблице
if (!reservedView->RowCount)
{DeleteButton->Enabled = false; EditButton->Enabled = false;}
for (i=0; iRowCount; i++)
reservedView->Rows[i]->Cells[0]->Value = i+1;
setAddReservedButtonState ();
UndoButton->Enabled = true;
}
// Изменение информации о человеке
private: System: Void EditButton_Click (System:Object^ sender, System: EventArgs^ e)
{
try{
if (textBox1->Text=="") throw fillException («4″ ,» Необходимо ввести имя пассажира!");// Если поле имени пусто
int idx = reservedView->CurrentRow->Index;// Номер текущей строки
int prevType = (*data:iter).getReserv ()[listBox1->SelectedIndex]. getPeople ()[idx].getPlaceType ();// Тип места до изменения
if ((prevType-1)≠comboBox1->SelectedIndex) // Если не совпадают типы мест
{// до изменеия и после
(*data:iter).getReserv ()[listBox1->SelectedIndex].
Reserved (prevType-1)—;
(*data:iter).getReserv ()[listBox1->SelectedIndex].
Reserved (comboBox1->SelectedIndex)++;
}
else// Если содержимое полей не изменено, то выход из функции
if (Convert:ToString (reservedView->Rows[idx]->Cells[1]->Value) ==
textBox1->Text)
return;
// Итератор на начало вектора забронированных мест
vector:iterator itr = (*data:iter).getReserv ()
[listBox1->SelectedIndex]. getPeople ().begin ();
// Добавление в стек отмены
StaticUndoStack:personStack->push (2, idx, listBox1->SelectedIndex, reservedView->Rows[idx], *(itr+idx));
// Изменение ячеек в таблице
reservedView->Rows[idx]->Cells[1]->Value = textBox1->Text;
reservedView->Rows[idx]->Cells[2]->Value = comboBox1->SelectedItem->ToString ();
int classN = (int)comboBox1->SelectedIndex+1;// Тип выбранного места
// Изменение в элементе вектора
(*data:iter).getReserv ()[listBox1->SelectedIndex]. getPeople ()[idx].setName (textBox1->Text);
(*data:iter).getReserv ()[listBox1->SelectedIndex].getPeople ()[idx].setPlaceType (classN);
UpdateFreeLabels (listBox1->SelectedIndex);// Установка свободных мест
// Установка состояний кнопок
setAddReservedButtonState ();
UndoButton->Enabled = true;
} catch (baseException &e) { e. showException (); }
}
// Изменение типа места в выпадающем списке
private: System: Void comboBox1_SelectedIndexChanged (System:Object^ sender, System: EventArgs^ e)
{
// Если список забронированных мест не пуст
if ((*data:iter).getReserv ()[listBox1->SelectedIndex]. getPeople ().size ())
{
//prevType — предыдущий тип места
int prevType = (*data:iter).getReserv ()[listBox1->SelectedIndex]. getPeople ()[reservedView->CurrentRow->Index].getPlaceType ();
// Если мест выбранного типа не осталось
if ((*data:iter).getReserv ()[listBox1->SelectedIndex]. Reserved (comboBox1->SelectedIndex) == (*data:iter).СlassType (comboBox1->SelectedIndex))
comboBox1->SelectedIndex = prevType-1;// Устанавливаем предыдущий тип
}
setAddReservedButtonState ();// Установка состояния кнопки «Добавить»
}
// Отмена последнего действия
private: System: Void UndoButton_Click (System:Object^ sender, System: EventArgs^ e)
{// Извлечение элемента из стека
returnElement^ temp = StaticUndoStack: personStack->pop ();
if (temp->opType == 1) // Если отмена добавления
reservedView->Rows->RemoveAt (temp->index);
else// Если отмена удаления или изменения
{
if (temp->opType == 3) // Если отмена удаления
{// Вставляем пустую строку
reservedView->Rows->Insert (temp->index, 1);
for (int i=0; iRowCount; i++) // Перенумеровка
reservedView->Rows[i]->Cells[0]->Value = i+1;
}
else// Если отмена изменения
{
int prevType = Convert: ToString (reservedView->Rows[temp->index]->Cells[2]->Value)[0] - 49;
int newType = Convert: ToString (temp->Row->Cells[2]->Value)[0] - 49;
if (prevType≠newType)// Если прердыдущий тип места не равен новому
{
(*data:iter).getReserv ()[listBox1->SelectedIndex]. Reserved (prevType)—;
(*data:iter).getReserv ()[listBox1->SelectedIndex].Reserved (newType)++;
}
}
for (int i=0; i < temp->Row->Cells->Count; i++)
reservedView->Rows[temp->index]->Cells[i]->Value = temp->Row->Cells[i]->Value; // Копируем содержимое строки
}
setAddReservedButtonState ();// Установка состояния кнопки «Добавить»
UpdateFreeLabels (listBox1->SelectedIndex); // Обновляем количество свободных мест
// Установка состояний кнопок «Отменить» и «Удалить»
if (!StaticUndoStack:personStack->Count ())
UndoButton->Enabled = false;
if (!reservedView->RowCount)
{ DeleteButton->Enabled = false; EditButton->Enabled = false; }
else { DeleteButton->Enabled = true; EditButton->Enabled = true; }
}
// Отмена через Ctrl+Z
private: System: Void ReservationForm_KeyDown (System:Object^ sender, System: Windows:Forms:KeyEventArgs^ e)
e->Handled = true;
if (e->KeyData==(Keys:Control
SearchForm.h
// Поиск
private: System: Void FindButton_Click (System:Object^ sender, System: EventArgs^ e)
{
char flag;
foundFlightsView->Rows->Clear ();// Очищаем таблицу
if (textBox1->Text=="" && textBox2->Text=="" && textBox3->Text=="" && !checkedListBox1->CheckedItems->Count)// Если условия поиска не заданы
return;
for (int i=0; iRowCount; i++)
{
flag=0;
if ((textBox1->Text=="" || Convert: ToInt32(dataGridMain->Rows[i]->Cells[0]->Value) == Convert: ToInt32(textBox1->Text)) && ((Convert:ToString (dataGridMain->Rows[i]->Cells[1]->Value) == textBox2->Text) || textBox2->Text=="") && ((Convert:ToString (dataGridMain->Rows[i]->Cells[2]->Value) == textBox3->Text)|| textBox3->Text==""))// Если заполнено хотя бы одно из полей и элемент найден
{
for (int j=0; jItems->Count; j++)
{// Итератор на элемент, соотв. строке
data:iter = dataGridMain->Rows[i]->Cells[5]->Value;// Если рейс не летает по выбранным дням
if (checkedListBox1->GetItemCheckState (j) == CheckState: Checked && !(*data:iter).Day (j))
{ flag = 1; break; } // Флаг несовпадения дней
}
// Если дни не выбраны или выбранные дни совпадают
if (!checkedListBox1->CheckedItems->Count || flag==0)
{
array