Skip to content

На проверку - #1

Open
Eka666Sed wants to merge 8 commits into
mainfrom
dev
Open

Eka666Sed wants to merge 8 commits into
mainfrom
dev

Conversation

@Eka666Sed

Copy link
Copy Markdown
Owner

No description provided.

Eka666Sed added 5 commits April 22, 2023 14:39
Comment thread src/main/java/CalculatorBill.java Outdated
@@ -0,0 +1,20 @@
class CalculatorBill {
public void calc(double totalPrice, int i) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Параметр i можно было бы назвать немного более точнее. Как я понимаю, это количество людей, верно?

Comment thread src/main/java/CalculatorBill.java Outdated
case 2: rub="рубля"; break;
case 3: rub="рубля";break;
case 4: rub="рубля";break;
case 11: rub="рублей";break;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Чуть выше ты вычисляешь последнюю цифру с помощью остатка от деления на 10. Максимально возможный вариант при этом - это цифра 9. То есть 10 и больше у тебя lastDigit никогда не будет, соответственно этот кейс и ниже никогда не произойдут. Может стоит взять не одну последнюю цифру?)

И если ты используешь версию java 12, то можно было бы совместить общие кейсы

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

image

Comment thread src/main/java/Main.java Outdated
calculatorBill.calc(ProductAndPrice.totalPrice, i);
break;
}
if (i <= 1) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Этот if можно опустить (об этом подсказывает ide), потому что при i > 1 будет выход из цикла, соответственно если программа спустилась ниже, то 100 процентов i <=1. Получается, что можно просто написать System.out.println("Некорректное значение для подсчета.");

Comment thread src/main/java/Main.java Outdated

try
{
int i = Integer.parseInt(input);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

И также хорошая практика давать имена такие, чтобы было понятно, для чего эта переменная/метод/класс и тд. Конкретно i принято использовать в при итерациях (проходах) в цикле (чаще всего по массивам и спискам)

Comment thread src/main/java/ProductAndPrice.java Outdated
price = scanner.nextDouble();
}

bill = bill.concat(productName).concat("\n");

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 thread src/main/java/ProductAndPrice.java Outdated
}
System.out.println("Добавленные товары:" + "\n" + bill);
}
//public double getCurretnPrice() {

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 thread src/main/java/ProductAndPrice.java Outdated
if (answer.equalsIgnoreCase(stop)) {
break;
} else
continue;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

continue тут избыточно, потому что цикл и так пойдет на новый круг, потому что там while(true)

Comment thread src/main/java/ProductAndPrice.java Outdated
System.out.println("Введите название товара:");
String productName = scanner.next();
System.out.println("Введите стоимость товара (стоимость должна быть в формате XX.XX (рубли.копейки)):");
double 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.

Если на этом этапе ввести не число (а букву, например), то выбросится исключение. Так как здесь у тебя нет блока try catch, то оно пробросится наверх. В методе main у тебя есть блок, там он перехватит это исключение, но при этом, так как мы попали в цикл в main, программа там и продолжит работу, из-за чего снова спросит нас, на сколько человек разделить счет
image

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

А еще не очень красиво получается с null)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

И тут же будет забавная ситуация. В английском и русском языке разделителем у чисел с плавающей запятой являются разные символы. В английском языке это точка, а в русском запятая. То есть если у человека система на русском языке, то при вводе числа в формате xx.xx будет исключение, а при вводе xx,xx все пройдет хорошо. И наоборот соответственно) У вас в задание написано через точку, можно подумать, как получить число, не используя метод nextDouble, чтобы не было таких ситуация. (Например, если делить ввод по точке, а потом преобразовывать)

double flooredpPp = Math.floor(payPerPerson);
String rub;
int lastDigit = (int) flooredpPp % 100;
if (11 <= lastDigit & lastDigit <= 19) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

image
После выполнения этого ифа программа пойдет дальше и поэтому будет два раза выведена строка) Для того, чтобы программа вышла из метода, нужно написать return. В твоем случае это внутри ифа)

} else
continue;

double getProductPrice(Scanner scanner) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

image

Где-то здесь есть интересный баг. Если сначала ввести некорректное число (например, отрицательное), а дальше ввести не число (слово), то приложение ловит ошибку InputMismatchException

image

Если провалить в метод nextDouble (нажать ctrl + click или cmd+click), то можно увидеть, что такое исключение выбрасывается, когда не может привестись к типу double. У тебя ошибка возникает из-за вложенного while, потому что если ввести некорректное число, мы в него попадем, а дальше уже можно вводить любые символы и из-за этого выбросится ошибка. Вариант исправления: Следует while (price <= 0) заменить на if (price <= 0), внутри которого написать ошибку и использовать continue, чтобы прервать текущую итерацию цикла while (true) и перейти к следующей сразу, без выполнения кода ниже

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