See More

// Импортируем нужные инструменты из стандартной библиотеки 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(); } }