Программирование >>  Динамические структуры данных 

1 ... 26 27 28 [ 29 ] 30 31 32 ... 38


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 выполняет добавление в конец, поэтому ей передается указатель на конец очереди и элемент, который следует добавить, а возвращает она измененный указатель на конец очереди. Выборка выполняется из начала очереди, при этом указатель на ее начало изменя-



1 ... 26 27 28 [ 29 ] 30 31 32 ... 38

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика