Skip to content

ДЗ по 1-му проекту: консольный калькулятор счета в кафе - #1

Open
Alex-Fedd wants to merge 3 commits into
mainfrom
dev
Open

Alex-Fedd wants to merge 3 commits into
mainfrom
dev

Conversation

@Alex-Fedd

Copy link
Copy Markdown
Owner

ПР по 1-й дз. Буду очень благодарен, если получится объяснить ошибки или сложные моменты.

Comment thread src/main/java/org/example/Main.java Outdated
calculatorObject.addMyItem(itemName, itemPrice);
System.out.println("Товар " + itemName + " успешно добавлен!" +
" Хотите ли добавить ещё один товар?");
myTotal = calculatorObject.calculateMyTotal();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Есть предложение не вычислять сумму на каждой итерации цикла добавления товара, а производить подсчет только при выводе результатов. Это позволит оптимизировать код программы и избежать лишних вычислений. Также можно будет удалить переменную myTotal.

Comment thread src/main/java/org/example/Main.java Outdated
Comment thread src/main/java/org/example/Main.java Outdated
Comment thread src/main/java/org/example/Main.java Outdated
Comment on lines +89 to +99
if ((Math.floor(myTotal / allGuests) >= 1.0) && (Math.floor(myTotal / allGuests) < 2)) {
String myResult = "Счет на каждого: %.2f рубль";
System.out.println(String.format(myResult, myTotal / allGuests));
} else if ((Math.floor(myTotal / allGuests) >= 2) && (Math.floor(myTotal / allGuests) < 4.99)) {
String myResult = "Счет на каждого: %.2f рубля";
System.out.println(String.format(myResult, myTotal / allGuests));
}
else if((Math.floor(myTotal / allGuests) < 1) || (Math.floor(myTotal / allGuests) >= 5)){
String myResult = "Счет на каждого: %.2f рублей";
System.out.println(String.format(myResult, myTotal / allGuests));
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

В каждом условии происходит повторяющийся расчет myTotal / allGuests. Давай заранее вычислим это значение и сохраним его в переменной, а затем будем использовать это значение в условиях if-else. Это позволит избежать повторных вычислений одного и того же значения в каждом условии и сделает код более эффективным и читаемым.

Comment thread src/main/java/org/example/Main.java Outdated
Comment on lines +103 to +110
class Item {
String itemName;
double itemPrice;

Item(String itemName, double itemPrice) {
this.itemName = itemName;
this.itemPrice = itemPrice;
}

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/org/example/Main.java Outdated
Comment on lines +90 to +91
String myResult = "Счет на каждого: %.2f рубль";
System.out.println(String.format(myResult, myTotal / allGuests));

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Вместо использования функции format, которая создает новую отформатированную строку, можно воспользоваться функцией printf, которая позволяет форматировать вывод напрямую при его осуществлении:

String myResult = "Счет на каждого: %.2f рубль %n";
System.out.printf(myResult,  myTotal / allGuests);

Comment thread src/main/java/org/example/Main.java Outdated
…ссы по файлам; поправил printf; убрал лишний расчет общей суммы при выводе; обработал пустоту пр ивводе названия товара (по комменту в ревью)
…ссы по файлам; поправил printf; убрал лишний расчет общей суммы при выводе; обработал пустоту при вводе названия товара (по комменту в ревью) + также верное склонение обработал
@Alex-Fedd

Copy link
Copy Markdown
Owner Author

Привет! Спасибо большое за ревью и за советы, подсказки. Пришлось еще поломать голову над замечаниями. Мне кажется, что поправил те, что были по первому ревью:

  1. "Обработка некорректных данных. а) При вводе названия товара пользователь может оставить его пустым или ввести только пробелы; б) При вводе цены товара пользователь может вместо чисел ввести строки, что приведет к падению приложения; в) приложение допускает ввод отрицательной суммы за товар".
  2. "Вывод слова "рубль" с правильным окончанием (Для корректного определения окончания необходимо учитывать округленное значение цены без дробной части и последнюю цифру)".

Также постарался последовать советам и поправить код по комментариям из ПР.

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

Comment on lines +67 to +71
if (scan.hasNextLine()) {
if (scan.nextLine().equalsIgnoreCase("Завершить")) {
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.

Условие можно раскрыть и переписать следующим образом:

if (scan.hasNextLine() && scan.nextLine().equalsIgnoreCase("Завершить")) {
    break;
}

Если первое условие вернет false, то второе не будет проверяться. Таким образом мы убираем лишнюю вложенность.

public void printFormatResult(double myTotal, int allGuests) {
double sumResult = myTotal / allGuests;
int endNumber = (int) sumResult % 10;
if ((Math.floor(sumResult) >= 1.0) && (Math.floor(sumResult) < 2)) {

@IvanGusevE IvanGusevE Apr 15, 2024 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Отлично, что ты сохранил результат выражения myTotal / allGuests в переменную. Однако, можно также добавить еще одну переменную, чтобы сохранить туда результат округления. Это позволит избежать повторного вычисления выражения Math.floor.

P.S.
Также можно сразу преобразовать переменную в int и сравнивать уже с целочисленными значениями (как ты это сделал для endNumber).

} else if (endNumber == 1) {
String myResult = "Счет на каждого: %.2f рубль";
System.out.printf(myResult, sumResult);
} else if (endNumber >= 5 && endNumber <= 9) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Выражение endNumber <= 9 всегда будет возвращать true, потому что (int) sumResult % 10 может принимать значения от 0 до 9.

String itemName = "";
while (scan.hasNextLine()) {
itemName = scan.nextLine();
if (itemName.trim().isEmpty()) {

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.isBlank()

Также лучше перед добавлением товара удалять пробелы как раз при помощи trim().

import java.util.ArrayList;

class Calculator {
ArrayList<Item> itemsList = new ArrayList<>();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Лучше сделать переменную закрытой (private), чтобы ограничить доступ к ней только внутри класса и предотвратить ее изменение извне, что способствует лучшей инкапсуляции данных и сокрытию внутренних деталей реализации класса.

Comment on lines +49 to +63
while (true) {
System.out.println("Какая цена у товара?");
if (scan.hasNextDouble()) {
itemPrice = scan.nextDouble();
if (itemPrice < 0) {
System.out.println("Отрицательное значение. Введите заново.");
} else {
scan.nextLine();
break;
}
} else if (!scan.hasNextDouble()) {
System.out.println("Некорректное значение. Надо ввести в формате: 00,00");
scan.nextLine();
}
}

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

Скорее всего проблема с удалением последнего символа.

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