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
30 changes: 28 additions & 2 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,32 @@
import java.util.ArrayList;

import lemana.model.Auto;
import lemana.model.LemanaUserInput;
import lemana.model.Race;

public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");

LemanaUserInput userInput = new LemanaUserInput();
userInput.startUserInput();

ArrayList<Auto> raceAutos = userInput.getRaceAutos();

// После успешного ввода рассчитываем,
// сколько километров за 24 часа
// смог проехать каждый участник гонки (автомобиль),
// и запоминаем лидера.
Race race = new Race(raceAutos);
for (Auto auto : raceAutos) {
race.getDistanceForRaceAuto(auto);
}

String leaderName = userInput.getLeader().name;

// Выводим название автомобиля-лидера в консоль
// в любом понятном формате.
// Например: Самая быстрая машина: Москвич.
System.out.printf("Участник на автомобиле'%s' выигрывает гонку",
leaderName);
}
}
}
12 changes: 12 additions & 0 deletions src/main/java/lemana/model/Auto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package lemana.model;

// Автомобиль — объект, содержащий в себе параметры «название» и «скорость».
public class Auto {
public String name;
public int velocity;
Comment on lines +5 to +6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поля лучше пометить final, тем самым исключив возможность их модификации извне


public Auto(String name, int velocity) {
this.name = name;
this.velocity = velocity;
}
}
136 changes: 136 additions & 0 deletions src/main/java/lemana/model/LemanaUserInput.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
// Алиса AI подсказала вариант с использованием регулярных выражений
// для проверки валидности ввода пользователя
package lemana.model;

import java.util.ArrayList;
import java.util.Scanner;

public class LemanaUserInput {
// Запрашиваем у пользователя 3 автомобиля,
// каждый из которых имеет два параметра:
// название и скорость.
Scanner scanner = new Scanner(System.in);
private ArrayList<Auto> raceAutos;
int maxVelocity = 0;
Auto leader;

public void startUserInput() {
System.out.println("Добро пожаловать на автогонки!");
System.out.println("Для их проведения требуются трое участников.");
System.out.println("Oбъявите участников: ... ");

String name;
int velocity;
int index = 1;

raceAutos = new ArrayList<>();

// Приложение умеет корректно обрабатывать невалидный ввод данных.
// В случае невалидного ввода (нечисловое значение скорости, дробное значение скорости,
// скорость вне допустимого диапазона от 0 до 250, пустое название автомобиля и скорость)
// приложение выводит сообщение об ошибке и запрашивает повторный ввод данных до тех пор,
// пока не будут введены корректные значения.
while (raceAutos.size() < 3) {

name = getValidInput("Введите название авто учаcтника №%d: ", index);
velocity = getValidInput("Укажите скорость '%s' (от 0 до 250): ", name);

Auto raceAuto = new Auto(name, velocity);

if (raceAutos.add(raceAuto)) {
System.out.printf("Aвтомобиль '%s' успешно внесен " +
"в список участников\n", raceAuto.name);
index++;
if(isLeader(raceAuto)) {
leader = raceAuto;
}
} else {
System.out.println("Что-то пошло не так, участник не в списке");
}

}
scanner.close();
}

public ArrayList<Auto> getRaceAutos() {
return raceAutos;
}

// Проверяем ввод на валидность
public boolean isValid(String userInput){
if (!userInput.matches("-?\\d+(\\.\\d+)?")) {
System.out.println("Невалидный ввод: нечисловое значение скорости.");
return false;
} else if (!userInput.matches("-?\\d+")) {
System.out.println("Невалидный ввод: дробное значение скорости.");
return false;
} else {
return true;
}
}

public boolean isValid(int userInput){
if (userInput > 0 && userInput < 251) {
return true;
} else {
System.out.println("Невалидный ввод: скорость превышает допустимый диапазон.");
return false;
}
}

public boolean isEmptyValue(String userInput) {
if (userInput.trim().isEmpty()) {
System.out.println("Невалидный ввод: пустое значение.");
return true;
} else {
return false;
}
}

public String getValidInput(String message, int index) {
String input = "";
boolean isValid = false;
while (!isValid) {
System.out.printf(message, index);
input = scanner.next();
isValid = !isEmptyValue(input);
}
return input;
}

public int getValidInput(String message, String str) {
String input;
int processedInput = -1;
boolean isValid = false;
while (!isValid) {
System.out.printf(message, str);
input = scanner.next();
if (!isEmptyValue(input) && isValid(input)) {
processedInput = Integer.parseInt(input);
}
isValid = isValid(processedInput);
}
return processedInput;
}

public boolean isLeader(Auto raceAuto) {
if(raceAuto.velocity > getMaxVelocity()) {
setMaxVelocity(raceAuto.velocity);
return true;
}
return false;
}

public int getMaxVelocity(){
return this.maxVelocity;
}

public void setMaxVelocity(int value){
maxVelocity = value;
}

public Auto getLeader() {
return this.leader;
}

}
22 changes: 22 additions & 0 deletions src/main/java/lemana/model/Race.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package lemana.model;

import java.util.ArrayList;

// Гонка – класс, в котором рассчитывается и запоминается лидер.
public class Race {

final ArrayList<Auto> raceAutos;
// длительность гонки 24 часа
final int raceTime = 24;

public Race(ArrayList<Auto> raceAutos) {
this.raceAutos = raceAutos;
}

// путь пройденный участником(авто) за 24 часа;
public void getDistanceForRaceAuto(Auto raceAuto) {
int distance = raceAuto.velocity * raceTime;
System.out.printf("\nАвто '%s' за %d часа проехал %d км.",
raceAuto.name, raceTime, distance);
}
}