Отсортировать значения по возрастанию в массиве объектов класса
Задание: Создайте класс с именем train, содержащую поля: название пункта назначения, номер поезда, время отправления.Ввести данные в массив из пяти элементов типа train, упорядочить элементы по номерам поездов. Добавить возможность вывода информации о поезде, номер которого введен пользователем. Добавить возможность сортировки массив по пункту назначения, причем поезда с одинаковыми пунктами назначения должны быть упорядочены по времени отправления.
Суть проблемы: не получается отсортировать по времени поезда с одинаковыми пунктами назначения.
КОД:
#include <iostream>
using namespace std;
class train {
public:
char destination[100];
int TrainNumber;
int hours;
int minutes;
bool CheckingHours() {
if (hours < 0 || hours > 23) {
cout << "Некорректный ввод!";
return false;
}
}
bool CheckingMinutes() {
if (minutes < 0 || minutes > 59) {
cout << "Некорректный ввод!";
return false;
}
}
void PrintTime() {
if (hours <= 9) {
if (minutes <= 9)
cout << 0 << hours << ":" << 0 << minutes;
else
cout << 0 << hours << ":" << minutes;
}
else if (minutes <= 9)
cout << hours << ":" << 0 << minutes;
else
cout << hours << ":" << minutes;
}
};
int main() {
setlocale(0, "");
train trains[5];
for (int i = 0; i < 5; i++) {
cout << "Введите номер " << i + 1 << "-го поезда: ";
cin >> trains[i].TrainNumber;
cout << "Введите пункт назначения " << i + 1 << "-го поезда: ";
cin >> trains[i].destination;
cout << "Введите время отправления " << i + 1 << "-го поезда: ";
cout << "\nЧасы: ";
cin >> trains[i].hours;
if (trains[i].CheckingkHours() == 0) return 0;
cout << "Минуты: ";
cin >> trains[i].minutes;
if (trains[i].CheckingMinutes() == 0) return 0;
cout << endl;
}
int info;
cout << "\nВведите номер поезда: ";
cin >> info;
for (int i = 0; i < 5; i++) {
if (trains[i].TrainNumber == info) {
cout << "\n\nПоезд №" << trains[i].TrainNumber;
cout << "\nПункт назначения: " << trains[i].destination;
cout << "\nВремя отправления поезда: ";
trains[i].PrintTime();
}
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (trains[i].destination[0] < trains[j].destination[0]) {
swap(trains[i], trains[j]);
}
}
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (trains[i].destination == trains[j].destination && i != j) {
if (trains[i].hours > trains[j].hours) {
swap(trains[i], trains[j]);
}
else if (trains[i].hours == trains[j].hours) {
if (trains[j].minutes > trains[j + 1].minutes && j < 5) {
swap(trains[j], trains[j + 1]);
}
}
}
}
}
cout << "\n\nОтсортированы по пункту назначения: ";
for (int i = 0; i < 5; i++) {
cout << "\nПоезд №" << trains[i].TrainNumber;
cout << "\nПункт назначения: " << trains[i].destination;
cout << "\nВремя отправления поезда: ";
trains[i].PrintTime();
cout << endl;
}
return 0;
}
Ответы (1 шт):
Вот пример кода с комментариями:
//Алгоритм сортировки пузырьком
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4 - i; j++) {
//Сравниваем 2 строки
//strcmp - возвращает 1 если левая строка > правой строки
//возвращает 0 если левая строка == правой строки
//возвращает -1 если левая < правой строки
int res = strcmp(trains[j].destination, trains[j + 1].destination);
//Если левая строка > правой то свапаем
if (res == 1)
swap(trains[j], trains[j + 1]);
//если пункты назначения равны
else if (res == 0) {
//Проверяем уже по времени
//Если час отправления левого поезда > правого, то свапаем
if (trains[j].hours > trains[j + 1].hours)
swap(trains[j], trains[j + 1]);
else if(trains[j].hours == trains[j + 1].hours) {
//Аналогично часам
if (trains[j].minutes > trains[j + 1].minutes)
swap(trains[j], trains[j + 1]);
}
}
}
}
Поподробней про алгоритм сортировки пузырьком можете почитать тут
Пусть входная строка будет:
1 Moscow 10 15 2 Paris 11 10 3 Moscow 9 30 4 Madrid 10 30 5 Berlin 12 10
