Программный модуль управления авиарейсами

Типы моделей данных: иерархическая, сетевая, реляционная. Структура входных и выходных данных. Классы управления данными, исключений. Структура таблиц, используемых в программе. Описание алгоритмов решения задачи. Диаграммы классов, блок-схемы алгоритмов.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.