Загрузка данных


#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

#ifdef _WIN32
#include <windows.h>
#endif

using namespace std;

// Определение структурированного типа данных
struct Train {
    string trainNumber;
    string destination;
    string operatingDays; // Дни следования или дата
    string arrivalTime;   // Формат ЧЧ:ММ
    string departureTime; // Формат ЧЧ:ММ
};

// Функция для ввода элементов структуры с клавиатуры
void inputTrain(vector<Train>& trains) {
    Train t;
    cout << "Введите номер поезда: ";
    cin >> t.trainNumber;
    
    cout << "Введите пункт назначения: ";
    cin.ignore();
    getline(cin, t.destination);
    
    cout << "Введите дни следования (или дату): ";
    getline(cin, t.operatingDays);
    
    cout << "Введите время прибытия (ЧЧ:ММ): ";
    cin >> t.arrivalTime;
    
    cout << "Введите время отправления (ЧЧ:ММ): ";
    cin >> t.departureTime;
    
    trains.push_back(t);
    cout << "Поезд успешно добавлен!\n";
}

// Функция для вывода элементов структуры
void printTrains(const vector<Train>& trains) {
    if (trains.empty()) {
        cout << "Список поездов пуст.\n";
        return;
    }
    cout << "-------------------------------------------------------------\n";
    for (const auto& t : trains) {
        cout << "Поезд №" << t.trainNumber 
             << " | Назначение: " << t.destination 
             << " | Дни/Дата: " << t.operatingDays 
             << " | Прибытие: " << t.arrivalTime 
             << " | Отправление: " << t.departureTime << endl;
    }
    cout << "-------------------------------------------------------------\n";
}

// Поиск по пункту назначения
void searchByDestination(const vector<Train>& trains) {
    if (trains.empty()) {
        cout << "Список поездов пуст.\n";
        return;
    }
    string dest;
    cout << "Введите пункт назначения для поиска: ";
    cin.ignore();
    getline(cin, dest);
    
    bool found = false;
    cout << "--- Результаты поиска ---\n";
    for (const auto& t : trains) {
        if (t.destination == dest) {
            cout << "Поезд №" << t.trainNumber 
                 << " | Дни: " << t.operatingDays 
                 << " | Отправление: " << t.departureTime << endl;
            found = true;
        }
    }
    if (!found) {
        cout << "Поездов в данном направлении не найдено.\n";
    }
}

// Поиск по дате (дням следования)
void searchByDate(const vector<Train>& trains) {
    if (trains.empty()) {
        cout << "Список поездов пуст.\n";
        return;
    }
    string date;
    cout << "Введите дату/дни следования для поиска: ";
    cin.ignore();
    getline(cin, date);
    
    bool found = false;
    cout << "--- Результаты поиска ---\n";
    for (const auto& t : trains) {
        if (t.operatingDays == date) {
            cout << "Поезд №" << t.trainNumber 
                 << " | Назначение: " << t.destination 
                 << " | Отправление: " << t.departureTime << endl;
            found = true;
        }
    }
    if (!found) {
        cout << "Поездов на эту дату не найдено.\n";
    }
}

// Вспомогательная функция для сортировки по времени отправления
bool compareByTime(const Train& a, const Train& b) {
    return a.departureTime < b.departureTime;
}

// Вывод расписания по времени
void printScheduleByTime(vector<Train> trains) {
    if (trains.empty()) {
        cout << "Список поездов пуст.\n";
        return;
    }
    // Сортировка копии вектора, чтобы не менять исходный порядок (если он нужен)
    sort(trains.begin(), trains.end(), compareByTime);
    
    cout << "\n--- Расписание по времени отправления ---\n";
    printTrains(trains);
}

int main() {
    // Настройка кодировки для корректного отображения кириллицы в консоли Windows
#ifdef _WIN32
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
#endif

    vector<Train> trains;
    int choice;

    // Меню для работы с массивом структур
    do {
        cout << "\n=== МЕНЮ ВОКЗАЛА ===\n";
        cout << "1. Добавить поезд\n";
        cout << "2. Вывести все поезда\n";
        cout << "3. Поиск по пункту назначения\n";
        cout << "4. Поиск по дате (дням следования)\n";
        cout << "5. Вывод расписания по времени отправления\n";
        cout << "0. Выход\n";
        cout << "Ваш выбор: ";
        
        while (!(cin >> choice)) {
            cout << "Ошибка ввода. Введите число: ";
            cin.clear();
            cin.ignore(10000, '\n');
        }

        switch (choice) {
            case 1: 
                inputTrain(trains); 
                break;
            case 2: 
                printTrains(trains); 
                break;
            case 3: 
                searchByDestination(trains); 
                break;
            case 4: 
                searchByDate(trains); 
                break;
            case 5: 
                printScheduleByTime(trains); 
                break;
            case 0: 
                cout << "Выход из программы.\n"; 
                break;
            default: 
                cout << "Неверный выбор. Попробуйте снова.\n";
        }
    } while (choice != 0);

    return 0;
}