-
Notifications
You must be signed in to change notification settings - Fork 1
Задание калькулятор #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
src/main/java/Main.java
Outdated
| System.out.println("Приветствую!\nВведите на скольких человек необходимо разделить счёт:\n"); | ||
| int atm = 0; | ||
| while(atm <= 1) { | ||
| atm = scanner.nextInt();// amt - сокращение от amount (количество). Узнаём у пользователя количество людей. |
There was a problem hiding this comment.
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
src/main/java/Main.java
Outdated
| System.out.println("Введите название товара:\n"); | ||
| name = scanner.next() + " "; | ||
| System.out.println("Введите цену товара:\n"); | ||
| price = scanner.nextDouble(); |
There was a problem hiding this comment.
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
src/main/java/Main.java
Outdated
| 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 +" рублей на человека."); |
There was a problem hiding this comment.
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()
src/main/java/Main.java
Outdated
| public static class Сalc{// Класс калькулятор | ||
| double price = 0; |
There was a problem hiding this comment.
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 {
////
}
| 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 " Рубль"; |
There was a problem hiding this comment.
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);
No description provided.