Программный модуль управления авиарейсами
Типы моделей данных: иерархическая, сетевая, реляционная. Структура входных и выходных данных. Классы управления данными, исключений. Структура таблиц, используемых в программе. Описание алгоритмов решения задачи. Диаграммы классов, блок-схемы алгоритмов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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