Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 67 additions & 1 deletion src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -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<Car> 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));

}
}
15 changes: 15 additions & 0 deletions src/main/java/entities/Car.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
47 changes: 47 additions & 0 deletions src/main/java/entities/Race.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package entities;

import java.util.ArrayList;
import java.util.Iterator;

public class Race {

public String getWinner(ArrayList<Car> participants) {
int maxDistance = 0;

//Определить максимальное расстояние
for (Car current : participants) {
if (current.speed * 24 > maxDistance) maxDistance = current.speed * 24;
}

//Удалить из списка всех, кто проехал меньше
Iterator<Car> 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;
}
}