Текст программы
#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. Составить программу, которая обрабатывает информацию о товарах.
Сведения о товарах содержат:
– индекс товара (ключ);
– название товара;
– цена товара.