Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornaya_rabota_8_условие.docx
Скачиваний:
8
Добавлен:
12.07.2022
Размер:
37.64 Кб
Скачать

Текст программы

#include <iostream>

#include <iomanip>

#include <Windows.h>

using namespace std;

class List { //Класс для задания линейного списка

public:

class Train { //Класс для задания элемента списка

public:

int train_num; //Номер поиска

char p_nazn[20]; //Пункт назначения

char v_otpr[10]; //Время отправления

Train* prev; //Указатель на предыдущий узел

Train* next; //Указатель на следующий узел

//Конструктор

Train(int t_num = 0, char* p_naz = 0, char* v_otp = 0) {

train_num = t_num;

strcpy_s(p_nazn, p_naz);

strcpy_s(v_otpr, v_otp);

next = 0; prev = 0;

}

};

Train* pbeg, * pend; //Указатели на начало и конец списка

List() { pbeg = 0; pend = 0; } //Конструктор

~List(); //Деструктор

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

void add_sort(int t_num, char* p_naz, char* v_otp);

//Метод для поиска элемента списка по ключу

Train* find(int t_num);

//Шаблон метода для поиска строковых данных в списке

template< class CLASS, typename TYPE > bool find_data(TYPE CLASS::* member, char* data);

//Шаблон метода для поиска числовых целых данных

//в списке

template< class CLASS, typename TYPE > bool find_data(TYPE CLASS::* member, int data);

bool remove(int key); //Метод для удаления //элемента из списка

void print(); //Метод для печати списка

private:

//Метод для проведения горизонтальной линии

//при печати списка

void hline();

};

void menu(); //Функция для печати меню

void vvod(List* L); //Функция для ввода данных

void vivod(List* L); //Функция для вывода данных

void search(List* L); //Функция для поиска данных

void del(List* L); //Функция для удаления записи

void vihod(List* L); //Функция для выхода из программы

typedef void (*pf)(List*); //Указатель на функцию

//Массив для привязки функций к пунктам меню

pf menu_list[] = { &vvod, &vivod, &search, &del, &vihod };

//Реализация метода для упорядоченной вставки элемента

//в список

void List::add_sort(int t_num, char* p_naz, char* v_otp)

{

//Создание нового элемента

Train* pv = new Train(t_num, p_naz, v_otp);

if (!pbeg) //Вставка первого элемента в список

{

pbeg = pend = pv;

pv->prev = 0;

}

else

{

Train* pt = pbeg;

while (pt) { //Просмотр списка

if (t_num < pt->train_num)

{

pv->next = pt;

if (pt == pbeg) //Вставка в начало

//списка

{

pv->prev = 0;

pbeg = pv;

}

else //Вставка в середину

// списка

{

(pt->prev)->next = pv;

pv->prev = pt->prev;

}

pt->prev = pv;

return;

}

pt = pt->next;

}

pv->next = 0; //Вставка в конец списка

pv->prev = pend;

pend->next = pv;

pend = pv;

}

}

//Реализация метода поиска элемента по ключу

List::Train* List::find(int t_num) {

Train* pv = pbeg;

while (pv) {

if (pv->train_num == t_num)

break;

pv = pv->next;

}

return pv;

}

//Реализация шаблона метода для поиска

//строковых данных в списке

template< class CLASS, typename TYPE > bool List::find_data(TYPE CLASS::* member, char* data)

{

bool find = false;

Train* pv = pbeg;

while (pv)

{

if (strcmp(pv->*member, data) == 0)

{

find = true;

//Вывод на экран найденного элемента

cout << setw(5) << pv->train_num << setw(20) << pv->p_nazn << setw(10) << pv->v_otpr << endl;

}

pv = pv->next;

}

return find;

}

//Реализация шаблона метода для поиска

//целых числовых данных в списке

template< class CLASS, typename TYPE > bool List::find_data(TYPE CLASS::* member, int data)

{

bool find = false;

Train* pv = pbeg;

while (pv)

{

if (pv->*member == data)

{

find = true;

//Вывод на экран найденного элемента

cout << setw(5) << pv->train_num << setw(20) << pv->p_nazn << setw(10) << pv->v_otpr << endl;

}

pv = pv->next;

}

return find;

}

//Реализация метода удаления элемента из списка

bool List::remove(int key)

{

if (Train* pkey = find(key)) {

if (pbeg == pend) { //Удаление единственного

// элемента из списка

pbeg = pend = 0;

}

else

if (pkey == pbeg) { //Удаление первого

//элемента из списка

pbeg = pbeg->next;

pbeg->prev = 0;

}

else

if (pkey == pend) {

//Удаление последнего

//элемента из списка

pend = pend->prev;

pend->next = 0;

}

else //Удаление элемента из

//середины списка

{

(pkey->prev)->next = pkey->next;

(pkey->next)->prev = pkey->prev;

}

delete pkey;

return true;

}

}

//Реализация метода печати элементов списка

//в виде таблицы

void List::print() {

//Печать шапки таблицы

cout << "\n Список поездов \n";

hline();

printf("| Номер | Пункт назначения | Время отправления |\n");

hline();

//Печать элементов списка

Train* pv = pbeg;

while (pv) {

cout << "| " << setw(5) << pv->train_num;

cout << " | " << setw(20) << pv->p_nazn;

cout << " | " << setw(17) << pv->v_otpr << " |" << endl;

pv = pv->next;

}

hline();

}

//Реализация метода подчеркивания горизонтальной линии

// для прорисовки таблицы

void List::hline()

{

const int m = 52;

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

cout << "-";

cout << "\n";

}

//Реализация деструктора

List::~List() {

if (pbeg != 0) {

Train* pv = pbeg;

while (pv) {

pv = pv->next;

delete pbeg;

pbeg = pv;

}

}

}

//Функция прорисовки меню

void menu()

{

cout << "\n МЕНЮ \n";

cout << "1. Ввод данных\n";

cout << "2. Вывод данных\n";

cout << "3. Поиск\n";

cout << "4. Удаление\n";

cout << "5. Выход";

cout << "\nВведите номер пункта для дальнейшей работы\n";

}

//Функция реализации пользовательского ввода данных

//в список

void vvod(List* L)

{

int n;

int t_num;

char p_nazn[20];

char v_otpr[10];

cout << "Введите количество добавляемых записей в список = ";

cin >> n;

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

{

cout << "\nВведите номер поезда\n";

cin >> t_num;

cout << "Введите имя пункта назначения\n";

while (cin.get() != '\n');

cin.getline(p_nazn, 20);

cout << "Введите время отправления\n";

cin.getline(v_otpr, 10);

//cout<<"\n";

L->add_sort(t_num, p_nazn, v_otpr);

}

}

//Функция реализации вывода данных из списка

void vivod(List* L)

{

if (L->pbeg)

L->print();

else

cout << "\n Список пуст! \n";

}

//Функция реализации поиска данных в списке

void search(List* L)

{

if (L->pbeg)

{

int k_poisk;

//Прорисовка меню поиска

cout << "\n Выберите критерий поиска \n";

cout << "1. Поиск по номеру поезда \n";

cout << "2. Поиск по имени пункта назначения \n";

cout << "3. Поиск по времени отправления \n";

cout << "\n Введите номер критерия ";

cin >> k_poisk;

//Обработка выбора критерия пользователем

switch (k_poisk)

{

case 1: int t_num; //Поиск по номеру

//поезда

cout << "\n Введите номер поезда ";

cin >> t_num;

if (List::Train* pv = L->find(t_num))

{

cout << "\n Результат поиска: \n";

cout << setw(5) << pv->train_num << setw(20) << pv->p_nazn << setw(10) << pv->v_otpr << endl;

}

else

cout << "Поезд с таким номером не найден\n";

break;

case 2: char p_nazn[20]; //Поиск

// по имени пункта назначения

cout << "\n Введите имя пункта назначения \n";

while (cin.get() != '\n');

cin.getline(p_nazn, 20);

cout << "\n Результат поиска: \n";

if (!L->find_data(&List::Train::p_nazn, p_nazn))

cout << "Поезда с таким пунктом назначения не найдены \n";

break;

case 3: char v_otpr[10]; //Поиск по времени

// отправления

cout << "\n Введите время отправления \n";

while (cin.get() != '\n');

cin.getline(v_otpr, 10);

cout << "\n Результат поиска: \n";

if (!L->find_data(&List::Train::v_otpr, v_otpr))

cout << "Поезда с таким временем отправления не найдены \n";

break;

default:cout << "Неверный вариант выбора \n";

}

}

else

cout << "\n Список пуст! \n";

}

//Функция удаления элемента из списка

void del(List* L)

{

if (L->pbeg)

{

int t_num;

cout << "Введите номер поезда для удаления \n";

cin >> t_num;

if (L->remove(t_num))

cout << "\n Запись удалена \n";

else

cout << "\n Запись с таким номером не найдена \n";

}

else

cout << "\n Список пуст! \n";

}

//Функция реализации выхода из программы

void vihod(List* L)

{

L->~List();

}

int main()

{

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

List L;

int num = 0; //Переменная для хранения номера

// выбранного пункта меню

while (num != 5)

{

menu();

cin >> num;

if (num < 1 || num>5)

cout << "Неверный вариант выбора\n";

else

menu_list[num - 1](&L);

}

return 0;

}

3. Варианты работы

Создать программу, формирующую данные определенной структуры в виде двунаправленного линейного списка. Список должен являться объектом класса. Структура данных зависит от варианта.

Программа должна реализовывать следующие операции:

– формирование меню для выбора действия пользователем;

– ввод данных в список, отсортированный по ключу;

– вывод данных из списка в виде таблицы;

– поиск элемента в списке по различным критериям (номеру поезда, имени пункта назначения, времени отправления);

– удаление элемента из списка по заданному ключу.

1. Составить программу, которая обрабатывает информацию о таксопарке.

Сведения о такси содержат:

– номер машины (ключ);

– ФИО водителя;

– марка машины;

– стаж водителя.

2. Составить программу, которая обрабатывает информацию о пользователях компьютерной сети.

Сведения о пользователе содержат:

– логин пользователя(ключ);

– дата регистрации;

– тип пользователя.

3. Составить программу, которая обрабатывает информацию о продаже билетов на концерт.

– дата концерта (ключ);

– название исполнителя;

– количество проданных билетов.

4. Составить программу, которая обрабатывает информацию о лабораториях института.

Сведения о лаборатории содержат:

– номер лаборатории (ключ);

– количество компьютеров;

– ФИО ответственного лаборанта.

5. Составить программу, которая обрабатывает информацию о мебельных гарнитурах, продаваемых в магазине.

Сведения о гарнитуре содержат:

– название гарнитура (ключ);

– количество предметов;

– цена;

– наличие на складе.

6. Составить программу, которая обрабатывает информацию о заказах на ремонт вычислительной техники.

Сведения о заказе содержат:

– номер заказа (ключ);

– ФИО заказчика;

– описание неисправности;

– стоимость ремонта.

7. Составить программу, которая обрабатывает информацию для учета автомобильных грузоперевозок.

Сведения о грузовике содержат:

– номер грузовика (ключ);

– ФИО водителя;

– грузоподъемность.

8. Составить программу, которая обрабатывает информацию об авиаполке.

Сведения об авиаполке содержат:

– номер полка (ключ);

– ФИО командира;

– количество самолетов;

– количество боеготовых самолетов.

9. Составить программу, которая обрабатывает информацию о гостиничных номерах.

Сведения о номере содержат:

– номер комнаты (ключ);

– этаж;

– вид номера;

– количество мест.

10. Составить программу, которая обрабатывает информацию о наличии автобусов в автобусном парке.

Сведения о каждом автобусе содержат:

– номер автобуса (ключ);

– ФИО водителя;

– номер маршрута.

11. Составить программу, которая обрабатывает информацию о книгах в библиотеке.

Сведения о книгах содержат:

– номер УДК (ключ);

– ФИО автора;

– название;

– год издания.

12. Составить программу, которая обрабатывает информацию о гражданах, лежащих в больнице.

Сведения о больном содержат:

– номер больного (ключ)

– ФИО больного;

– диагноз;

– номер палаты.

13. Составить программу, которая обрабатывает информацию о наличии бензина на автозаправочной станции.

Сведения о бензине содержат:

– марка бензина (ключ);

– цена за литр;

– количество литров наличии.

14. Составить программу, которая обрабатывает информацию о продажах компьютерных игр.

Сведения о туре содержат:

– название игры (ключ);

– издатель;

– количество проданных физических копий;

– количество проданных цифровых копий.

15. Составить программу, которая обрабатывает информацию о заявках на авиабилеты.

Каждая заявка содержит:

– номер рейса (ключ);

– пункт назначения;

– ФИО пассажира;

– желаемую дату вылета.

16. Составить программу, формирующую телефонный справочник.

Сведения об абоненте содержат:

– номер телефона (ключ);

– ФИО абонента;

– адрес абонента.

17. Составить программу, которая обрабатывает информацию об учебной дисциплине.

Сведения об учебной дисциплине содержат:

– шифр дисциплины (ключ);

– название дисциплины;

– количество лекционных часов;

– количество часов на лабораторные работы.

18. Составить программу, которая обрабатывает информацию о продаже автомобилей в автосалоне.

Сведения об автомобиле содержат:

– номер автомобиля (ключ);

– марка автомобиля;

– дата продажи;

19. Составить программу, которая обрабатывает информацию о заказе на пошив одежды в ателье.

Сведения о заказе содержат:

– номер заказа (ключ);

– предмет одежды;

– ФИО закройщика;

– стоимость материала.

20. Составить программу, которая обрабатывает информацию о врачах, работающих в поликлинике.

Сведения о враче содержат:

– табельный номер врача (ключ);

– ФИО врача;

– специализация;

– номер кабинета.

21. Составить программу, которая обрабатывает информацию о наличии приборов на складе.

Сведения о приборе содержат:

– название прибора (ключ);

– тип прибора;

– цена;

– количество на складе.

– ФИО менеджера.

22. Составить программу, которая обрабатывает информацию о продаже путевок в туристическом агентстве.

Сведения о туре содержат:

– название тура (ключ);

– продолжительность тура;

– стоимость путевки;

– количество проданных путевок.

23. Составить программу, которая обрабатывает информацию об оборудовании.

Сведения об оборудовании содержат:

– серийный номер (ключ);

– название оборудования;

– тип оборудования;

– стоимость оборудования.

24. Составить программу, которая обрабатывает информацию о файлах.

Сведения о файле содержат:

– название файла (ключ);

– тип файла;

– размер файла.

25. Составить программу, которая обрабатывает информацию о студентах.

Сведения о студенте содержат:

– номер зачетки (ключ);

– ФИО студента;

– группа.

26. Составить программу, которая обрабатывает информацию о сотрудниках.

Сведения о сотруднике содержат:

– табельный номер (ключ);

– ФИО сотрудника;

– должность.

27. Составить программу, которая обрабатывает информацию о счетах.

Сведения о счете содержат:

– номер счета (ключ);

– ФИО клиента;

– годовой процент.

28. Составить программу, которая обрабатывает информацию о товарах.

Сведения о товарах содержат:

– индекс товара (ключ);

– название товара;

– цена товара.

21