SHARE
TWEET

Untitled

a guest Jan 28th, 2020 81 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <string>
  4. #include <fstream> //файлы
  5. #include <stdio.h> //файлы
  6. #include <stdlib.h> //преобразование типов в другие
  7. #include <iomanip> //форматирование вывода
  8. using namespace std;
  9.  
  10. struct train {
  11.     string destination;//строка из букв, пробелов, тире и цифр
  12.     int number;//целое число
  13.     unsigned int departureTime;//целое число минут
  14. };
  15.  
  16. struct list_node {
  17.     train* data;
  18.     list_node* next;
  19. };
  20.  
  21. void printTrain(train* t) {
  22.     int k = 9 - to_string(t->number).length();
  23.     cout << t->number << setw (k + 17) << t->departureTime/60 << ":";
  24.     if (t->departureTime % 60 > 9) {
  25.         cout << t->departureTime % 60 << setw(43);
  26.         }
  27.         else {
  28.         cout << "0" << t->departureTime % 60 << setw(43);
  29.         }
  30.     cout << t->destination << endl;
  31.     cout << endl;
  32. }
  33.  
  34. bool charIsDigit(char c) {
  35.     return c >= '0' && c <= '9';
  36. }
  37.  
  38. bool stringIsNumber(string s) {
  39.     for (char c : s) {
  40.         if (!charIsDigit(c)) {
  41.             return false;
  42.         }
  43.     }
  44.     return true;
  45. }
  46.  
  47. class TrainList {
  48.     list_node *head;
  49.  
  50. public:
  51.     TrainList() { head = NULL; }
  52.     ~TrainList();
  53.  
  54.     bool trainWithNumberExists(int number);
  55.     void add();
  56.     void remove();
  57.     void doRemove(int trainNumber);
  58.     void show();
  59.     void afterTime();
  60.     void sort();
  61.  
  62.     void save();
  63.     void load();
  64.     void modify();
  65.  
  66.     void freeList();
  67.     void exiting();
  68. };
  69.  
  70. TrainList::~TrainList(void) {
  71.     while (head != NULL) {
  72.         list_node *tmp = head->next;
  73.         delete head;
  74.         head = tmp;
  75.     }
  76. }
  77.  
  78. bool TrainList::trainWithNumberExists(int number) {
  79.     list_node *iter = head;
  80.     while (iter != NULL) {
  81.         if (iter->data->number == number) {
  82.             return true;
  83.         }
  84.         iter = iter->next;
  85.     }
  86.  
  87.     return false;
  88. }
  89.  
  90. void TrainList::show() {
  91.     if (head == NULL) {
  92.         cerr << "!Empty list!" << endl;
  93.         return;
  94.     }
  95.     cout << "Train number            Train departureTime            Train destination" << endl; //заголовок таблици
  96.     list_node *iter = head;
  97.     while (iter != NULL) {
  98.         printTrain(iter->data);
  99.         iter = iter->next;
  100.     }
  101. }
  102.  
  103. int readTime() {
  104.     string departureTimeString;
  105.     int hour = 0;
  106.     int minut = 0;
  107.     getline(cin, departureTimeString);
  108.     int r = sscanf_s(departureTimeString.c_str(), "%d %d", &hour, &minut);
  109.     if (r != 2 || hour < 0 || hour > 23 || minut < 0 || minut > 59) {
  110.         cerr << "!Wrong time format (H M)!" << endl;
  111.         return -1;
  112.     }
  113.     return hour * 60 + minut;
  114. }
  115.  
  116. void TrainList::add() {
  117.     int trainNumber;
  118.     int departTime;
  119.     while (true) {
  120.         cout << "Enter number of a train you want to add (only digits and leangth <= 9): " << endl;
  121.         string trainNumberString;
  122.         getline(cin, trainNumberString);
  123.         if(trainNumberString.length() > 9) {
  124.             cerr << "!Incorrect train number!" << endl;
  125.             continue;
  126.         }
  127.         if (!stringIsNumber(trainNumberString)) {
  128.             cerr << "!Incorrect train number!" << endl;
  129.             continue;
  130.         }
  131.         trainNumber = stoi(trainNumberString);
  132.         if (trainWithNumberExists(trainNumber)) {
  133.             cerr << "!Train with such number already exists!" << endl;
  134.             continue;
  135.         }
  136.         break;
  137.     }
  138.     while (true) {
  139.         cout << "Enter departure time of a train you want to add (H M): " << endl;
  140.         departTime = readTime();
  141.         if (departTime == -1) {
  142.             continue;
  143.         }
  144.         break;
  145.     }
  146.     cout << "Enter destination of a train you want to add" << endl; //нижний
  147.     string destination;
  148.     getline(cin, destination);
  149.     train* newTrain = new train;
  150.  
  151.     newTrain->number = trainNumber;
  152.     newTrain->departureTime = departTime;
  153.     newTrain->destination = destination;
  154.  
  155.     list_node* newNode = new list_node;
  156.     newNode->data = newTrain;
  157.     newNode->next = head;
  158.     head = newNode;
  159.     cout << "Element was added!" << endl;
  160. }
  161.  
  162. void TrainList::doRemove(int trainNumber) {
  163.     list_node *iter = head;
  164.     list_node *prev = NULL;
  165.     while (iter != NULL) {
  166.         if (iter->data->number == trainNumber) {
  167.             if (iter == head) {
  168.                 head = iter->next;
  169.                 delete head;
  170.             }
  171.             else {
  172.                 prev->next = iter->next;
  173.                 delete iter;
  174.                 iter = prev;
  175.             }
  176.         }
  177.  
  178.         prev = iter;
  179.         iter = iter->next;
  180.     }
  181. }
  182.  
  183. void TrainList::remove() {
  184.     if (head == NULL) {
  185.         cerr << "!Empty list!" << endl;
  186.         return;
  187.     }
  188.     string trainNumberString;
  189.     int trainNumber;
  190.     while (true) {
  191.         cout << "Enter number of train you want to delete" << endl;
  192.         getline(cin, trainNumberString);
  193.         if (!stringIsNumber(trainNumberString)) {
  194.             cerr << "!Incorrect train number!" << endl;
  195.             continue;
  196.         }
  197.         trainNumber = stoi(trainNumberString);
  198.         if (!trainWithNumberExists(trainNumber)) {
  199.             cerr << "!There is no train with such number!" << endl;
  200.             continue;
  201.         }
  202.         break;
  203.     }
  204.     doRemove(trainNumber);
  205.     cout << "Train was removed!" << endl;
  206. }
  207.  
  208. void TrainList::afterTime() {
  209.     if (head == NULL) {
  210.         cerr << "!Empty list!" << endl;
  211.         return;
  212.     }
  213.     int willDeparture;
  214.     while (true) {
  215.         cout << "After what time do you need trains (H M): " << endl;
  216.         willDeparture = readTime();
  217.         if (willDeparture == -1) {
  218.             continue;
  219.         }
  220.         break;
  221.     }
  222.     list_node *iter = head;
  223.     bool flag = false;
  224.     while (iter != NULL) {
  225.         if (iter->data->departureTime >= willDeparture) {
  226.             printTrain(iter->data);
  227.             flag = true;
  228.         }
  229.         iter = iter->next;
  230.     }
  231.     if (!flag) {
  232.         cerr << "!No trains after that time!" << endl;
  233.     }
  234. }
  235.  
  236. void TrainList::load() {
  237.     ifstream fp("trains.txt");
  238.     freeList(); //При загрузке очищает память
  239.     int trainNumber = 0;
  240.     int departureTime = 0;
  241.     char destination[100];
  242.     string line;
  243.     size_t line_size;
  244.     int r;
  245.     int notLoaded = 0;
  246.     char trainNumberString[100];
  247.     char departureTimeString[100];
  248.     while (getline(fp, line)) {
  249.         r = sscanf_s(line.c_str(), "%s %s %[^\n\t]", trainNumberString, (rsize_t)sizeof trainNumberString, departureTimeString, (rsize_t)sizeof departureTimeString, destination, (rsize_t)sizeof destination);
  250.         if (r == 3 && stringIsNumber(trainNumberString)) {
  251.             trainNumber = stoi(trainNumberString);
  252.             if (!trainWithNumberExists(trainNumber) && stringIsNumber(departureTimeString)) {
  253.                 departureTime = stoi(departureTimeString);
  254.                 if (departureTime < 1440) {
  255.                     train* newTrain = new train;
  256.                     newTrain->number = trainNumber;
  257.                     newTrain->departureTime = departureTime;
  258.                     newTrain->destination = (destination);
  259.  
  260.                     list_node* newNode = new list_node;
  261.                     newNode->data = newTrain;
  262.                     newNode->next = head;
  263.                     head = newNode;
  264.                 }
  265.                 else {
  266.                     notLoaded++;
  267.                 }
  268.             }
  269.             else {
  270.                 notLoaded++;
  271.             }
  272.         }
  273.         else {
  274.             notLoaded++;
  275.         }
  276.     }
  277.     if (notLoaded > 0) {
  278.         cout << notLoaded << " trains wasnt loaded" << endl;
  279.         cout << "File was loaded but not fully!" << endl;
  280.         fp.close();
  281.         return;
  282.     }
  283.     cout << "File was loaded fully!" << endl;
  284.     fp.close();
  285. }
  286.  
  287. void TrainList::save() {
  288.     if (head == NULL) {
  289.         cerr << "!Empty list!" << endl;
  290.         return;
  291.     }
  292.     ofstream file;
  293.     file.open("trains.txt", ofstream::out | ofstream::trunc);
  294.     list_node *iter = head;
  295.     while (iter != NULL) {
  296.         file << iter->data->number << " " << iter->data->departureTime << " " << iter->data->destination << endl;
  297.             iter = iter->next;
  298.     }
  299.     file.close();
  300.     cout << "Data was saved!" << endl;
  301. }
  302.  
  303. void TrainList::modify() {
  304.     if (head == NULL) {
  305.         cerr << "!Empty list!" << endl;
  306.         return;
  307.     }
  308.     string modiTrainString;
  309.     int modiTrain;
  310.     int departTime;
  311.     while (true) {
  312.         cout << "Which train to modify: ";
  313.         getline(cin, modiTrainString);
  314.         if (!stringIsNumber(modiTrainString)) {
  315.             cerr << "!Incorrect train number!" << endl;
  316.             continue;
  317.         }
  318.         modiTrain = stoi(modiTrainString);
  319.         if (!trainWithNumberExists(modiTrain)) {
  320.             cerr << "!There is no train with such number!" << endl;
  321.             continue;
  322.         }
  323.         break;
  324.     }
  325.     while (true) {
  326.         cout << "Enter new departure time of a train (H M): " << endl;
  327.         departTime = readTime();
  328.         if (departTime == -1) {
  329.             continue;
  330.         }
  331.         break;
  332.     }
  333.     cout << "Enter new destination of a train: " << endl;
  334.     string destination;
  335.     getline(cin, destination);
  336.     list_node *iter = head;
  337.     while (iter != NULL) {
  338.         if (iter->data->number == modiTrain) {
  339.             iter->data->departureTime = departTime;
  340.             iter->data->destination = destination;
  341.         }
  342.         iter = iter->next;
  343.     }
  344.     cout << "Modifying completed!" << endl;
  345.     return;
  346. }
  347.  
  348. void TrainList::sort() {
  349.     if (head == NULL) {
  350.         cerr << "!Empty list!" << endl;
  351.         return;
  352.     }
  353.     list_node *iter = head;
  354.     bool bubble = true;
  355.     while (bubble) {
  356.         bubble = false;
  357.         list_node *prev = NULL;
  358.         iter = head;
  359.         while (iter != NULL) {
  360.             list_node *next = iter->next;
  361.             if (next != NULL && iter->data->departureTime > next->data->departureTime) {
  362.                 if (prev) {
  363.                     prev->next = next;
  364.                 }
  365.                 else {
  366.                     head = next;
  367.                 }
  368.                 list_node* tmp = next->next;
  369.                 next->next = iter;
  370.                 iter->next = tmp;
  371.                 bubble = true;
  372.             }
  373.             prev = iter;
  374.             iter = next;
  375.         }
  376.     }
  377.     cout << "List was sorted!" << endl;
  378. }
  379.  
  380. void  TrainList::freeList() {
  381.     list_node *iter = head;
  382.     while (iter != NULL) {
  383.         list_node* nIter = iter->next;
  384.         free(iter->data);
  385.         free(iter);
  386.         iter = nIter;
  387.     }
  388.     head = NULL;
  389. }
  390.  
  391. void  TrainList::exiting() {
  392.     cout << "Do you want to save data? (y-YES/n-NO): " << endl;
  393.     char ans;
  394.     cin >> ans;
  395.     cin.ignore();
  396.     if (ans == 'y') {
  397.         save();
  398.         freeList();
  399.         exit(0);
  400.     }
  401.     if (ans == 'n') {
  402.         freeList();
  403.         exit(0);
  404.     }
  405.     cerr << "!Wrond command, try again!" << endl;
  406. }
  407.  
  408. int main() {
  409.     setlocale(LC_ALL, "ru");
  410.     TrainList trains;
  411.     while (true) {
  412.         cout << "Commands:" << endl;
  413.         cout << "Enter 1 to add new train;" << endl;
  414.         cout << "Enter 2 to modify one of the trains" << endl;
  415.         cout << "Enter 3 to show existing trains" << endl;
  416.         cout << "Enter 4 to show trains that departures afther certain time" << endl;
  417.         cout << "Enter 5 to delete one of the trains" << endl;
  418.         cout << "Enter 6 to save trains to file" << endl;
  419.         cout << "Enter 7 to load trains from file (existing data will be deleted)" << endl;
  420.         cout << "Enter 8 to sort trains by time" << endl;
  421.         cout << "Enter 9 to exit" << endl;
  422.  
  423.         string command;
  424.         getline(cin, command);
  425.  
  426.         if (command.size() > 1) {
  427.             cerr << "!Wrond command, try again!" << endl;
  428.             continue;
  429.         }
  430.         if (command.size() == 0){
  431.             cout << endl;
  432.             continue;
  433.         }
  434.  
  435.         switch (command[0]) {
  436.         case '1':
  437.             trains.add();
  438.             break;
  439.         case '2':
  440.             trains.modify();
  441.             break;
  442.         case '3':
  443.             trains.show();
  444.             break;
  445.         case '4':
  446.             trains.afterTime();
  447.             break;
  448.         case '5':
  449.             trains.remove();
  450.             break;
  451.         case '6':
  452.             trains.save();
  453.             break;
  454.         case '7':
  455.             trains.load();
  456.             break;
  457.         case '8':
  458.             trains.sort();
  459.             break;
  460.         case '9':
  461.             trains.exiting();
  462.             break;
  463.         default:
  464.             cerr << "!Wrond command, try again!" << endl;
  465.             continue;
  466.         }
  467.     }
  468.     return 0;
  469. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top