Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <cstdlib>
- #include <fstream>
- #include <iostream>
- #include <tuple>
- #include <vector>
- using namespace std;
- template<typename T>
- T input(istream& inp, const string& msg) {
- cout << msg;
- T value{};
- inp >> value;
- inp.ignore(0x1000, '\n');
- return value;
- }
- class Passenger {
- public:
- Passenger()
- : quantity(0), weight(0) {}
- Passenger(const int q, const int w, const string& s, const string& n, const string& f)
- : quantity(q), weight(w), surname(s), name(n), number(f) {}
- string flight()const {
- return number;
- }
- int baggage()const {
- return quantity;
- }
- tuple<int, int, string, string, string> get()const {
- return { quantity, weight, surname, name, number };
- }
- void show()const {
- cout
- << surname << ' ' << name << '\n'
- << "\tКоличество вещей: " << quantity << '\n'
- << "\tВес багажа: " << weight << '\n';
- }
- private:
- int quantity;
- int weight;
- string surname;
- string name;
- string number;
- friend bool operator<(const Passenger& a, const Passenger& b) {
- if (a.surname < b.surname) return true;
- if (a.surname == b.surname && a.name < b.name) return true;
- return false;
- }
- friend istream& operator>>(istream& inp, Passenger& p) {
- p.surname = input<string>(inp, "Фамилия: ");
- p.name = input<string>(inp, "Имя: ");
- p.number = input<string>(inp, "Номер рейса: ");
- p.quantity = input<int>(inp, "Количество вещей: ");
- p.weight = input<int>(inp, "Вес багажа: ");
- return inp;
- }
- friend ostream& operator<<(ostream& out, const Passenger& p) {
- return out
- << "Рейс: " << p.number << '\n'
- << '\t' << p.surname << ' ' << p.name << '\n'
- << "\tКоличество вещей: " << p.quantity << '\n'
- << "\tВес багажа: " << p.weight << '\n';
- }
- };
- class PassengerTraffic {
- public:
- PassengerTraffic(const string& path)
- : path(path) {}
- ~PassengerTraffic() {
- save();
- }
- void add(const Passenger& p) {
- traffic.push_back(p);
- }
- void info(const string& number)const {
- for (const auto& p : traffic) {
- if (p.flight() == number) {
- p.show();
- }
- }
- }
- Passenger max_quantity()const {
- auto comp = [](const Passenger& a, const Passenger& b) {
- return a.baggage() < b.baggage();
- };
- return *max_element(traffic.begin(), traffic.end(), comp);
- }
- bool load() {
- ifstream inp(path);
- if (!inp.is_open()) {
- puts("Примечание! База данных не существует.");
- return false;
- }
- int quantity;
- int weight;
- string surname;
- string name;
- string number;
- while (inp >> quantity >> weight >> surname >> name >> number) {
- traffic.push_back({ quantity, weight, surname, name, number });
- }
- inp.close();
- if (traffic.empty()) {
- puts("Примечание! Список пустой.");
- }
- return true;
- }
- void save()const {
- ofstream out(path);
- if (!out.is_open()) {
- puts("Ошибка: данные не сохранены!");
- return;
- }
- for (const auto& p : traffic) {
- const auto& [quantity, weight, surname, name, number] = p.get();
- out << quantity << ' '
- << weight << ' '
- << surname << ' '
- << name << ' '
- << number << '\n';
- }
- out.close();
- }
- void show()const {
- if (traffic.empty()) {
- puts("Список пустой!");
- return;
- }
- for (const auto& p : traffic) {
- cout << p << '\n';
- }
- }
- void sortlist() {
- sort(traffic.begin(), traffic.end());
- }
- private:
- string path;
- vector<Passenger> traffic;
- };
- int main() {
- system("chcp 1251 > nul"); // for Windows
- auto path = input<string>(cin, "Путь к файлу базы данных: ");
- PassengerTraffic pt(path);
- int point{};
- Passenger p;
- string n;
- do {
- puts("\n0. Выход из программы");
- puts("1. Получить информацию о всех пассажирах");
- puts("2. Загрузить");
- puts("3. Добавить");
- puts("4. Сохранить");
- puts("5. Сортировать");
- puts("6. Найти пассажира");
- puts("7. Получить информацию о рейсе");
- cout << ">>> ";
- cin >> point;
- puts("");
- switch (point) {
- case 0:
- break;
- case 1:
- pt.show();
- break;
- case 2:
- pt.load();
- break;
- case 3:
- cin >> p;
- pt.add(p);
- break;
- case 4:
- pt.save();
- break;
- case 5:
- pt.sortlist();
- break;
- case 6:
- cout << pt.max_quantity() << '\n';
- break;
- case 7:
- n = input<string>(cin, "Номер рейса: ");
- pt.info(n); break;
- default:
- puts("Ошибка: пункт меню не существует!");
- }
- } while (point);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement