Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Windows.h"
- #include <iostream>
- #include <string>
- using namespace std;
- template <class Type>
- struct Node { // узел списка
- Type info; //данные
- Node *next; //указатель на следующий узел
- Node *prev; //указатель на предыдущий
- };
- template <class Type>
- class doubleList { // Класс список
- Node<Type> *head; // начало списка
- Node<Type> *tail; // конец списка
- int size = 0; // кол-во элементов в списке
- public:
- doubleList() { // конструктор
- head = tail = NULL;
- }
- void addLast(Type info) { // добавление узла в конец
- Node<Type> *buf = new Node<Type>;
- buf->info = info;
- if (head == NULL) { // если первый элемент списка ещё не создан
- buf->next = tail;
- head = buf;
- buf->prev = NULL;
- }
- else { // если первый элемент списка уже создан
- buf->next = tail->next;
- buf->prev = tail;
- tail->next = buf;
- }
- tail = buf;
- size++;
- }
- Type & getEl(int i) { // получить ссылку на i-ый элемент списка
- if (i == 0) return head->info; // если нужен первый элемент - сразу его и возвращаем (на него указывает head)
- else {
- Node<Type> *buf = head->next;
- int counter = 1;
- while (buf != NULL) // пока не конец списка
- {
- if (counter == i) return buf->info; // нашли элемент с нужным номером
- else if (buf->next != NULL) // если не нашли элемент и не конец списка
- buf = buf->next;
- else // если дошли до конца
- throw out_of_range("Can't get list element"); // что-то пошло не так. лучше бросить исключение
- ++counter;
- }
- }
- }
- // получаем именно ссылку, чтобы можно было потом менять этот элемент - иначе мы получим его копию и не сможем сделать ничего с оригиналом
- int getSize() { // получить количество элементов в списке
- return size;
- }
- };
- struct Bus { // автобус
- int number; // номер автобуса
- string driver; // ФИО водителя
- bool onTheRoute; // находится ли автобус на маршруте
- int routeNumber; // номер маршрута
- };
- int main()
- {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- doubleList<Bus> busPark; // список автобусов
- // ввод данных
- int n = 0;
- cout << "Сколько автобусов в парке?" << endl;
- cin >> n;
- for (int i = 0; i < n; ++i) {
- Bus bus;
- cout << "Ввод данных о " << i + 1 << " автобусе:" << endl;
- cout << " номер автобуса: "; cin >> bus.number;
- cout << " ФИО водителя: ";
- cin.ignore(32767, '\n'); // нужно чтобы в getline() не попал шальной сисвол конца строки
- getline(cin, bus.driver); // считываем сточку вместе со всеми пробелами чтобы корректно получить ФИО
- cout << " на маршруте ли автобус?(0/1): "; cin >> bus.onTheRoute;
- cout << " номер маршрута: "; cin >> bus.routeNumber;
- busPark.addLast(bus);
- }
- // меню
- cout << endl << "Чтобы вывести данные об автобусном парке нажмите 1" << endl
- << "Чтобы указать выезжающий автобус нажмите 2" << endl
- << "Чтобы указать въезжающий автобус нажмите 3" << endl
- << "Чтобы вывести данные об автобусах на маршруте нажмите 4" << endl
- << "Чтобы вывести данные об автобусах в депо нажмите 5" << endl
- << "Чтобы закончить работу нажмите любую клавишу" << endl;
- while (true) {
- cout << "========================================================" << endl;
- char input = 0;
- int number = 0;
- cin >> input;
- switch (input) {
- case '1':
- // вывод данных
- for (int i = 0; i < busPark.getSize(); ++i) {
- Bus bus;
- bus = busPark.getEl(i); // запоминаем i-й автобус в парке и выводим сведения о нём
- cout << "Вывод данных о " << i + 1 << " автобусе" << endl;
- cout << " номер автобуса: " << bus.number << endl;
- cout << " ФИО водителя: " << bus.driver << endl;
- cout << " на маршруте ли автобус?(0/1): " << (bus.onTheRoute ? "да" : "нет") << endl;
- cout << " номер маршрута: " << bus.routeNumber << endl;
- }
- break;
- case '2':
- // номер выезжающего автобуса
- cout << "Введите номер выезжающего автобуса :"; cin >> number;
- for (int i = 0; i < busPark.getSize(); ++i)
- if (busPark.getEl(i).number == number) // проверяем номер i-ого автобуса
- busPark.getEl(i).onTheRoute = true; // если совпадает с введённым - устанавливаем признак "на маршруте" в true
- break;
- case '3':
- // номер выезжающего автобуса
- cout << "Введите номер выезжающего автобуса :"; cin >> number;
- for (int i = 0; i < busPark.getSize(); ++i)
- if (busPark.getEl(i).number == number) // проверяем номер i-ого автобуса
- busPark.getEl(i).onTheRoute = false; // если совпадает с введённым - устанавливаем признак "на маршруте" в false
- break;
- case '4':
- // автобусы на маршруте
- for (int i = 0; i < busPark.getSize(); ++i)
- if (busPark.getEl(i).onTheRoute == true) // проверяем на маршруте ли i-й автобус
- cout << "номер автобуса: " << busPark.getEl(i).number << endl; // если да - выводим его номер
- break;
- case '5':
- // автобусы в депо
- for (int i = 0; i < busPark.getSize(); ++i)
- if (busPark.getEl(i).onTheRoute == false) // проверяем на маршруте ли i-й автобус
- cout << "номер автобуса: " << busPark.getEl(i).number << endl; // если нет - выводим его номер
- break;
- default: exit(0); // выход из программы
- }
- }
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement