Repository navigation
Expand file tree
/
Copy pathMain.java
More file actions
123 lines (100 loc) · 8.96 KB
/
Copy pathMain.java
File metadata and controls
123 lines (100 loc) · 8.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Импортируем нужные инструменты из стандартной библиотеки Java.
// Scanner - для чтения ввода пользователя.
// InputMismatchException - для отлова ошибки, если пользователь введет текст вместо числа.
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
// Это главный метод, точка входа в программу. Он выполняется при запуске.
public static void main(String[] args) {
// --- Подготовительный этап ---
// Создаем объект 'сканер', который будет слушать консоль и читать то, что вводит пользователь.
// System.in - это стандартный поток ввода, то есть, как раз, консоль.
Scanner userInputScanner = new Scanner(System.in);
// Создаем объект нашей гонки. Он будет хранить информацию о лидере.
Race leMans24 = new Race();
// По условию задачи у нас 3 машины. Чтобы не писать "магическое число" 3 несколько раз,
// создадим константу. Если вдруг захотим гонку на 5 машин, поменяем только это значение.
final int numberOfCars = 3;
// Приветствуем пользователя, чтобы было понятно, что программа запустилась.
System.out.println("Добро пожаловать на гонку '24 часа Ле-Мана'!");
System.out.println("--------------------------------------------");
// --- Основной цикл для сбора данных ---
// Нам нужно спросить про 3 машины. Для повторяющихся действий идеально подходит цикл for.
// Цикл будет работать, пока счетчик 'i' не станет больше количества машин.
for (int i = 1; i <= numberOfCars; i++) {
System.out.println(); // Добавляем пустую строку для красоты.
// --- Блок ввода названия машины с проверкой ---
String carName;
while (true) { // Используем "бесконечный" цикл, чтобы запрашивать ввод, пока он не будет корректным.
System.out.println("— Введите название машины №" + i + ":");
carName = userInputScanner.nextLine(); // Читаем всю введенную строку.
// Проверка: название не должно быть пустым.
// .trim() убирает случайные пробелы в начале и конце строки.
// .isEmpty() проверяет, не осталась ли строка пустой после этого.
if (carName != null && !carName.trim().isEmpty()) {
break; // Если название корректное, выходим из бесконечного цикла.
} else {
System.out.println("Название машины не может быть пустым. Пожалуйста, попробуйте снова.");
}
}
// --- Блок ввода скорости машины с проверкой ---
int carSpeed;
while (true) { // Еще один "бесконечный" цикл, теперь для скорости.
System.out.println("— Введите скорость для '" + carName + "' (км/ч):");
/*
* Я столкнулся с проблемой: если для скорости ввести не число, а текст,
* программа "падала" с ошибкой. Я начал искать в интернете, как можно проверить,
* что пользователь ввел именно число, и нашел решение с конструкцией "try-catch".
* Мы "пробуем" (try) выполнить код,
* и если происходит ошибка, мы ее "ловим" (catch) и обрабатываем, не давая программе завершиться.
*
* Затем я обнаружил вторую проблему: после ввода текста программа входила в бесконечный цикл
* и постоянно выводила сообщение об ошибке. Я нашёл, что это особенность
* работы Scanner: он не распознает неверный ввод. Чтобы это исправить, нужно принудительно
* считать оставшуюся строку с помощью scanner.nextLine().
*
* Блок "finally" гарантирует, что рограмма отработает в любом случае: и при
* успешном вводе, и при ошибке. Мне показалось, так будет лучше!
*/
try {
// "Пытаемся" прочитать целое число. Это может вызвать ошибку, если введут текст.
carSpeed = userInputScanner.nextInt();
// Если число успешно прочитано, проверяем, входит ли оно в наш диапазон (от 1 до 250).
if (carSpeed > 0 && carSpeed <= 250) {
break; // Если все проверки пройдены, выходим из цикла.
} else {
// Если число не в диапазоне, сообщаем об этом.
System.out.println("— Неправильная скорость. Скорость должна быть больше 0 и не более 250 км/ч.");
}
} catch (InputMismatchException e) {
// "Ловим" ошибку, если пользователь ввел не число (например, "abc").
System.out.println("— Ошибка ввода. Пожалуйста, введите целое число, а не текст.");
} finally {
// Этот блок выполняется ВСЕГДА: и после успешного ввода, и после ошибки.
// nextLine() здесь нужен, чтобы "очистить" сканер. После nextInt() в буфере остается
// символ переноса строки, и без этой команды следующий ввод названия машины сломается.
userInputScanner.nextLine();
}
}
// --- Создание объекта и передача его в гонку ---
// Теперь, когда у нас есть проверенные название и скорость, создаем объект машины.
Car currentCar = new Car(carName, carSpeed);
// Отправляем созданную машину в наш объект гонки, чтобы он определил, не новый ли это лидер.
leMans24.processNewContender(currentCar);
}
// --- Вывод результатов ---
// Цикл закончился, все данные собраны. Объявляем победителя.
System.out.println("\n============================================");
System.out.println("Гонка завершена! Подводим итоги...");
// Получаем имя победителя из объекта гонки.
String winner = leMans24.getWinnerName();
// Проверяем, есть ли у нас вообще победитель (вдруг, все ввели скорость 0).
if (!winner.isEmpty()) {
System.out.println("Самая быстрая машина: " + winner);
} else {
System.out.println("Победителя определить не удалось.");
}
// В конце программы закрываем сканер.
userInputScanner.close();
}
}