Skip to content

Conversation

@Plantik1337
Copy link
Owner

No description provided.

System.out.println("Приветствую!\nВведите на скольких человек необходимо разделить счёт:\n");
int atm = 0;
while(atm <= 1) {
atm = scanner.nextInt();// amt - сокращение от amount (количество). Узнаём у пользователя количество людей.

Choose a reason for hiding this comment

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

⚠ Пользователь может ввести на вопрос про количество человек вместо чисел строки, и приложение упадет. Лучше такого не допускать, а обрабатывать. Можно использовать методы scanner.hasNextInt()/hasNextFloat() в if else блоке или try-catch

System.out.println("Введите название товара:\n");
name = scanner.next() + " ";
System.out.println("Введите цену товара:\n");
price = scanner.nextDouble();

Choose a reason for hiding this comment

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

⚠ Пользователь может ввести на вопрос про стоимость товара вместо чисел строки, и приложение упадет. Лучше такого не допускать, а обрабатывать. Можно использовать методы scanner.hasNextInt()/hasNextFloat() в if else блоке или try-catch

Comment on lines 34 to 46
int lineEnding = (int)result;
lineEnding = lineEnding%10;
switch (lineEnding){
case 1:
System.out.println("Счёт разделяется по " + result + " рубль на человека.");
break;
case 2:
case 3:
case 4:
System.out.println("Счёт разделяется по " + result +" рубля на человека.");
break;
default:
System.out.println("Счёт разделяется по " + result +" рублей на человека.");

Choose a reason for hiding this comment

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

⚠ Здесь неправильно рассчитывается окончание слова "рубль", т.е. если будет результат 114, то будет выведено 114,00 рубля. Выводить слово рубль с правильным окончанием в зависимости от суммы - для правильной обработки окончания нужно учесть округленное в меньшую сторону значение без дробной части, и на что оно оканчивается: 1 - "рубль", 2-4 - "рубля", 5-9 (и 0) - "рублей". Плюс учесть, что для чисел 11-19 - "рублей" - для этого стоит проверять, что <число> % 100 между 11 и 19 включительно находится

🍏 Ниже есть участки, где данный код дублируется. Лучше избегать такого, иначе код разрастется и будет сложно в нем ориентироваться. Например, функциональность расчета окончания вывести в какую-то одну функцию и использовать её там, где нужно. Пусть функция возвращает только рассчитанное значение в виде, например, 114,00 рублей, без использования System.out.println() внутри функции. Возвращенный результат уже применяешь в System.out.println()

Comment on lines 55 to 56
public static class Сalc{// Класс калькулятор
double price = 0;

Choose a reason for hiding this comment

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

Я тебе рекомендую вынести этот класс за пределы класса Main, т.е. должно быть так:
public class Main {
////
}

public class Calc {
////
}

Comment on lines +84 to +93
if ((lign % 10 == 1) && !(lign % 100 > 10 && lign % 100 < 20)) {// 1 кроме от 10 до 20 Рубль
return " Рубль";
} else if ((lign % 10 >= 2 && lign % 10 < 5) && !(lign % 100 > 10 && lign % 100 < 20)) {// 2 - 4 кроме от 10 до 20 Рубля
return " Рубля";
} else if ((lign % 10 >= 5 && lign % 10 < 10) && !(lign % 100 > 10 && lign % 100 < 20)) {// 5 - 9 кроме от 10 до 20 Рублей
return " Рублей";
} else if (lign % 100 >= 10 && lign % 100 <= 20) {// 10 - 19 исключение
return " Рублей";
}
return " Рубль";

Choose a reason for hiding this comment

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

Молодец! Расчет теперь выполняется правильно и нет дублирования этой функциональности в коде 👍

🍏 Изначальный вариант с switch case был хорошим вариантом и его можно было использовать здесь для вычисления (lign % 10). Для чисел в диапазоне 11..19, например, можно добавить в самом начале функции проверку остатка от (lign % 100) на соответствие этому диапазону - если проверка проходит, то сразу возвращать " Рублей", завершив проверку; если проверка не прошла, то далее будет проверятся остаток от 10 в switch.

🍏 Рекомендую входной аргумент double lign округлить до целочисленного (без дробной части) прежде, чем использовать в проверках, для корректности вычисления. Например, так int num = (int) Math.floor(lign);

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.

3 participants