Загрузка данных
#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;
}