Программный модуль управления авиарейсами
Типы моделей данных: иерархическая, сетевая, реляционная. Структура входных и выходных данных. Классы управления данными, исключений. Структура таблиц, используемых в программе. Описание алгоритмов решения задачи. Диаграммы классов, блок-схемы алгоритмов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 22.06.2012 |
Размер файла | 1,5 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
ВВЕДЕНИЕ
В качестве средств для написания программы были выбраны язык программирования 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. Используется для хранения объектов различных типов.
template<class ListType>class list
{
element<ListType> *start, *last, *after_last; // Указатели на начало и конец списка
int number; // Количество элементов списка
public:
template<class ListType>friendclass l_iterator;// Дружественный класс-итератор
template<class ListType>friendclass element;// Дружественный класс-элемент
// списка
typedef l_iterator<ListType> 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.
template<class ListType>class l_iterator
{
template<class ListType>friendclass list;// Дружественный класс-контейнер
template<class ListType>friendclass element;// Дружественный класс-элемент списка
element<ListType> *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 и служит для хранения одного объекта.
template<class ListType>class element
{
template<class ListType>friendclass list; // Дружественный класс-контейнер
template<class ListType>friendclass l_iterator; // Дружественный класс-итератор
element *prev, *next; // Указатели на предыдущий и
// следующий элементы
ListType *val; // Указатель на объект
public:
element();
~element();
};
Класс-контейнерlastActionsStack. Стек, содержащий объекты класса lastAction. Предназначен для реализации функции отмены последних действий.
template<class sType>refclass lastActionStack
{
lastAction<sType> ^top; // Вершина стека
int count;// Количество элементов в стеке
lastAction<sType> ^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<reservation> reserv; // Списки забронированных местна разные даты
public:
~flight();
flight();
void restoreDays();// Пересборка дней
void reducePeopleLists();// Удаление забронированных мест на прошедшие даты
void fromFile(ifstream &in);// Прочитать из файлового потока
void toFile(ofstream &out);// Записать в файловый поток
// Get- и Set-методы
vector<reservation>& 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<person> people; // Список людей на данный рейс
int reserved[3]; // Количество занятых мест по классам
char date[30]; // Дата
public:
reservation();
~reservation();
// Get- и Set-методы
int& Reserved(int i);
String^ getDate();
void setDate (String^ s);
vector<person>& 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<flight> lst; // Список авиарейсов
static list<flight>::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();
array<String^> ^days = gcnewarray<String^> {"пн","вт","ср","чт","пт","сб","вс"};
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<data::lst.size(); 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)
{
EditForm ^form = 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;
EditForm ^form = 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; // Итератор на элемент,
// соотв. строке
ReservationForm ^f = 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)
{
About ^form = gcnew About;
form->ShowDialog();
}
// Кнопка "О программе" в меню
private: System::Void AboutToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
About ^form = gcnew About;
form->ShowDialog();
}
// Кнопка "Настройки" в меню
private: System::Void SettingsToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
Settings ^form = 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<size; 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<person>::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<person>::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; i<reservedView->RowCount; 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<person>::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; i<reservedView->RowCount; 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 | Keys::Z) && StaticUndoStack:: personStack->Count())
UndoButton_Click(sender,e);
}
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; i<dataGridMain->RowCount; 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; j<checkedListBox1->Items->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<Object^> ^rowData = gcnewarray<Object^>(dataGridMain->Rows[i]->Cells->Count);// Копируем строку из основной таблицы
for (int j=0; j<rowData->Length; j++)rowData[j] = dataGridMain->Rows[i]->Cells[j]->Value;
foundFlightsView->Rows->Add(rowData);// Добавляем строку
}
}
}
}
// Контроль на ввод только цифр в номер рейса
private: System::Void textBox1_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
{
if (e->KeyChar >= '0'&& e->KeyChar <= '9' || e->KeyChar==8)
e->Handled = false;
else e->Handled = true;
}
// Двойной щелчок на строке таблицы
private: System::Void foundFlightsView_CellDoubleClick(System::Object^ sender, System::Windows::Forms::DataGridViewCellEventArgs^ e)
{
data::iter = foundFlightsView->CurrentRow->Cells[5]->Value; // Итератор на // элемент, соотв. строке
ReservationForm ^f = gcnew ReservationForm();
f->ShowDialog();
}
Settings.h
// Нажатие кнопки «Отмена»
private: System::Void CancelButton_Click(System::Object^ sender, System::EventArgs^ e)
{
this->Close();
}
// Нажатие кнопки «OK»
private: System::Void OkButton_Click(System::Object^ sender, System::EventArgs^ e)
{
// Изменение максимального количества отменяемых действий
StaticUndoStack::MaxActionsNum = (int)numericUpDown1->Value;
StaticUndoStack::flightStack->reduce(); // Изменение размера стека при // необходимости
timer1->Interval = (int)numericUpDown2->Value*60000; // Изменяем интервал таймера
// в главной форме
data::autosaveInterval = (int) timer1->Interval;// Период автосохранения
this->Close();
}
// Загрузка формы «Настройки»
private: System::Void Settings_Load(System::Object^ sender, System::EventArgs^ e)
{
numericUpDown1->Value = StaticUndoStack::MaxActionsNum;// Максимальное количество
// отменяемых действий
numericUpDown2->Value = timer1->Interval/60000;// Период автосохранения
}
EditForm.h
// Загрузка формы добавления/редактирования
private: System::Void EditForm_Load(System::Object^ sender, System::EventArgs^ e)
{
// Если в вызывающей форме нажата кнопка "Изменить", а не добавить
if(editingMode)
{
// Заполняем TextBox'ы
textBox1->Text = Convert::ToString(data::currentFlight.getNumber());
textBox2->Text = data::currentFlight.getDeparturePoint();
textBox3->Text = data::currentFlight.getDestinationPoint();
textBox4->Text = Convert::ToString(data::currentFlight.СlassType(0));
textBox5->Text = Convert::ToString(data::currentFlight.Price(0));
textBox6->Text = Convert::ToString(data::currentFlight.СlassType(1));
textBox7->Text = Convert::ToString(data::currentFlight.Price(1));
textBox8->Text = Convert::ToString(data::currentFlight.СlassType(2));
textBox9->Text = Convert::ToString(data::currentFlight.Price(2));
// Устанавливаем дни недели
for(int i=0; i<checkedListBox1->Items->Count; i++)
checkedListBox1->SetItemCheckState(i,(CheckState)data::currentFlight.Day(i));
// Устанавливаем время отправления
dateTimePicker1->Value =
DateTime::Parse(data::currentFlight.getDepartureTime());
}
}
// Проверка ввода только цифр в TextBox'ы
private: void numberOnlyControl(System::Windows::Forms::KeyPressEventArgs^ e)
{
if (e->KeyChar >= '0'&& e->KeyChar <= '9' || e->KeyChar==8)
e->Handled = false;
else e->Handled = true;
}
// Проверка на дубликаты рейсов
private: bool checkCopy(int number)
{
list<flight>::iterator iterator;
for(iterator = data::lst.begin(); iterator!=data::lst.end(); iterator++)
{// Если указан уже существующий рейс
if((number==(*iterator).getNumber() && !editingMode) || (number==(*iterator).getNumber() && (*data::iter).getNumber()!=number && editingMode))
returntrue;
}
returnfalse;
}
// Нажатие ОК
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
try{
if(editingMode) // Если режим редактирования
StaticUndoStack::flightStack->push(2,data::iter.getNumber(),-1,Row,data::currentFlight);// Добавляем в стек отмены
for(int i=1; i<10; i++)// Проверяем заполненность textBox'ов
{
TextBox^ t = (TextBox^)this->Controls["textBox"+i.ToString()];
if(t->Text=="") throw fillException("2","Необходимо заполнить все поля!");
}
// Если рейс уже существует и/или не выбраны дни
if(checkCopy(Convert::ToInt32(textBox1->Text))) throw fillException("4","Данный рейс уже существует");
if(checkedListBox1->CheckedItems->Count==0) throw fillException("3","Выберите дни, по которым совершается рейс!");// Добавляем в текущий рейс информацию из полей формы
data::currentFlight.setNumber(Convert::ToInt32(textBox1->Text));
data::currentFlight.setDeparturePoint(textBox2->Text);
data::currentFlight.setDestinationPoint(textBox3->Text);
data::currentFlight.setClassType(textBox4->Text, textBox6->Text, textBox8->Text);
data::currentFlight.setPrice(textBox5->Text, textBox7->Text, textBox9->Text);
// Копируем время отправления
data::currentFlight.setDepartureTime(dateTimePicker1->Value.ToShortTimeString());
// Устанавливаем выбранные дни недели
for(int i=0; i<checkedListBox1->Items->Count; i++)
{
if((int)checkedListBox1->GetItemCheckState(i))
data::currentFlight.Day(i)=1;
else data::currentFlight.Day(i)=0;
}
this->DialogResult=System::Windows::Forms::DialogResult::OK;
this->Close();
}
catch(baseException &e)
{ e.showException();}
}
myList.h
template<class ListType>class list;
template<class ListType>class element;
template<class ListType>class l_iterator;
// Шаблон класса "Список"
template<class ListType>class list
{
element<ListType> *start, *last, *after_last; // Указатели на начало и конец списка
int number;// Количество элементов списка
public:
template<class ListType>friendclass l_iterator;
template<class ListType>friendclass element;
typedef l_iterator<ListType> iterator;
int size() { return number; }// Возвращает количество элементов списка
void push_back (const ListType &val); // Сохранение элемента в конец списка
void push_front (const ListType &val); // Сохранение элемента в начало списка
iterator insert (iterator i, const ListType &val); // Вставка перед элементом, на
// который ссылается итератор i
iterator erase (iterator start, iterator end); // Удаляет элементы из диапазона
// [start;end]
iterator erase (iterator del);// Удаляет элемент, на который
// ссылается итератор del
iterator begin() // Возвращает итератор на начало
// списка
{iterator p;
if(start) p.cur=start;
else p.cur = after_last;
return p;
}
iterator end() {iterator p; p.cur=after_last; return p;} // Возвращает итератор на
// элемент списка, следующий за последним
void clear()
{while(start) {last=start->next; delete[] start; start=last;}
start=last=0; number=0;
after_last=new element<ListType>[1];
after_last->next=0;
}
list() { start=0; last=0; number=0;
after_last=new element<ListType>[1];
after_last->next=0;} // Инициализируем список
// Удаляем весь список
~list() {while(start) { last=start->next; delete[] start; start=last;} }
};
// Шаблон элемента списка
template<class ListType>class element
{
template<class ListType>friendclass list;
template<class ListType>friendclass l_iterator;
element *prev, *next;
ListType *val;
public:
element() {val=new ListType;}
~element() {delete val;}
};
// Шаблон итератора списка
template<class ListType>class l_iterator
{
template<class ListType>friendclass list;
template<class ListType>friendclass element;
element<ListType> *cur;
public:
operatorlonglong () {returnreinterpret_cast<longlong>(cur);}
ListType&operator*() const { return *cur->val; } // Доступ к элементу списка
// через итератор
l_iterator operator++(int x){ cur==0 ? cur: cur=cur->next; return *this; }
l_iterator operator--(int x) { cur==0 ? cur: cur=cur->prev; return *this; }
l_iterator operator=(l_iterator &ptr) { cur=ptr.cur; return *this;}
l_iterator operator=(Object ^ ptr) { longlong tmp = Convert::ToInt64(ptr);cur=reinterpret_cast<element<ListType> *>(tmp); return *this;}
booloperator==(l_iterator &ptr) { return cur==ptr.cur ? 1: 0;}
booloperator!=(l_iterator &ptr) { return cur!=ptr.cur ? 1: 0;}
int getNumber()
{
int num = 0;
element<ListType> *temp = cur;
while (temp->prev!=0)
{
temp = temp->prev;
num++;
}
return num;
}
};
// Вставка элемента в конец списка
template<class ListType>
void list<ListType>::push_back(const ListType &val)
{
if(!last) // Если список пуст
{
last = new element<ListType>[1]; // Создаём новый элемент списка
start=last;
start->prev=0;
}
else
{
last->next= new element<ListType>[1]; // Создаём новый элемент списка
// Связываем элемент с остальными
last->next->prev=last;
last=last->next;
}
last->next=after_last;
after_last->prev=last;
*last->val=val; // Заполняем элемент
number++;// Увеличиваем счётчик элементов списка
}
// Вставка элемента в начало списка
template<class ListType>
void list<ListType>::push_front(const ListType &val)
{
if(!start) // Если список пуст
{
last = new element<ListType>[1]; // Создаём новый элемент списка
start=last;
// Связываем элемент с остальными
last->next=after_last;
after_last->prev=last;
}
else
{
start->prev= new element<ListType>[1]; // Создаём новый элемент списка
// Связываем элемент с остальными
start->prev->next=start;
start=start->prev;
}
start->prev=0;
*start->val=val; // Заполняем элемент
number++;// Увеличиваем счётчик элементов списка
}
// Вставка элемента перед элементом, на который указывает iterator i
template<class ListType>
l_iterator<ListType> list<ListType>::insert(iterator i, const ListType &val)
{
if(!i.cur) return i;
element<ListType> *n;
if(i.cur==after_last && !start) // Если список пуст
{
last = new element<ListType>[1]; // Создаём новый элемент списка
start=last;
// Связываем элемент с остальными
last->next=after_last;
after_last->prev=last;
start->prev=0;
}
else
{
if(i.cur==after_last) // Если итератор указывает на элемент после
// последнего
{
last->next= new element<ListType>[1]; // Создаём новый элемент списка
// Связываем элемент с остальными
last->next->prev=last;
last=last->next;
last->next=after_last;
after_last->prev=last;
}
else
{
n = new element<ListType>[1];
// Связываем элемент с остальными
n->next=i.cur;
n->prev=i.cur->prev;
i.cur->prev=n;
if(n->prev) n->prev->next=n;
else start = n;
}
}
*i.cur->prev->val=val; // Заполняем элемент
number++;// Увеличиваем счётчик элементов списка
iterator temp;
temp.cur=i.cur->prev;
return temp;
}
// Удаление элементов в диапазоне [start,end]
template<class ListType>
l_iterator<ListType> list<ListType>::erase(iterator start, iterator end)
{
if(!start.cur) return end;
if(!end.cur) return start;
element<ListType> *temp,
*t_end,// Элемент после удаляемой последовательности
*t_start=start.cur->prev; // Элемент перед удаляемой последовательностью
end.cur==after_last ? t_end=after_last: t_end=end.cur->next;
while(start.cur!=t_end)// Удаление элементов в диапазоне
{
temp = start.cur->next;
delete[] start.cur;
start.cur = temp;
number--;
}
if(!t_start && t_end==after_last) // Если границы - начало и конец списка
list<ListType>::start=last=0;
else
{
if(!t_start)// Если первая граница - начало списка
{
list<ListType>::start=t_end;
list<ListType>::start->prev=0;
}
if(t_end==after_last)// Если вторая граница - конец списка
{
last=t_start;
last->next=after_last;
}
}
iterator tmp;
tmp.cur=t_end;
return tmp;
}
// Удаление элемента, на который указывает итератор del
template<class ListType>
l_iterator<ListType> list<ListType>::erase(iterator del)
{
element<ListType> *temp;
if(!start) return del;
if (del.cur == after_last) return del;// Если удаляемый элемент после последнего
if(del.cur == start && number==1)// Если удаляемый элемент в начале списка и единственный
{
delete[] del.cur;
start = 0; last = 0;
after_last->prev = 0;
}
else
{
if(del.cur == start)// Если удаляемый элемент в начале списка
{
start = del.cur->next;
delete[] del.cur;
start->prev = 0;
temp = start;
}
elseif (del.cur == last)// Если удаляемый элемент в конце списка
{
last = del.cur->prev;
delete[] del.cur;
last->next = after_last;
temp = last;
}
else// В общем случае
{
temp = del.cur->next;
del.cur->next->prev = del.cur->prev;
del.cur->prev->next = del.cur->next;
delete[] del.cur;
}
}
number--;
iterator tmp;
tmp.cur = temp;
return tmp;
}
Exception.h
class baseException
{
protected:
char* code; // Код ошибки
char* description; // Описание ошибки
public:
baseException(char* code, char* description)
{
this->code = newchar[strlen(code)+1]; strcpy(this->code, code);
this->description = newchar[strlen(description)+1];
strcpy(this->description, description);
}
virtualvoid showException() = 0; // Сообщение об исключительной ситуации
virtual ~baseException() {delete code; delete description;}
};
// Ошибки при работе с файлами
class fileError: public baseException
{
public:
fileError(char* code, char* description): baseException(code, description) {}
void showException() // Сообщение об исключительной ситуации
{ MessageBox::Show(gcnew String(description), "Файловая ошибка. Код " + gcnew String(code), MessageBoxButtons::OK, MessageBoxIcon::Error); }
};
// Ошибки при заполнении полей в формах
class fillException: public baseException
{
public:
fillException(char* code, char* description): baseException(code, description) {}
void showException() // Сообщение об исключительной ситуации
{ MessageBox::Show(gcnew String(description),"Ошибка заполнения. Код " + gcnew String(code),MessageBoxButtons::OK, MessageBoxIcon::Warning);}
Подобные документы
Модель данных как совокупность структур данных и операций их обработки. Иерархическая, сетевая и реляционная модели данных, их основные преимущества и недостатки. Операции над данными, определенные для каждой из моделей, ограничения целостности.
реферат [128,4 K], добавлен 16.02.2012Сущность и функциональные особенности баз данных, их классификация и типы, внутренняя структура и элементы. Модели данных, хранящихся в базах: иерархическая, сетевая, реляционная, многомерная, объектно-ориентированная. Виды запросов и типы таблиц.
дипломная работа [66,7 K], добавлен 06.01.2014Создание игровой системы "Тетрис": количество игр, режимы сложности, интерфейс пользователя, игровая статистика, обработка исключений. Структура входных и выходных данных. Диаграммы и описание классов. Блок-схема алгоритма программы, результаты ее работы.
курсовая работа [1,9 M], добавлен 13.06.2012Сущность и характеристика типов моделей данных: иерархическая, сетевая и реляционная. Базовые понятия реляционной модели данных. Атрибуты, схема отношения базы данных. Условия целостности данных. Связи между таблицами. Общие представления о модели данных.
курсовая работа [36,1 K], добавлен 29.01.2011Типы моделей данных: реляционная, иерархическая и сетевая. Описание концептуальной модели реляционной базы данных. Разработка базы данных в СУБД Microsoft Access, ее премущества и недостатки, составные компоненты, описание и обоснование полей таблиц.
курсовая работа [62,6 K], добавлен 09.03.2009Реляционная, иерархическая и сетевая модели данных, их достоинства и недостатки. Системы управления базами данных для персональных компьютеров и их скоростные характеристики. Структура базы данных "Футбольной лиги чемпионов". Описание команд программы.
курсовая работа [466,7 K], добавлен 11.07.2012Структура, классификация и этапы проектирования баз данных. Системы управления базами данных, их жизненный цикл. Разработка и реализация базы данных в MS Access. Организация входных и выходных данных. Защита данных от внешних угроз. Сведение о программе.
курсовая работа [558,6 K], добавлен 21.06.2012Базы данных и их использование в вычислительной технике. Особенности и основная конструктивная единица сетевой модели данных. Иерархическая модель, объекты предметной области. Реляционная модель, ее наглядность, представление данных в табличной форме.
реферат [115,8 K], добавлен 19.12.2011База данных в MS Access как совокупность инструментов для ввода, хранения, просмотра, выборки и управления информацией. Реляционная, иерархическая и сетевая модель. Создание базы данных со сведениями о заключенных договорах, их выполнении и контрагентах.
методичка [1,6 M], добавлен 27.10.2009Ознакомление с понятием, классификацией и структурными элементами баз данных. Виды моделей данных: иерархическая, сетевая, реляционная. Типы связей. Разработка программы для работы с базами данных в книжном магазине. Действие программы и ее листинг.
курсовая работа [549,3 K], добавлен 22.01.2013