Skip to content

Задание калькулятор - #1

Open
Plantik1337 wants to merge 3 commits into
mainfrom
dev
Open

Plantik1337 wants to merge 3 commits into
mainfrom
dev

Conversation

@Plantik1337

Copy link
Copy Markdown
Owner

No description provided.

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

Copy link
Copy Markdown

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 thread src/main/java/Main.java Outdated
System.out.println("Введите название товара:\n");
name = scanner.next() + " ";
System.out.println("Введите цену товара:\n");
price = 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.

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

Comment thread src/main/java/Main.java Outdated
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 +" рублей на человека.");

Copy link
Copy Markdown

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 thread src/main/java/Main.java Outdated
Comment on lines +55 to +56
public static class Сalc{// Класс калькулятор
double price = 0;

Copy link
Copy Markdown

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 thread src/main/java/Main.java
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 " Рубль";

Copy link
Copy Markdown

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.

2 participants