Kwwiker

СиАОД 3

Mar 25th, 2021
537
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <Windows.h>
  4. using namespace std;
  5.  
  6. struct BusInfo {
  7.     int routeNum;
  8.     string minute, hour, day, month, year;
  9.     double cost;
  10. };
  11.  
  12. struct Node
  13. {
  14.     string busNum;
  15.     BusInfo info;
  16.     Node* prev;
  17.     Node* next;
  18. };
  19.  
  20. BusInfo createBus() {
  21.     BusInfo info;
  22.     cout << "Введите номер маршрута: ";
  23.     cin >> info.routeNum;
  24.     cout << "Введите дату отправления в формате дд.мм.гггг: ";
  25.     string date;
  26.     cin >> date;
  27.     info.day = date.substr(0, 2);
  28.     info.month = date.substr(3, 2);
  29.     info.year = date.substr(6, 4);
  30.     cout << "Введите время отправления в формате чч:мм: ";
  31.     string time;
  32.     cin >> time;
  33.     info.hour = time.substr(0, 2);
  34.     info.minute = time.substr(3, 2);
  35.     cout << "Введите цену поездки: ";
  36.     cin >> info.cost;
  37.     return info;
  38. }
  39.  
  40. void printNodeWithLabel(Node* cur) {
  41.     cout << "Номер автобуса: " << cur->busNum << " Маршрут: " << cur->info.routeNum << " Дата отправления: "
  42.         << cur->info.day << "." << cur->info.month << "." << cur->info.year << " Время отправления: "
  43.         << cur->info.hour << ":" << cur->info.minute << " Цена поездки: " << cur->info.cost << "р" << endl;
  44. }
  45.  
  46. void printNode(Node* cur) {
  47.     cout << cur->busNum << "\t\t\t" << cur->info.routeNum << "\t\t"
  48.         << cur->info.day << "." << cur->info.month << "." << cur->info.year << "\t\t"
  49.         << cur->info.hour << ":" << cur->info.minute << "\t\t\t" << cur->info.cost << "р" << endl;
  50. }
  51.  
  52. void printList(Node* head) {
  53.     Node* current = head;
  54.     if (head != NULL) {
  55.         cout << "Номер автобуса:\t\t" << "Маршрут:\t" << "Дата отправления:\t"
  56.             << "Время отправления:\t" << "Цена поездки:\t" << endl;
  57.     }
  58.     while (current != NULL) {
  59.         printNode(current);
  60.         current = current->next;
  61.     }
  62.     cout << endl;
  63. }
  64.  
  65. void printReverseList(Node* tail) {
  66.     Node* current = tail;
  67.     if (tail != NULL) {
  68.         cout << "Номер автобуса:\t\t" << "Маршрут:\t" << "Дата отправления:\t"
  69.             << "Время отправления:\t" << "Цена поездки:\t" << endl;
  70.     }
  71.     while (current != NULL) {
  72.         printNode(current);
  73.         current = current->prev;
  74.     }
  75.     cout << endl;
  76. }
  77.  
  78. void addAtFront(Node*& head, Node*& tail, string busNum, BusInfo info) {
  79.     if (head == NULL && tail == NULL)
  80.     {
  81.         Node* temp = new Node;
  82.         temp->busNum = busNum;
  83.         temp->info = info;
  84.         temp->next = NULL;
  85.         temp->prev = NULL;
  86.         head = temp;
  87.         tail = temp;
  88.     }
  89.     else
  90.     {
  91.         Node* temp = new Node;
  92.         temp->busNum = busNum;
  93.         temp->info = info;
  94.         temp->next = head;
  95.         temp->prev = NULL;
  96.         head->prev = temp;
  97.         head = temp;
  98.     }
  99. }
  100.  
  101. void addAtBack(Node*& head, Node*& tail, string busNum, BusInfo info) {
  102.     if (head == NULL && tail == NULL)
  103.     {
  104.         Node* temp = new Node;
  105.         temp->busNum = busNum;
  106.         temp->info = info;
  107.         temp->next = NULL;
  108.         temp->prev = NULL;
  109.         head = temp;
  110.         tail = temp;
  111.     }
  112.     else
  113.     {
  114.         Node* temp = new Node;
  115.         temp->busNum = busNum;
  116.         temp->info = info;
  117.         temp->prev = tail;
  118.         temp->next = NULL;
  119.         tail->next = temp;
  120.         tail = temp;
  121.     }
  122. }
  123.  
  124. void createList(Node*& head, Node*& tail, int n) {
  125.     for (int i = 0; i < n; i++) {
  126.         string busNum;
  127.         cout << "Введите номер автобуса: ";
  128.         cin >> busNum;
  129.         addAtBack(head, tail, busNum, createBus());
  130.         cout << endl;
  131.     }
  132. }
  133.  
  134. void addAfterLastWithValue(Node*& tail, string busNum) {
  135.     Node* elem = tail;
  136.     while (elem != NULL) {
  137.         if (elem->busNum == busNum) {
  138.             Node* newNode = new Node;
  139.             cout << "Введите номер автобуса: ";
  140.             cin >> newNode->busNum;
  141.             newNode->info = createBus();
  142.             cout << endl;
  143.             newNode->next = elem->next;
  144.             newNode->prev = elem;
  145.             if (elem->next != NULL) {
  146.                 elem->next->prev = newNode;
  147.             }
  148.             elem->next = newNode;
  149.             break;
  150.         }
  151.         elem = elem->prev;
  152.     }
  153. }
  154.  
  155. void delAllWithValue(Node*& head, string busNum) {
  156.     Node* elem = head;
  157.     while (elem != NULL) {
  158.         if (elem->busNum == busNum) {
  159.             if (elem->prev == NULL && elem->next == NULL) {
  160.                 head = NULL;
  161.                 break;
  162.             }
  163.             if (elem->prev != NULL) {
  164.                 elem->prev->next = elem->next;
  165.             }
  166.             if (elem->next != NULL) {
  167.                 elem->next->prev = elem->prev;
  168.             }
  169.         }
  170.         elem = elem->next;
  171.     }
  172. }
  173.  
  174. int countWithValue(Node* head, string busNum, string date) {
  175.     Node* elem = head;
  176.     int count = 0;
  177.     string day = date.substr(0, 2);
  178.     string month = date.substr(3, 2);
  179.     string year = date.substr(6, 4);
  180.     while (elem != NULL) {
  181.         if (elem->busNum == busNum && elem->info.day == day && elem->info.month == month && elem->info.year == year) {
  182.             count++;
  183.         }
  184.         elem = elem->next;
  185.     }
  186.     return count;
  187. }
  188.  
  189. Node* getNode(Node* head, string value) {
  190.     Node* elem = head;
  191.     while (elem != NULL) {
  192.         if (elem->busNum == value) {
  193.             break;
  194.         }
  195.         elem = elem->next;
  196.     }
  197.     return elem;
  198. }
  199.  
  200. Node* getLastNode(Node* tail, string value) {
  201.     Node* elem = tail;
  202.     while (elem != NULL) {
  203.         if (elem->busNum == value) {
  204.             break;
  205.         }
  206.         elem = elem->prev;
  207.     }
  208.     return elem;
  209. }
  210.  
  211. void menu() {
  212.     Node* head = NULL;
  213.     Node* tail = NULL;
  214.     while (true) {
  215.     MENU:
  216.         cout << "Выберите действие:" << endl;
  217.         cout << "1. Создать список рейсов" << endl;
  218.         cout << "2. Добавить рейс в начало списка" << endl;
  219.         cout << "3. Добавить рейс в конец списка" << endl;
  220.         cout << "4. Добавить рейс в список после последнего рейса автобуса с заданным номером" << endl;
  221.         cout << "5. Убрать из списка все рейсы автобуса с заданным номером" << endl;
  222.         cout << "6. Подсчитать, сколько раз автобус с заданным номером выходил на маршрут в течении заданного дня" << endl;
  223.         cout << "7. Вывести первый в списке рейс автобуса с заданным номером" << endl;
  224.         cout << "8. Вывести последний в списке рейс автобуса с заданным номером" << endl;
  225.         cout << "9. Вывести список" << endl;
  226.         cout << "10. Вывести список в обратном порядке" << endl;
  227.         cout << "0. Выход" << endl;
  228.         int choice;
  229.         string busNum;
  230.         int num;
  231.         string date;
  232.     RETRY:
  233.         cin >> choice;
  234.         switch (choice)
  235.         {
  236.         case 1:
  237.             cout << "Введите количество рейсов, которое вы хотите создать: ";
  238.             cin >> num;
  239.             createList(head, tail, num);
  240.             goto MENU;
  241.         case 2:
  242.             cout << "Введите номер автобуса: ";
  243.             cin >> busNum;
  244.             addAtFront(head, tail, busNum, createBus());
  245.             cout << endl;
  246.             goto MENU;
  247.         case 3:
  248.             cout << "Введите номер автобуса: ";
  249.             cin >> busNum;
  250.             addAtBack(head, tail, busNum, createBus());
  251.             cout << endl;
  252.             goto MENU;
  253.         case 4:
  254.             cout << "Введите номер автобуса, после последнего рейса которого хотите добавить новый рейс: ";
  255.             cin >> busNum;
  256.             addAfterLastWithValue(tail, busNum);
  257.             cout << endl;
  258.             goto MENU;
  259.         case 5:
  260.             cout << "Введите номер автобуса: ";
  261.             cin >> busNum;
  262.             delAllWithValue(head, busNum);
  263.             cout << endl;
  264.             goto MENU;
  265.         case 6:
  266.             cout << "Введите номер автобуса: ";
  267.             cin >> busNum;
  268.             cout << "Введите дату в формате дд.мм.гггг: ";
  269.             cin >> date;
  270.             cout << "Автобус с номером " << busNum << " выходил " << date << " на маршрут " << countWithValue(head, busNum, date) << " раз" << endl;
  271.             cout << endl;
  272.             goto MENU;
  273.         case 7:
  274.             cout << "Введите номер автобуса: ";
  275.             cin >> busNum;
  276.             if (getNode(head, busNum) != NULL) {
  277.                 printNodeWithLabel(getNode(head, busNum));
  278.             }
  279.             else cout << "Автобуса с таким номером не существует!" << endl;
  280.             cout << endl;
  281.             goto MENU;
  282.         case 8:
  283.             cout << "Введите номер автобуса: ";
  284.             cin >> busNum;
  285.             if (getLastNode(tail, busNum) != NULL) {
  286.                 printNodeWithLabel(getLastNode(tail, busNum));
  287.             }
  288.             else cout << "Автобуса с таким номером не существует!" << endl;
  289.             cout << endl;
  290.             goto MENU;
  291.         case 9:
  292.             printList(head);
  293.             cout << endl;
  294.             goto MENU;
  295.         case 10:
  296.             printReverseList(tail);
  297.             cout << endl;
  298.             goto MENU;
  299.         case 0:
  300.             goto EXIT;
  301.         default:
  302.             cout << "Попробуй ещё раз)" << endl;
  303.             goto RETRY;
  304.         }
  305.     }
  306. EXIT:
  307.     return;
  308. }
  309.    
  310.  
  311.  
  312. int main()
  313. {
  314.     SetConsoleCP(1251);
  315.     SetConsoleOutputCP(1251);
  316.     menu();
  317. }
  318.  
RAW Paste Data