From 8a537f418da8b54783904dc5470cb7f074d45808 Mon Sep 17 00:00:00 2001 From: Dmitriy Shirokov Date: 2024年8月21日 19:47:28 +0300 Subject: [PATCH 1/2] Start-finish --- src/main/java/Main.java | 62 +++++++++++++++++++++++++++++++- src/main/java/entities/Car.java | 15 ++++++++ src/main/java/entities/Race.java | 37 +++++++++++++++++++ 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/main/java/entities/Car.java create mode 100644 src/main/java/entities/Race.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java index db9356a08..6fb311ba7 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,6 +1,66 @@ +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(); + + System.out.println("Приветствуем вас на нашей гонке! Сегодня у нас трое участников, и совсем скоро мы узнаем победителя!"); + + for (int i = 0; i < 3; i++) { + int position = i + 1; + + System.out.println("Введите автомобиль либо имя " + position + "го участника:"); + + String inputName; + //При одинаковой скорости будет несколько победителей. Чтобы их различать, решил сделать имя уникальным. + while (true) { + inputName = scanner.next().trim(); //Пробелы по краям уникальным имя не делают, перепутать таких участников очень просто. + if (inputName.isEmpty()) + System.out.println("Имя не может быть пустым или состоять из пробелов.\nВведите автомобиль либо имя " + position + "го участника:"); + else { + boolean isSame = false; + for (Car current : participants) { + if (current.getName().equals(inputName)) { + isSame = true; + break; + } + } + if (!isSame) break; + else { + System.out.println("Такой участник уже есть, назовите по-другому:"); + } + } + } + + 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("Ведите число от 1 до 250:"); + } else { + System.out.println("Ведите целое число от 1 до 250 без любых других символов:"); + scanner.next(); + } + } + + 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..fb2a9823f --- /dev/null +++ b/src/main/java/entities/Race.java @@ -0,0 +1,37 @@ +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 + "!"; + } else { + StringBuilder result = new StringBuilder(); + for (int i = 0; i < participants.size(); i++) { + result.append(participants.get(i).name); + //Если победителей несколько, их надо разделить запятыми, а двух последних союзом и + if (i == participants.size() - 2) result.append(" и "); + else if (i != participants.size() - 1) result.append(", "); + } + return "Невероятно, но " + result + " финишировали с одинаковым результатом!"; + } + } +} \ No newline at end of file From 21feaf89cd58a774825e3930b50fd55aa1431bef Mon Sep 17 00:00:00 2001 From: Dmitriy Shirokov Date: 2024年8月22日 19:10:24 +0300 Subject: [PATCH 2/2] Fixes: one more input check and patterns for better outputs. --- src/main/java/Main.java | 26 ++++++++++++++++---------- src/main/java/entities/Race.java | 22 ++++++++++++++++------ 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 6fb311ba7..30c629666 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -12,19 +12,23 @@ public static void main(String[] args) { 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("Введите автомобиль либо имя " + position + "го участника:"); - + //Блок ввода имени + System.out.println(String.format("Введите автомобиль либо имя %dго участника:", position)); String inputName; //При одинаковой скорости будет несколько победителей. Чтобы их различать, решил сделать имя уникальным. while (true) { inputName = scanner.next().trim(); //Пробелы по краям уникальным имя не делают, перепутать таких участников очень просто. if (inputName.isEmpty()) - System.out.println("Имя не может быть пустым или состоять из пробелов.\nВведите автомобиль либо имя " + position + "го участника:"); + System.out.println("Имя не может быть пустым или состоять из пробелов" + anotherNameMessage); else { boolean isSame = false; for (Car current : participants) { @@ -34,27 +38,29 @@ public static void main(String[] args) { } } if (!isSame) break; - else { - System.out.println("Такой участник уже есть, назовите по-другому:"); - } + 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("Ведите число от 1 до 250:"); + else System.out.println(outOfSpeedRangeMessage); } else { - System.out.println("Ведите целое число от 1 до 250 без любых других символов:"); - scanner.next(); + 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)); } diff --git a/src/main/java/entities/Race.java b/src/main/java/entities/Race.java index fb2a9823f..5b41fbf5d 100644 --- a/src/main/java/entities/Race.java +++ b/src/main/java/entities/Race.java @@ -22,16 +22,26 @@ public String getWinner(ArrayList participants) { //Форматирование вывода if (participants.size() == 1) { - return "И нашим победителем становится " + participants.get(0).name + "!"; + return "И нашим победителем становится " + participants.get(0).name + " с результатом " + formatDistance(maxDistance) + "!"; } else { - StringBuilder result = new StringBuilder(); + StringBuilder winners = new StringBuilder(); for (int i = 0; i < participants.size(); i++) { - result.append(participants.get(i).name); + winners.append(participants.get(i).name); //Если победителей несколько, их надо разделить запятыми, а двух последних союзом и - if (i == participants.size() - 2) result.append(" и "); - else if (i != participants.size() - 1) result.append(", "); + if (i == participants.size() - 2) winners.append(" и "); + else if (i != participants.size() - 1) winners.append(", "); } - return "Невероятно, но " + result + " финишировали с одинаковым результатом!"; + 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 によって変換されたページ (->オリジナル) /