Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Comments

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

Open
Alex-Fedd wants to merge 3 commits intomain from
dev
Open

ДЗ по 1-му проекту: консольный калькулятор счета в кафе #1
Alex-Fedd wants to merge 3 commits intomain from
dev

Conversation

@Alex-Fedd
Copy link
Owner

@Alex-Fedd Alex-Fedd commented Apr 9, 2024

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

calculatorObject.addMyItem(itemName, itemPrice);
System.out.println("Товар " + itemName + " успешно добавлен!" +
" Хотите ли добавить ещё один товар?");
myTotal = calculatorObject.calculateMyTotal();
Copy link

@IvanGusevE IvanGusevE Apr 10, 2024

Choose a reason for hiding this comment

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

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

Alex-Fedd reacted with thumbs up emoji
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

@IvanGusevE IvanGusevE Apr 10, 2024

Choose a reason for hiding this comment

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

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

Alex-Fedd reacted with thumbs up emoji
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

@IvanGusevE IvanGusevE Apr 10, 2024

Choose a reason for hiding this comment

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

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

Alex-Fedd reacted with thumbs up emoji
Comment on lines 90 to 91
String myResult = "Счет на каждого: %.2f рубль";
System.out.println(String.format(myResult, myTotal / allGuests));
Copy link

@IvanGusevE IvanGusevE Apr 10, 2024

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);

Alex-Fedd reacted with thumbs up emoji
...ссы по файлам; поправил printf; убрал лишний расчет общей суммы при выводе; обработал пустоту пр ивводе названия товара (по комменту в ревью)
...ссы по файлам; поправил printf; убрал лишний расчет общей суммы при выводе; обработал пустоту при вводе названия товара (по комменту в ревью) + также верное склонение обработал
Copy link
Owner Author

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

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

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

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

Comment on lines +67 to +71
if (scan.hasNextLine()) {
if (scan.nextLine().equalsIgnoreCase("Завершить")) {
break;
}
}
Copy link

@IvanGusevE IvanGusevE Apr 15, 2024

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)) {
Copy link

@IvanGusevE IvanGusevE Apr 15, 2024
edited
Loading

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

@IvanGusevE IvanGusevE Apr 15, 2024

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

@IvanGusevE IvanGusevE Apr 15, 2024

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

@IvanGusevE IvanGusevE Apr 15, 2024

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

@IvanGusevE IvanGusevE Apr 15, 2024

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

Reviewers

1 more reviewer

@IvanGusevE IvanGusevE IvanGusevE left review comments

Reviewers whose approvals may not affect merge requirements

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

AltStyle によって変換されたページ (->オリジナル) /