Skip to content

111#1

Open
KailarStern wants to merge 4 commits intomainfrom
dev
Open

111#1
KailarStern wants to merge 4 commits intomainfrom
dev

Conversation

@KailarStern
Copy link
Copy Markdown
Owner

111

Comment on lines +11 to +16
guests = scanner.nextInt();
if (guests <= 1) {
System.out.println("Некорректное значение. Количество гостей должно быть больше 1.");
} else {
guestsNum = true;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠ Здесь и в остальных участках, где принимается ввод числового значения, лучше добавить обработку ввода некорректных значений, т.е. если пользователь введет на вопрос про количество человек и стоимость товара вместо чисел строки, то приложение упадет.

String itemName = scanner.next();

System.out.print("Введите стоимость товара (в формате рубли.копейки): ");
double itemCost = scanner.nextDouble();
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠ Также нужно учесть, что стоимость товара не может быть отрицательной

Comment on lines +45 to +54
int rubles = (int) costPerPerson;
String rubleSuffix;
if (rubles == 1) {
rubleSuffix = "рубль";
} else if (rubles >= 2 && rubles <= 4) {
rubleSuffix = "рубля";
} else {
rubleSuffix = "рублей";
}
System.out.println("Каждый гость должен заплатить " + formattedCost + " " + rubleSuffix + ".");
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🍏 Рекомендую вынести в отдельную функцию.

⚠ Если стоимость для каждого гостя будет равна 24, то на консоль будет выведено - 24,00 рублей
Снимок экрана 2023-03-11 214625

Для правильной обработки окончания нужно взять остаток от деления costPerPerson на 10 (costPerPerson % 10) и проверить полученное значение. Т.е. если значение будет равно 24, то остаток от деления на 10 будет - 4. Тогда будет выведено корректное окончание.
Плюс учесть, что для чисел 11-19 - "рублей" - для этого стоит проверять, что costPerPerson % 100 между 11 и 19 включительно находится

Comment on lines +81 to +82
String costString = item.substring(item.lastIndexOf(" ") + 1, item.lastIndexOf(" руб."));
totalValue += Double.parseDouble(costString);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Весьма интересное решение.
В любом случае, приложение может падать из-за неверно определенного индекса item.lastIndexOf(" ") + 1. Начиная с конца, этот метод вернет индекс пробела, который стоит перед "руб.", вдобавок к этому индексу прибавляем +1. Далее определяем индекс item.lastIndexOf(" руб."), с которого начинается " руб."

Получается такая картина
Снимок экрана 2023-04-09 211153

Ошибка возникает из-за того, что мы пытаемся из строки выдернуть отрезок с 13 по 12 индекс. Можно внести исправления таким образом и будет работать:

String costString = item.substring(item.indexOf(" ") + 2, item.lastIndexOf(" руб."));
totalValue += Double.parseDouble(costString.replace(",", "."));

Но все также получится не очень хороший способ. По сути костыль)

По хорошему, ты мог в классе Calculator создать статичные переменные. Например вот такие

class Calculator {
    public static String itemList;
    public static int guests;
    public static int totalValue;

Куда сложил бы все необходимое для вычислений и парсить строки, чтобы вычленить оттуда число не пришлось бы. Но все же плюс, за такую идею)

На доработку не буду отправлять, т.к. остальное работает как часы. Просто внеси исправления, которые я тебе предложил

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants