diff --git a/src/main/java/Main.java b/src/main/java/Main.java index db9356a08..30c629666 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,6 +1,72 @@ +import java.util.ArrayList; +import java.util.Scanner; + +import entities.Car; +import entities.Race; public class Main { + public static void main(String[] args) { - System.out.println("Hello world!"); + + Scanner scanner = new Scanner(System.in); + scanner.useDelimiter("\n"); //Чтобы scanner.next() читал не только до пробела, а всю строку (Aston Martin, Alfa Romeo, Ford Mustang) + ArrayList participants = new ArrayList(); + + String anotherNameMessage = ", назовите по-другому:"; + String outOfSpeedRangeMessage = "Введите значение от 1 до 250:"; + + System.out.println("Приветствуем вас на нашей гонке! Сегодня у нас трое участников, и совсем скоро мы узнаем победителя!"); + + //Главный цикл добавления участников + for (int i = 0; i < 3; i++) { + int position = i + 1; + + //Блок ввода имени + System.out.println(String.format("Введите автомобиль либо имя %dго участника:", position)); + String inputName; + //При одинаковой скорости будет несколько победителей. Чтобы их различать, решил сделать имя уникальным. + while (true) { + inputName = scanner.next().trim(); //Пробелы по краям уникальным имя не делают, перепутать таких участников очень просто. + if (inputName.isEmpty()) + System.out.println("Имя не может быть пустым или состоять из пробелов" + anotherNameMessage); + else { + boolean isSame = false; + for (Car current : participants) { + if (current.getName().equals(inputName)) { + isSame = true; + break; + } + } + if (!isSame) break; + else System.out.println("Такой участник уже есть" + anotherNameMessage); + } + } + + //Блок ввода скорости + System.out.println("Введите скорость " + position + "го участника:"); + int inputSpeed; + //Проверка скорости на int и на соответствие диапазону + while (true) { + if (scanner.hasNextInt()) { + inputSpeed = scanner.nextInt(); + if (inputSpeed> 0 && inputSpeed <= 250) break; + else System.out.println(outOfSpeedRangeMessage); + } else { + String text = scanner.next(); + if (text.matches("[0-9]+")) //На случай ввода числа за пределами int: 97314897227297497983024 + System.out.println(outOfSpeedRangeMessage); + else + System.out.println("Ведите целое число без любых других символов:"); //Всё остальное: 250 км/ч, 123.4 и т.п. + } + } + + //Справились с вводом, можно добавлять учатника + participants.add(new Car(inputName, inputSpeed)); + + } + + //Участники готовы, газуем + System.out.println(new Race().getWinner(participants)); + } } \ No newline at end of file diff --git a/src/main/java/entities/Car.java b/src/main/java/entities/Car.java new file mode 100644 index 000000000..b6b780333 --- /dev/null +++ b/src/main/java/entities/Car.java @@ -0,0 +1,15 @@ +package entities; + +public class Car { + String name; + int speed; + + public Car(String name, int speed) { + this.name = name; + this.speed = speed; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/entities/Race.java b/src/main/java/entities/Race.java new file mode 100644 index 000000000..5b41fbf5d --- /dev/null +++ b/src/main/java/entities/Race.java @@ -0,0 +1,47 @@ +package entities; + +import java.util.ArrayList; +import java.util.Iterator; + +public class Race { + + public String getWinner(ArrayList participants) { + int maxDistance = 0; + + //Определить максимальное расстояние + for (Car current : participants) { + if (current.speed * 24> maxDistance) maxDistance = current.speed * 24; + } + + //Удалить из списка всех, кто проехал меньше + Iterator iterator = participants.iterator(); + while (iterator.hasNext()) { + Car current = iterator.next(); + if (current.speed * 24 < maxDistance) iterator.remove(); + } + + //Форматирование вывода + if (participants.size() == 1) { + return "И нашим победителем становится " + participants.get(0).name + " с результатом " + formatDistance(maxDistance) + "!"; + } else { + StringBuilder winners = new StringBuilder(); + for (int i = 0; i < participants.size(); i++) { + winners.append(participants.get(i).name); + //Если победителей несколько, их надо разделить запятыми, а двух последних союзом и + if (i == participants.size() - 2) winners.append(" и "); + else if (i != participants.size() - 1) winners.append(", "); + } + return "Невероятно, но проехав по " + formatDistance(maxDistance) + ", " + winners + " финишировали с одинаковым результатом!"; + } + } + + //Для более красивого вывода расстояния и просто чтобы switch тоже использовать + String formatDistance(int distance) { + String correctWord = switch (distance % 10) { + case 1 -> "километр"; + case 2, 3, 4 -> "километра"; + default -> "километров"; + }; + return distance + " " + correctWord; + } +} \ No newline at end of file

AltStyle によって変換されたページ (->オリジナル) /