constk

For Anthony

Jan 15th, 2021 (edited)
601
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "Windows.h"
  2. #include <iostream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. template <class Type>
  8. struct Node { // узел списка
  9.     Type info; //данные
  10.     Node *next; //указатель на следующий узел
  11.     Node *prev; //указатель на предыдущий
  12. };
  13.  
  14. template <class Type>
  15. class doubleList { // Класс список
  16.     Node<Type> *head; // начало списка
  17.     Node<Type> *tail; // конец списка
  18.     int size = 0; // кол-во элементов в списке
  19. public:
  20.     doubleList() { // конструктор
  21.         head = tail = NULL;
  22.     }
  23.  
  24.     void addLast(Type info) { // добавление узла в конец
  25.         Node<Type> *buf = new Node<Type>;
  26.         buf->info = info;
  27.         if (head == NULL) { // если первый элемент списка ещё не создан
  28.             buf->next = tail;
  29.             head = buf;
  30.             buf->prev = NULL;
  31.         }
  32.         else { // если первый элемент списка уже создан
  33.             buf->next = tail->next;
  34.             buf->prev = tail;
  35.             tail->next = buf;
  36.         }
  37.         tail = buf;
  38.         size++;
  39.     }
  40.  
  41.     Type & getEl(int i) { // получить ссылку на i-ый элемент списка
  42.         if (i == 0) return head->info; // если нужен первый элемент - сразу его и возвращаем (на него указывает head)
  43.         else {
  44.             Node<Type> *buf = head->next;
  45.             int counter = 1;
  46.             while (buf != NULL) // пока не конец списка
  47.             {
  48.                 if (counter == i) return buf->info; // нашли элемент с нужным номером
  49.                 else if (buf->next != NULL) // если не нашли элемент и не конец списка
  50.                     buf = buf->next;
  51.                 else // если дошли до конца
  52.                     throw out_of_range("Can't get list element"); // что-то пошло не так. лучше бросить исключение
  53.                 ++counter;
  54.             }
  55.         }
  56.     }
  57.     // получаем именно ссылку, чтобы можно было потом менять этот элемент - иначе мы получим его копию и не сможем сделать ничего с оригиналом
  58.  
  59.     int getSize() { // получить количество элементов в списке
  60.         return size;
  61.     }
  62. };
  63.  
  64.  
  65. struct Bus { // автобус
  66.     int number; // номер автобуса
  67.     string driver; // ФИО водителя
  68.     bool onTheRoute; // находится ли автобус на маршруте
  69.     int routeNumber; // номер маршрута
  70. };
  71.  
  72.  
  73. int main()
  74. {
  75.     SetConsoleCP(1251);      
  76.     SetConsoleOutputCP(1251);
  77.     doubleList<Bus> busPark; // список автобусов
  78.  
  79.     // ввод данных
  80.     int n = 0;
  81.     cout << "Сколько автобусов в парке?" << endl;
  82.     cin >> n;
  83.     for (int i = 0; i < n; ++i) {
  84.         Bus bus;
  85.         cout << "Ввод данных о " << i + 1 << " автобусе:" << endl;
  86.         cout << "  номер автобуса:               "; cin >> bus.number;
  87.         cout << "  ФИО водителя:                 ";
  88.         cin.ignore(32767, '\n'); // нужно чтобы в getline() не попал шальной сисвол конца строки
  89.         getline(cin, bus.driver); // считываем сточку вместе со всеми пробелами чтобы корректно получить ФИО
  90.         cout << "  на маршруте ли автобус?(0/1): "; cin >> bus.onTheRoute;
  91.         cout << "  номер маршрута:               "; cin >> bus.routeNumber;
  92.         busPark.addLast(bus);
  93.     }
  94.  
  95.     // меню
  96.     cout << endl << "Чтобы вывести данные об автобусном парке нажмите 1" << endl
  97.         << "Чтобы указать выезжающий автобус нажмите 2" << endl
  98.         << "Чтобы указать въезжающий автобус нажмите 3" << endl
  99.         << "Чтобы вывести данные об автобусах на маршруте нажмите 4" << endl
  100.         << "Чтобы вывести данные об автобусах в депо нажмите 5" << endl
  101.         << "Чтобы закончить работу нажмите любую клавишу" << endl;
  102.     while (true) {
  103.         cout << "========================================================" << endl;
  104.         char input = 0;
  105.         int number = 0;
  106.         cin >> input;
  107.         switch (input) {
  108.         case '1':
  109.             // вывод данных
  110.             for (int i = 0; i < busPark.getSize(); ++i) {
  111.                 Bus bus;
  112.                 bus = busPark.getEl(i); // запоминаем i-й автобус в парке и выводим сведения о нём
  113.                 cout << "Вывод данных о " << i + 1 << " автобусе" << endl;
  114.                 cout << "  номер автобуса:               " << bus.number << endl;
  115.                 cout << "  ФИО водителя:                 " << bus.driver << endl;
  116.                 cout << "  на маршруте ли автобус?(0/1): " << (bus.onTheRoute ? "да" : "нет") << endl;
  117.                 cout << "  номер маршрута:               " << bus.routeNumber << endl;
  118.             }
  119.             break;
  120.         case '2':
  121.             // номер выезжающего автобуса
  122.             cout << "Введите номер выезжающего автобуса :"; cin >> number;
  123.             for (int i = 0; i < busPark.getSize(); ++i)
  124.                 if (busPark.getEl(i).number == number) // проверяем номер i-ого автобуса
  125.                     busPark.getEl(i).onTheRoute = true; // если совпадает с введённым - устанавливаем признак "на маршруте" в true
  126.             break;
  127.         case '3':
  128.             // номер выезжающего автобуса
  129.             cout << "Введите номер выезжающего автобуса :"; cin >> number;
  130.             for (int i = 0; i < busPark.getSize(); ++i)
  131.                 if (busPark.getEl(i).number == number) // проверяем номер i-ого автобуса
  132.                     busPark.getEl(i).onTheRoute = false; // если совпадает с введённым - устанавливаем признак "на маршруте" в false
  133.             break;
  134.         case '4':
  135.             // автобусы на маршруте
  136.             for (int i = 0; i < busPark.getSize(); ++i)
  137.                 if (busPark.getEl(i).onTheRoute == true) // проверяем на маршруте ли i-й автобус
  138.                     cout << "номер автобуса: " << busPark.getEl(i).number << endl; // если да - выводим его номер
  139.             break;
  140.         case '5':
  141.             // автобусы в депо
  142.             for (int i = 0; i < busPark.getSize(); ++i)
  143.                 if (busPark.getEl(i).onTheRoute == false) // проверяем на маршруте ли i-й автобус
  144.                     cout << "номер автобуса: " << busPark.getEl(i).number << endl; // если нет - выводим его номер
  145.             break;
  146.         default: exit(0); // выход из программы
  147.         }
  148.     }
  149.    
  150.     system("pause");
  151.     return 0;
  152. }
RAW Paste Data