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

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 22.06.2012
Размер файла 1,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

};

Undo.h

template<class sType>refclass lastAction;

template<class sType>refclass lastActionStack;

refclass returnElement;

refclass StaticUndoStack;

// Описание последнего действия

template<class sType>refclass lastAction

{

public:

int opType;// Тип операции (1 - добавление, 2- изменение, 3 - удаление)

int index;// Индекс в списке

int dayIndex;// Индекс выбранного дня

DataGridViewRow^ Row; // Строка из таблицы (для отмены удаления и изменения)

lastAction^ prev;// Ссылка на предыдущее действие

lastAction^ next;// Ссылка на следующее действие

sType *savedObject;// Сохранённый рейс

lastAction(int opType, int index, int dayIndex, DataGridViewRow^ Row, sType &savedObject);

~lastAction() {delete savedObject;}

};

// Стек последних действий

template<class sType>refclass lastActionStack

{

lastAction<sType> ^top; // Вершина стека

int count;// Количество элементов в стеке

lastAction<sType> ^bottom; // Дно стека

public:

int Count() {return count;}

lastActionStack() { count=0; }

~lastActionStack()

{ while(count)

{ if(count!=1) { top=top->prev; delete top->next; }

elsedelete top;

count--;

}

}

void push(int opType, int index, int dayIndex, DataGridViewRow^ Row, sType &savedObject);

returnElement^ pop();

void reduce();// Удалить лишние элементы стека при превышении макс. количества

};

// Элемент, возвращаемый стеком при отмене последнего действия

refclass returnElement

{

public:

returnElement(int opType, int index, int dayIndex, DataGridViewRow^ Row)

{

this->opType = opType;

this->Row = Row;

this->index = index;

this->dayIndex = dayIndex;

}

int opType;

int index;

int dayIndex;

DataGridViewRow^ Row;

};

// Класс со стеком последних действий

refclass StaticUndoStack

{

public:

static lastActionStack<flight>^ flightStack = gcnew lastActionStack<flight>;

static lastActionStack<person>^ personStack = gcnew lastActionStack<person>;

staticint MaxActionsNum = 1;

};

// Конструктор для последнего действия

template<class sType>

lastAction<sType>::lastAction(int opType, int index, int dayIndex, DataGridViewRow^ Row, sType &savedObject)

{

if(opType!=1) // Если удаление или изменение

{

this->Row =(DataGridViewRow^) Row->Clone(); // Копируем строку

for(int i=0;i<Row->Cells->Count;i++)

this->Row->Cells[i]->Value = Row->Cells[i]->Value;

}

this->opType = opType; this->index = index; this->dayIndex = dayIndex;

this->savedObject = new sType(savedObject);

}

// Добавление в стек последнего действия

template<class sType>

void lastActionStack<sType>::push(int opType, int index, int dayIndex, DataGridViewRow^ Row, sType &savedObject)

{

if(count == StaticUndoStack::MaxActionsNum) // если достигнуто макс. количество

{

if(count==1) delete bottom;

else

{

bottom = bottom->next; // Обновляем дно стека

delete bottom->prev;

}

count--;

}

lastAction<sType>^ New = gcnew lastAction<sType>(opType, index, dayIndex, Row, savedObject);

if(count!=0)

{

New->prev = top;// Обновляем ссылку на предыдущий элемент

New->prev->next = New; // Обновляем ссылку на следующий элемент

// предыдущего

}

else bottom = New;// Запоминаем дно стека

top = New;// Обновляем вершину стека

count++;

}

// Извлечение рейса из стека последнего действия

template<>inline

returnElement^ lastActionStack<flight>::pop()

{

DataGridViewRow^ bufRow;

returnElement^ buf;

if(!top) return buf;

list<flight>::iterator l_iter = data::lst.begin(); // Итератор в списке авиарейсов

for(int i=0; i<top->index; i++)

l_iter++; // Устанавливаем итератор на требуемый индекс

if(top->opType == 1) // Отмена добавления

data::lst.erase(l_iter); // Удаляем добавленный рейс в списке lst

else// Отмена удаления или изменения

{

bufRow = (DataGridViewRow^)top->Row->Clone();// Копия строки

for(int i=0; i < top->Row->Cells->Count; i++)

// Копируем содержимое строки

bufRow->Cells[i]->Value = top->Row->Cells[i]->Value;

if(top->opType == 3) // Отмена удаления

// Вставляем сохранённый рейс в списке lst

l_iter = data::lst.insert(l_iter, *(top->savedObject));

else// Если отмена изменения

*l_iter = *(top->savedObject); // Восстанавливаем объект в списке lst

// Обновляем итератор в скрытом столбце

bufRow->Cells[5]->Value = (longlong) l_iter;

}

// Элемент для возврата

buf = gcnew returnElement(top->opType, top->index, top->dayIndex, bufRow);

lastAction<flight>^ old;

old = top;

top = top->prev; // Изменение вершины стека

delete old;// Удаление старой вершины

count--;// Уменьшение количества элементов в стеке

return buf;

}

// Извлечение забронированного места из стека последнего действия

template<>inline

returnElement^ lastActionStack<person>::pop()

{

DataGridViewRow^ bufRow;

returnElement^ buf;

if(!top) return buf;

int placeType = top->savedObject->getPlaceType() - 1;// Тип забронированного места

vector<person>::iterator v_iter = (*data::iter).getReserv()[top->dayIndex].getPeople().begin() + top->index;

if(top->opType == 1) // Отмена добавления

{

(*data::iter).getReserv()[top->dayIndex].getPeople().erase(v_iter);

(*data::iter).getReserv()[top->dayIndex].Reserved(placeType)--;

}

else// Отмена удаления или изменения

{

bufRow = (DataGridViewRow^)top->Row->Clone();// Копия строки

for(int i=0; i < top->Row->Cells->Count; i++)

// Копируем содержимое строки

bufRow->Cells[i]->Value = top->Row->Cells[i]->Value;

if(top->opType == 3) // Отмена удаления

{

v_iter = (*data::iter).getReserv()[top->dayIndex].getPeople().insert(v_iter, *(top->savedObject)); // Вставляем сохранённую

// запись

(*data::iter).getReserv()[top->dayIndex].Reserved(placeType)++;

}

else// Если отмена изменения

*v_iter = *(top->savedObject); // Восстанавливаем объект в векторе

// reserv

}

// Элемент для возврата

buf = gcnew returnElement(top->opType, top->index, top->dayIndex, bufRow);

lastAction<person>^ old;

old = top;

top = top->prev; // Изменение вершины стека

delete old;// Удаление старой вершины

count--;// Уменьшение количества элементов в стеке

return buf;

}

// Удалить лишние элементы стека при превышении макс. количества

template<class sType>

void lastActionStack<sType>::reduce()

{

int dif = count - StaticUndoStack::MaxActionsNum;

if(dif > 0)

{

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

{

bottom = bottom->next; // Обновляем дно стека

delete bottom->prev; count--; // Удаляем элемент со дна стека,

}

}

}

data.h

class person;

class reservation;

class flight;

class data;

// Рейс

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() {reserv.clear();}

flight() {reservNum=0;}

void restoreDays(); // Пересборка дней

void reducePeopleLists(); // Уменьшение списка забронированных мест при

// необходимости

void fromFile(ifstream &in);

void toFile(ofstream &out);

// Get- и Set-методы

vector<reservation>& getReserv() {return reserv;}

int getNumber() {return number;}

int& СlassType(int i) {return classType[i];}

void setClassType(String^ cl1, String^ cl2, String^ cl3);

int& Price(int i) {return price[i];}

void setPrice(String^ pr1, String^ pr2, String^ pr3);

int getReservNum() {return reservNum;}

void setReservNum(int n) {reservNum = n;}

void setNumber(int n) {number = n; }

char& Day(int i) {return days[i];}

String^ getDeparturePoint() { returngcnew String(DeparturePoint); }

String^ getDestinationPoint() { returngcnew String(DestinationPoint); }

String^ getDepartureTime() { returngcnew String(DepartureTime); }

void setDeparturePoint (String^ s) { strcpy(DeparturePoint,

(char*)(void*)Marshal::StringToHGlobalAnsi(s)); }

void setDestinationPoint (String^ s) { strcpy(DestinationPoint,

(char*)(void*)Marshal::StringToHGlobalAnsi(s)); }

void setDepartureTime (String^ s) { strcpy(DepartureTime,

(char*)(void*)Marshal::StringToHGlobalAnsi(s)); }

};

// Список бронирования

class reservation

{

vector<person> people; // Список людей на данный рейс

int reserved[3];// Количество занятых мест по классам

char date[30];// Дата

public:

reservation() {reserved[0]=0;

reserved[1]=0;

reserved[2]=0;}

~reservation() { people.clear();}

// Get- и Set-методы

int& Reserved(int i) {return reserved[i];}

String^ getDate() { returngcnew String(date); }

void setDate (String^ s) { strcpy(date,(char*)(void*)Marshal::StringToHGlobalAnsi(s)); }

vector<person>& getPeople() {return people;}

void fromFile(ifstream &in);

void toFile(ofstream &out);

};

// Информация о человеке, бронировавшем место

class person

{

char name[50]; // Полное имя

int placeType;// Тип места

public:

person(){name[0]='\0'; placeType=0; }

person(String^ s, char t) { strcpy(name,(char*)(void*)Marshal::StringToHGlobalAnsi(s)); placeType=t; }

// Get- и Set-методы

String^ getName() { returngcnew String(name); }

int getPlaceType() {return placeType;}

void setName(String^ s) { strcpy(name,(char*)(void*)Marshal::StringToHGlobalAnsi(s)); }

void setPlaceType (int t) {placeType = t;}

};

class data

{

public:

static list<flight> lst; // Список авиарейсов

static list<flight>::iterator iter; // Итератор контейнера list

static flight currentFlight;// Объект класса flight

staticint autosaveInterval;// Период автосохранения (мин)

staticvoid loadFromFile();// Загрузить данные из файла

staticvoid saveToFile();// Сохранить данные в файл

};

data.cpp

#define Month 31

// Загрузить из файла

void data::loadFromFile()

{

ifstream flightsIn;

ifstream daysIn;

ifstream peopleIn;

try {

flightsIn.open("flights.dat", ios::in | ios::binary);

daysIn.open("days.dat", ios::in | ios::binary);

peopleIn.open("people.dat", ios::in | ios::binary);

if(!flightsIn.is_open() || !daysIn.is_open() || !peopleIn.is_open()) throw fileError("1","Ошибка открытия файла");

flightsIn.read((char*)&autosaveInterval, sizeof(int)); // Чтение периода

// автосохранения

int num;

flightsIn.read((char*)&num, sizeof(int));// Чтение макс. количества

// отменяемых действий

StaticUndoStack::MaxActionsNum = num;// Утановка макс.

// количества отменяемых действий

list<flight>::iterator iterator;

flightsIn.read((char*)&num, sizeof(int)); // Чтение количества авиарейсов

for(int k=0; k<num; k++)

{

lst.push_back(currentFlight); // Заполняем контейнер lst

// объектом класса flight

iterator = lst.end()--; // Итератор на последний элемент lst

(*iterator).fromFile(flightsIn); // Читаем рейс из файла

// Загрузка дней

for(int i=0; i<(*iterator).getReservNum(); i++)

{

// Увеличиваем размерность вектора reserv на 1

(*iterator).getReserv().resize((*iterator).getReserv().size()+1);(*iterator).getReserv()[i].fromFile(daysIn); // Читаем информацию о

// вылете рейса по дням

// Загрузка информации о забронированных местах для каждого дня

int num = (*iterator).getReserv()[i].Reserved(0) + (*iterator).getReserv()[i].Reserved(1) + (*iterator).getReserv()[i].Reserved(2);

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

{

(*iterator).getReserv()[i].getPeople().resize((*iterator).getReserv()[i].getPeople().size()+1);

peopleIn.read((char*)&(*iterator).getReserv()[i].getPeople()[j], sizeof(person)); // Читаем информацию о человеке

}

}

}

} catch (baseException &e)

{

e.showException(); // Вывод исключения

// Закрытие файлов при необходимости

if(flightsIn.is_open()) flightsIn.close();

if(daysIn.is_open()) daysIn.close();

if(peopleIn.is_open()) peopleIn.close();

}

}

// Записать в файл

void data::saveToFile()

{

ofstream flightsOut;

ofstream daysOut;

ofstream peopleOut;

try {

flightsOut.open("flights.dat", ios::out | ios::binary);

daysOut.open("days.dat", ios::out | ios::binary);

peopleOut.open("people.dat", ios::out | ios::binary);

if(!flightsOut.is_open() || !daysOut.is_open() || !peopleOut.is_open()) throw fileError("1","Ошибка открытия файла");

flightsOut.write((char*)&autosaveInterval, sizeof(int)); // Запись периода

// автосохранения

int num = StaticUndoStack::MaxActionsNum;// Макс. количество отменяемых

// действий

flightsOut.write((char*)&num, sizeof(int));// Запись макс. количества

// отменяемых действий

list<flight>::iterator iterator;

num = lst.size();// Количество авиарейсов

flightsOut.write((char*)&num, sizeof(int)); // Читаем количество авирейсов из

// файла

// Запись авиарейсов

for(iterator=lst.begin(); iterator!=lst.end(); iterator++)

{

(*iterator).toFile(flightsOut); // Записываем рейс в файл

// Запись информации о днях

for(unsignedint i=0; i<(*iterator).getReserv().size(); i++)

{

(*iterator).getReserv()[i].toFile(daysOut);

// Запись информации о забронированных местах

for(unsignedint j=0;j<(*iterator).getReserv()[i].

getPeople().size(); j++)

peopleOut.write((char*)&(*iterator).getReserv()[i].getPeople()[j], sizeof(person)); // Записываем информацию о человеке

}

}

} catch (baseException &e)

{

e.showException(); // Вывод исключения

// Закрытие файлов при необходимости

if(flightsOut.is_open()) flightsOut.close();

if(daysOut.is_open()) daysOut.close();

if(peopleOut.is_open()) peopleOut.close();

}

}

// Пересборка дней

void flight::restoreDays()

{

DateTime dateValue = DateTime::Now; // Текущая дата

int day;// Номер дня недели

// Удаление дат до сегодняшнего дня и лишних дней

vector<reservation>::iterator itr = reserv.begin(); // Итератор на начало списка

// дней

while(itr!=reserv.end())

{

// Очередная дата из списка

dateValue = Convert::ToDateTime((*itr).getDate());

if(dateValue.Date < DateTime::Now.Date)// Если дата до сегодняшнего дня

{

itr = reserv.erase(itr); // Удаляем запись

reservNum--;// Уменьшаем количество дней

continue;

}

(int) dateValue.DayOfWeek == 0 ? day = 6: day = (int)dateValue.DayOfWeek-1; // Получаем ноиер дня недели из списка

if(!days[day]) // Если рейс не летает в данный день недели

{

itr = reserv.erase(itr); // Удаляем запись

reservNum--;// Уменьшаем количество дней

}

else itr++;

}

if(reserv.size()) // Если список дней не пуст

{

itr = reserv.begin();

dateValue = Convert::ToDateTime((*itr).getDate());

// Если первая в списке дата - сегодня,то удаляем её

if(dateValue.Date == DateTime::Now.Date) reserv.erase(itr);

}

// Добавление недостающих дат

dateValue = DateTime::Now.AddDays(1);// Начальная дата

DateTime dateValueMax = DateTime::Now.AddDays(Month); // Максимальная дата

DateTime newDate;

itr = reserv.begin();

String ^s="";

while(dateValue.Date <= dateValueMax.Date)

{

(int) dateValue.DayOfWeek == 0 ? day = 6: day = (int)dateValue.DayOfWeek-1; // Номер дня недели очередной даты

// Если в этот день недели рейс выполняется

if(days[day])

{

if (itr!=reserv.end()) // Если не достигнут конец списка дней

{ String^ s= (*itr).getDate();

newDate=DateTime::Parse(s);} // Очередная дата из списка

// Если достигнут конец списка дней, или следующая дата не совпадает

// с датой из списка

if(itr==reserv.end() || dateValue.Date != newDate.Date)

{

// вставляем элемент в список дней

itr = reserv.insert(itr,reservation());

// устанавливаем данную дату

(*itr).setDate(dateValue.Date.ToShortDateString());

reservNum++;// увеличиваем количество дней для данного рейса

}

itr++;

}

dateValue = dateValue.AddDays(1); // Переходим к следующей дате

}

}

// Уменьшение списка забронированных мест при уменьшении их максимального количества

void flight::reducePeopleLists()

{

for(int i = 0; i < reserv.size(); i++) // Проход по списку дней

{

for(int cl=0; cl<3; cl++)// Для каждого типа места

// Если забронировано больше мест, чем возможно

if(reserv[i].Reserved(cl) > classType[cl])

// Проход по списку мест с конца

for (int j = reserv[i].getPeople().size()-1; j>=0; j--)

// Если место рассматриваемого типа

if(reserv[i].getPeople()[j].getPlaceType()==cl+1) {

reserv[i].getPeople().erase(reserv[i].getPeople().begin()+j); // Удаляем его

reserv[i].Reserved(cl)--;

// Если количество уменьшено до максимального,

// то прекращаем цикл

if(reserv[i].Reserved(cl) == classType[cl])

break;

}

}

}

// Запись необходимых полей класса в файловый поток

void flight::toFile(ofstream &out)

{

out.write((char*)&number,sizeof(int));

out.write((char*)&days,sizeof(days));

out.write((char*)&DeparturePoint,sizeof(DeparturePoint));

out.write((char*)&DestinationPoint,sizeof(DestinationPoint));

out.write((char*)&DepartureTime,sizeof(DepartureTime));

out.write((char*)&classType,sizeof(classType));

out.write((char*)&price,sizeof(price));

out.write((char*)&reservNum,sizeof(int));

}

// Чтение необходимых полей класса из файлового потока

void flight::fromFile(ifstream &in)

{

in.read((char*)&number,sizeof(int));

in.read((char*)&days,sizeof(days));

in.read((char*)&DeparturePoint,sizeof(DeparturePoint));

in.read((char*)&DestinationPoint,sizeof(DestinationPoint));

in.read((char*)&DepartureTime,sizeof(DepartureTime));

in.read((char*)&classType,sizeof(classType));

in.read((char*)&price,sizeof(price));

in.read((char*)&reservNum,sizeof(int));

}

// Установка типов мест

void flight::setClassType(String^ cl1, String^ cl2, String^ cl3)

{

classType[0] = Convert::ToInt32(cl1);

classType[1] = Convert::ToInt32(cl2);

classType[2] = Convert::ToInt32(cl3);

}

// Установка стоимости мест в зависимости от типа

void flight::setPrice(String^ pr1, String^ pr2, String^ pr3)

{

price[0] = Convert::ToInt32(pr1);

price[1] = Convert::ToInt32(pr2);

price[2] = Convert::ToInt32(pr3);

}

// Запись необходимых полей класса в файловый поток

void reservation::toFile(ofstream &out)

{

out.write((char*)&reserved,sizeof(reserved));

out.write((char*)&date,sizeof(date));

}

// Чтение необходимых полей класса из файлового потока

void reservation::fromFile(ifstream &in)

{

in.read((char*)&reserved,sizeof(reserved));

in.read((char*)&date,sizeof(date));

}

Размещено на Allbest.ru


Подобные документы

  • Модель данных как совокупность структур данных и операций их обработки. Иерархическая, сетевая и реляционная модели данных, их основные преимущества и недостатки. Операции над данными, определенные для каждой из моделей, ограничения целостности.

    реферат [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-файлы представлены только в архивах.
Рекомендуем скачать работу.