Класс «Manager» представляет собой объектную модель некоторого управляющего, занимающегося управлением пассажиропотоком.
На этот класс возложены основные функции данной программы : добавление пассажиров в общую базу данных, удаление их из базы, редактирование записей.
Сама база реализована на основе стандартного контейнера библиотеки STL (Standart Template Library) vector.
class Manager
{
private:
vector<Passenger> pass_list;
unsigned int records_total;
...
}
Этот контейнер является наиболее универсальным средством при создании коллекции типа «массив».
Также в классе представлено 6 функций для непосредственной работы с содержимым базы и 2 функции для сохранения и чтения базы на диск.
bool add_record(const Passenger&);
bool delete_record(unsigned int);
bool edit_record(unsigned int,string,unsigned int,unsigned int, unsigned int,unsigned int);
void find_name(string);
void find_ticket(unsigned int);
void find_carriage(unsigned int);
...
bool save_base(const char* path);
bool load_base(const char* path);
Функция add_record добавляет запись типа Passenger в базу.
Непосредственно перед добавлением осуществляется просмотр базы на предмет элемента с такими же полями, а именно : номером билета и конкретным местом в конкретном вагоне. Именно эти 2 критерия позволяют отличить одного пассажира от другого в базе данных.
Просмотр базы осуществляется с помощью специальной абстракции – итератора.
vector<Passenger> :: iterator itr;
Она позволяет “перебирать” элементы контейнера по номерам. Для каждого контейнера и для типа данных содержащегося в этом контейнере создается соответственно свой итератор.
Если элемент уникален, то есть в базе нет такого же (в рамках предложенных выше критериев), то мы вызываем стандартную функцию контейнера vector – push_back для добавления элемента.
Функция delete_record удаляет запись из базы данных. В функцию передается номер удаляемого элемента. Сначала проверяется, не выходит ли этот номер за пределы допустимые пределы [1; records_total], и не пуста ли сама база (records_total = 0). Далее, если не выполняются вышеперечисленные условия (мы можем корректно произвести удаление), то с помощью описанного выше итератора осущетсвляется последовательный переход к нужному номеру и вызов стандартной функции конейтера для удаления элемента – erase.
Функция edit_record занимается редактированием записи в базе данных. Ей передаются новые параметры объекта (имя, номера и т.д.) и номер записи, подлежащей редактированию. Перед редактированием мы опять проверяем, не выходит ли номер редактируемого элемента за допустимые пределы и не пуста ли база данных. Далее при помощи стандарной функции контейнера at, позволяющей получить доступ к конкретнему номеру элемента, мы вызываем для данного элемента функции изменения его полей:
(pass_list.at(num - 1)).set_age(a);
(pass_list.at(num - 1)).set_carriage(c);
(pass_list.at(num - 1)).set_name(n);
(pass_list.at(num - 1)).set_place(p);
(pass_list.at(num – 1)).set_ticket(t);
Функции find_name, find_place, find_carriage – схожии в реализации функции, предназначенные для поиска элемента базы, отвечающего нужному требованию – имени, номеру места, номеру вагона.
При помощи итератора проводится последовательный перебор элементов контейнера и сравнения их параметров в заданным.
if((*itr).get_ticket() == num)
if((*itr).get_carriage() == num)
if((*itr).get_name() == name)
На экран выводится все совападения, либо же информация о том, что таковых элементов не найдено.
Функция save_base выполняет сохранение базы на диск.
Ей передается константная ссылка на массив символов, определяющих путь сохранения.
По данной ссылке созадется стандартный выводной поток.
std :: ofstream strm(path);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.