|
Программирование >> Динамические структуры данных
float pay: struct Node: Man { Man *next: Указание имени Man после двоеточия при описании структуры Node означает, что все ее поля - переходят в структуру Node. Здесь мы воспользовались тем, что структура является формой класса, а для классов определено наследование, которое мы рассмотрим во второй части практикума. Задача 9.3. Очередь Написать программу учета для автосервиса, выполняющего кузовные работы и ремонт двигателей. При записи на обслуживание заполняется заявка, в которой указываются фамилия владельца, марка автомобиля, вид работы, дата приема заказа и стоимость ремонта. После выполнения работы распечатывается квитанция. Интерфейс программы организуем, как и в предьщущей задаче, в виде меню. Предоставим пользователю программы следующие возможности: 1) добавление заявки; 2) распечатка квитанции о выполнении работы; 3) вывод списка заявок на экран; 4) вывод списка заявок в файл (поскольку ремонт автомобиля - дело сложное и может затянуться на месяц-другой); 5) выход. Если для простоты предположить, что все клиенты обслуживаются в порядке очереди, то для хранения информации лучше всего использовать одноименную динамическую структуру данных - очередь. Очередь и стек являются частными случаями линейного списка. Для очереди определены всего две операции - помещение в конец и выборка из начала. При выборке элемент удаляется из очереди (аналогично стеку и в противоположность списку). Таким образом, используемая в программе структура данных не позволит выбрать для выполнения заявку, если до нее еще не дошла очередь*. Сделаем еще одно наивное предположение о том, что в автосервисе существует специализация, то есть работы выполняет не мастер Левша в одиночку, а две бригады. Одна бригада занимается кузовными работами, другая - ремонтом двигателей. Наша программа должна помочь им организовать работу без простоев, поэтому представляется логичным организовать отдельную очередь для каждого вида работ. В этих очередях будут храниться элементы одного и того же типа - заявки на выполнение работы: const int l name - 20. l model - 20. Ijwork - 80: struct Order { char name[l name]: char model[l model]: char work[l work]: time t time: float price: Order *next: Фамилия И.О. Марка автонобиля Описание вида работы Дата и время приема заявки Стоимость работ Указатель на следующий элемент Для задания длины строк мы определили символические константы.с тем, чтобы программа легче читалась и можно было при необходимости легко их изменить, не перемещаясь по всему тексту. Для работы с каждой очередью потребуется по два указателя, ссылающиеся на их начало и конец. Назовем их beg bocly и end body - для очереди на кузовные работы и beg engi пе и end engi пе - для очереди на ремонт двигателей. При составлении этой программы мы так же, как и в предыдущей, разбили ее на независимые функции и передаем им всю информацию через параметры: #include <fstream.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <iomanip.h> const int l name - 20. Ijnodel ° 20. l work - 80: struct Order { char name[l name]. model[1 .model]. work[l work]: time t time: float price: Order* next: Order* add(Order* end. const Order& order): Order* first(const Order& order): Order* get(Order* beg): int get type(): Order input Order(): int menuO: void print(const Order& order): void print dbase(Order* beg): int read dbase(char* filename. Order** beg; Order** end): int write dbase(char* filename. Order* pv): Тем фактом, что такую программу сегодня не прио)етет ни один автосервис, придется с прискорбием пренебречь. Но после построения правового государства этот код пойдет нарасхват. - ....................--------------- int main(){ Order* beg body - 0. *end body - 0. *beg engine - 0. *end engine - 0: char *file body order body.txt . *file engine - order engine.txt : read dbase(file body. &beg body. &end body): Главная функция read dbase(fi1e engi ne. &beg engi ne. &end engi ne): while (true) { switch (menuO) { case 1: Добавление заявки (помещение в очередь) switch (get type()) { case 1: if (beg body) end body - add(end body. input Order()): else { beg body fi rst(i nput Order()): end body - beg body: break: case 2: if (beg engine) end engine - add(end engine, input Order()): else { beg engine - first(input Order()): end engine beg engine: break: break: case 2: Распечатка квитанции (выборка из очереди) switch (get type()) { case 1: beg body - get(beg bocly): break: case 2: beg engine - get(beg engine): break: } break: case 3: Вывод заявок на экран switch (get type()) { case 1: print dbase (beg body): break; case 2: print dbase (beg engine): break; break: case 4: Вывод заявок в файл write dbase(fi1e body. b€g body): wri te dbase(fi1e engine. beg engi ne): break: case 5: Выход return 0: default: cout Надо вводить число от 1 до 5 endl: break: return 0: Задача 9.3. Очередь ...................................Добавление заявки Order* add(Order* end. const Order& order) { Order* pv = new Order: *pv - order; Копирование элемента pv->time = time(O): pv->next 0: end->next pv: end - pv; return end; .......................Начальное формирование очереди Order* first(const Order& order) { Order* beg - new Order: *beg - order; Копирование элемента beg->time - time(O): beg->next - 0: return beg: ............-......................Выборка из очереди Order* get(Order* beg) { if (Ibeg) { cout Очередь пуста endl: return 0: } print (*beg): beg - beg->next: return beg: ................................Определение типа работ int get type() { int type: char buf[10]: cout Введите вид работы: 1 - кузовные. 2 - двигатель endl; cin buf: type - atoi(buf): while (type !- 1 && type !- 2): cin.getO; return type: ..........................-......-.......Ввод заявки Order input Order() { Order order: char buf[10]: cout Введите фамилию И.О. endl: ciп.getline(order.name. l name); cout Введите марку а/м endl: cin.getline(order.model. Ijrodel): cout Введите описание работ endl: cin.getline(order.work. l work); do { cout Введите стоимость работ endl: cin buf: while (!(order.price (float)atof(buf))): return order: ............. int menuO { char buf[10]: int option: do { cout - cout 1 - Вывод меню endl: добавление заявки endl: cout 2 - распечатка квитанции endl: cout 3 - вывод заявок на экран endl: cout 4 - вывод заявок в файл endl: cout 5 - выход endl: cin buf: option - atoi(buf): while (!option): return option: ................................:-- Распечатка квитанции void print(const Order& order) { tm t = *(localtime(&order.time)): cout Фамилия: setiosflags(ios::left) setw(l name) order.name: cout Марка а/и: order.model endl; cout Вид работ: order.work endl: cout Дата приема заявки: t.tm mday . t,tm mon + 1 . 1900 + t.tm year: time t now - time(O): t - *(localtime(&now)): cout Дата исполнения: t.tm mday . t.tm mon + 1 *. 1900 + t.tm year: cout \t\t\t\t\tCTOHMOCTb работ: order.price endl: .....------.................- Распечатка списка заявок void print dbase(Order* beg) { if (!beg) { cout Список пуст endl: return: } Order* pv = beg: while (pv) { print(*pv); pv pv->next; ..................................Чтение базы мз файла int read dbase(char* filename. Order** beg. Order** end) { ifstream fin(filename. ios::in, ios: :nocreate): if (!fin) { cout Нет файла filename endl; return 1; } Order order: *beg 0: while (fin.getline(order.name. l name)) { fin.getline(order.model. l model): fin.getline(order.work. Ijwork): fin order.time order.price: fin.getO: if (*beg) *end - add(*end. order): else { *beg - first(order): *end - *beg: } return 0: Вывод базы в файл int write dbase(char* filename. Order* pv) { ofst ream fout(fi1ename): if (Ifout) { cout Ошибка открытия файла endl: return 1: } while (pv) { fout pv->name endl: fout pv->model endl: fout pv->work endl: fout pv->time pv->price endl: pv pv->next: return 0: У этой программы много общего с предыдущей, поэтому обратим внимание на отличия. Работу с очередью выполняют три функции. Функция first формирует первый элемент очереди и возвращает указатель на него. Функция add выполняет добавление в конец, поэтому ей передается указатель на конец очереди и элемент, который следует добавить, а возвращает она измененный указатель на конец очереди. Выборка выполняется из начала очереди, при этом указатель на ее начало изменя-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |