Advertisement
NickAndNick

Регистрация пассажиров

Oct 15th, 2022 (edited)
844
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.82 KB | Source Code | 0 0
  1. #include <algorithm>
  2. #include <cstdlib>
  3. #include <fstream>
  4. #include <iostream>
  5. #include <tuple>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  
  10. template<typename T>
  11. T input(istream& inp, const string& msg) {
  12.     cout << msg;
  13.     T value{};
  14.     inp >> value;
  15.     inp.ignore(0x1000, '\n');
  16.     return value;
  17. }
  18.  
  19. class Passenger {
  20. public:
  21.     Passenger()
  22.         : quantity(0), weight(0) {}
  23.  
  24.     Passenger(const int q, const int w, const string& s, const string& n, const string& f)
  25.         : quantity(q), weight(w), surname(s), name(n), number(f) {}
  26.  
  27.     string flight()const {
  28.         return number;
  29.     }
  30.  
  31.     int baggage()const {
  32.         return quantity;
  33.     }
  34.  
  35.     tuple<int, int, string, string, string> get()const {
  36.         return { quantity, weight, surname, name, number };
  37.     }
  38.  
  39.     void show()const {
  40.         cout
  41.             << surname << ' ' << name << '\n'
  42.             << "\tКоличество вещей: " << quantity << '\n'
  43.             << "\tВес багажа: " << weight << '\n';
  44.     }
  45. private:
  46.     int quantity;
  47.     int weight;
  48.     string surname;
  49.     string name;
  50.     string number;
  51.  
  52.     friend bool operator<(const Passenger& a, const Passenger& b) {
  53.         if (a.surname < b.surname) return true;
  54.         if (a.surname == b.surname && a.name < b.name) return true;
  55.         return false;
  56.     }
  57.  
  58.     friend istream& operator>>(istream& inp, Passenger& p) {
  59.         p.surname = input<string>(inp, "Фамилия: ");
  60.         p.name = input<string>(inp, "Имя: ");
  61.         p.number = input<string>(inp, "Номер рейса: ");
  62.         p.quantity = input<int>(inp, "Количество вещей: ");
  63.         p.weight = input<int>(inp, "Вес багажа: ");
  64.         return inp;
  65.     }
  66.  
  67.     friend ostream& operator<<(ostream& out, const Passenger& p) {
  68.         return out
  69.             << "Рейс: " << p.number << '\n'
  70.             << '\t' << p.surname << ' ' << p.name << '\n'
  71.             << "\tКоличество вещей: " << p.quantity << '\n'
  72.             << "\tВес багажа: " << p.weight << '\n';
  73.     }
  74. };
  75.  
  76. class PassengerTraffic {
  77. public:
  78.     PassengerTraffic(const string& path)
  79.         : path(path) {}
  80.  
  81.     ~PassengerTraffic() {
  82.         save();
  83.     }
  84.  
  85.     void add(const Passenger& p) {
  86.         traffic.push_back(p);
  87.     }
  88.  
  89.     void info(const string& number)const {
  90.         for (const auto& p : traffic) {
  91.             if (p.flight() == number) {
  92.                 p.show();
  93.             }
  94.         }
  95.     }
  96.  
  97.     Passenger max_quantity()const {
  98.         auto comp = [](const Passenger& a, const Passenger& b) {
  99.             return a.baggage() < b.baggage();
  100.         };
  101.         return *max_element(traffic.begin(), traffic.end(), comp);
  102.     }
  103.  
  104.     bool load() {
  105.         ifstream inp(path);
  106.         if (!inp.is_open()) {
  107.             puts("Примечание! База данных не существует.");
  108.             return false;
  109.         }
  110.  
  111.         int quantity;
  112.         int weight;
  113.         string surname;
  114.         string name;
  115.         string number;
  116.  
  117.         while (inp >> quantity >> weight >> surname >> name >> number) {
  118.             traffic.push_back({ quantity, weight, surname, name, number });
  119.         }
  120.  
  121.         inp.close();
  122.  
  123.         if (traffic.empty()) {
  124.             puts("Примечание! Список пустой.");
  125.         }
  126.  
  127.         return true;
  128.     }
  129.  
  130.     void save()const {
  131.         ofstream out(path);
  132.         if (!out.is_open()) {
  133.             puts("Ошибка: данные не сохранены!");
  134.             return;
  135.         }
  136.  
  137.         for (const auto& p : traffic) {
  138.             const auto& [quantity, weight, surname, name, number] = p.get();
  139.             out << quantity << ' '
  140.                 << weight << ' '
  141.                 << surname << ' '
  142.                 << name << ' '
  143.                 << number << '\n';
  144.         }
  145.  
  146.         out.close();
  147.     }
  148.  
  149.     void show()const {
  150.         if (traffic.empty()) {
  151.             puts("Список пустой!");
  152.             return;
  153.         }
  154.  
  155.         for (const auto& p : traffic) {
  156.             cout << p << '\n';
  157.         }
  158.     }
  159.  
  160.     void sortlist() {
  161.         sort(traffic.begin(), traffic.end());
  162.     }
  163. private:
  164.     string path;
  165.     vector<Passenger> traffic;
  166. };
  167.  
  168. int main() {
  169.     system("chcp 1251 > nul"); // for Windows
  170.  
  171.     auto path = input<string>(cin, "Путь к файлу базы данных: ");
  172.     PassengerTraffic pt(path);
  173.     int point{};
  174.     Passenger p;
  175.     string n;
  176.  
  177.     do {
  178.         puts("\n0. Выход из программы");
  179.         puts("1. Получить информацию о всех пассажирах");
  180.         puts("2. Загрузить");
  181.         puts("3. Добавить");
  182.         puts("4. Сохранить");
  183.         puts("5. Сортировать");
  184.         puts("6. Найти пассажира");
  185.         puts("7. Получить информацию о рейсе");
  186.         cout << ">>> ";
  187.         cin >> point;
  188.         puts("");
  189.         switch (point) {
  190.             case 0:
  191.                 break;
  192.             case 1:
  193.                 pt.show();
  194.                 break;
  195.             case 2:
  196.                 pt.load();
  197.                 break;
  198.             case 3:
  199.                 cin >> p;
  200.                 pt.add(p);
  201.                 break;
  202.             case 4:
  203.                 pt.save();
  204.                 break;
  205.             case 5:
  206.                 pt.sortlist();
  207.                 break;
  208.             case 6:
  209.                 cout << pt.max_quantity() << '\n';
  210.                 break;
  211.             case 7:
  212.                 n = input<string>(cin, "Номер рейса: ");
  213.                 pt.info(n); break;
  214.             default:
  215.                 puts("Ошибка: пункт меню не существует!");
  216.         }
  217.     } while (point);
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement