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


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

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

using namespace std;

struct Train {
    string trainNumber;
    string destination;
    string operatingDays; // Строго дата ДД.ММ.ГГГГ
    string arrivalTime;   // Строго время ЧЧ:ММ
    string departureTime; // Строго время ЧЧ:ММ
};

// Валидация времени (формат ЧЧ:ММ)
bool isValidTime(const string& timeStr) {
    if (timeStr.length() != 5 || timeStr[2] != ':') return false;
    for (int i = 0; i < 5; i++) {
        if (i == 2) continue;
        if (!isdigit(timeStr[i])) return false;
    }
    int h = stoi(timeStr.substr(0, 2));
    int m = stoi(timeStr.substr(3, 2));
    return (h >= 0 && h <= 23 && m >= 0 && m <= 59);
}

// Валидация даты (формат ДД.ММ.ГГГГ)
bool isValidDate(const string& dateStr) {
    if (dateStr.length() != 10 || dateStr[2] != '.' || dateStr[5] != '.') return false;
    for (int i = 0; i < 10; i++) {
        if (i == 2 || i == 5) continue;
        if (!isdigit(dateStr[i])) return false;
    }
    int d = stoi(dateStr.substr(0, 2));
    int m = stoi(dateStr.substr(3, 2));
    int y = stoi(dateStr.substr(6, 4));
    return (d >= 1 && d <= 31 && m >= 1 && m <= 12 && y >= 1900 && y <= 2100);
}

void inputTrain(vector<Train>& trains) {
    Train t;
    cout << "Введите номер поезда: ";
    cin >> t.trainNumber;
    
    cout << "Введите пункт назначения: ";
    cin.ignore();
    getline(cin, t.destination);
    
    // Цикл валидации даты
    while (true) {
        cout << "Введите дату (ДД.ММ.ГГГГ): ";
        getline(cin, t.operatingDays);
        if (isValidDate(t.operatingDays)) break;
        cout << "Ошибка! Неверный формат даты или несуществующая дата. Попробуйте снова.\n";
    }
    
    // Цикл валидации времени прибытия
    while (true) {
        cout << "Введите время прибытия (ЧЧ:ММ): ";
        cin >> t.arrivalTime;
        if (isValidTime(t.arrivalTime)) break;
        cout << "Ошибка! Неверный формат времени. Попробуйте снова.\n";
    }
    
    // Цикл валидации времени отправления
    while (true) {
        cout << "Введите время отправления (ЧЧ:ММ): ";
        cin >> t.departureTime;
        if (isValidTime(t.departureTime)) break;
        cout << "Ошибка! Неверный формат времени. Попробуйте снова.\n";
    }
    
    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() {
#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;
}