Repository navigation
Conversation
|
|
||
| class Dish { | ||
| Scanner scanner = new Scanner(System.in); | ||
| Scanner scanner1 = new Scanner(System.in); |
There was a problem hiding this comment.
🍏 Достаточно использовать один Scanner. Если при этом программа начинает работать некорректно, проверь, что циклы написаны правильно.
| import java.util.Scanner; | ||
|
|
||
|
|
||
| class Dish { |
There was a problem hiding this comment.
🍏 Рекомендую класс Dish, в котором будут поля для сохранения названия и цены блюда. А операции со списком блюд вынести в отдельный класс.
Также можно вынести в отдельный класс форматирование вывода (слова "рубль")
| Scanner scanner1 = new Scanner(System.in); | ||
| public String finish = "Завершить"; | ||
| public double sumOfDishes; | ||
| public String name, check = "проверка"; |
There was a problem hiding this comment.
🍏 Для лучшей читаемости лучше разнести объявление этих двух переменных в разные строки
| Scanner scanner = new Scanner(System.in); | ||
| Scanner scanner1 = new Scanner(System.in); | ||
| public String finish = "Завершить"; | ||
| public double sumOfDishes; |
There was a problem hiding this comment.
🍏 Сейчас любое из этих полей можно изменить снаружи класса. Это не очень хорошо, лучше для внутренних переменных использовать модификатор private.
https://javarush.com/groups/posts/1988-modifikatorih-dostupa-private-protected-default-public
| class Dish { | ||
| Scanner scanner = new Scanner(System.in); | ||
| Scanner scanner1 = new Scanner(System.in); | ||
| public String finish = "Завершить"; |
There was a problem hiding this comment.
🍏 Эту строку можно вынести в константу, так как она не будет изменяться на всем протяжении работы программы.
https://www.baeldung.com/java-constants-good-practices
| return numberOfPeople; | ||
| } | ||
| public void peoplescalculator2(){ | ||
| while (!scanner.hasNextInt()){ |
There was a problem hiding this comment.
🍏 Круто, что обрабатываешь неверный ввод!
|
|
||
| return numberOfPeople; | ||
| } | ||
| public void peoplescalculator2(){ |
There was a problem hiding this comment.
🍏 Рекомендую давать методам более понятные названия. Со стороны не ясно, в чем может быть разница между peoplescalculator1 и peoplescalculator2.
| } | ||
|
|
||
| public void result() { | ||
| sumPerPerson = sumOfDishes / numberOfPeople; |
There was a problem hiding this comment.
🍏 Здесь происходит неявное приведение суммы конечного результата к integer, так как производится операция между разными типами чисел (double и integer). Из-за этого в итоге мы получаем результат без копеек
|
|
||
| public void result() { | ||
| sumPerPerson = sumOfDishes / numberOfPeople; | ||
| System.out.println("Вы заказали " + "\n" + listOfNAmes + "\n" + ". Общая стоимость стоимость заказа " + sumOfDishes + " " + "Каждый заплатит " + String.format("%.2f", Math.floor(sumPerPerson)) +" "+ "рубля"); |
There was a problem hiding this comment.
🍏 При печати в памяти будут создаваться промежуточные строки из-за использования оператора "+". Можно использовать StringBuilder, который сформирует только результирующую строку.
https://habr.com/ru/articles/260767
| @@ -1,6 +1,26 @@ | |||
| import java.util.ArrayList; | |||
| import java.util.Scanner; | |||
There was a problem hiding this comment.
🍏 Остались неиспользуемые импорты, лучше их удалить
Рекомендую никогда не извиняться заранее за свою работу) Все когда-то учились) У тебя хорошая первая попытка! |
|
|
||
|
|
||
| } | ||
| class Calculator { |
There was a problem hiding this comment.
🍏 В Java принято каждый класс выносить в отдельный файл. В Kotlin это не будет требоваться
| } | ||
| class Calculator { | ||
| Scanner scanner = new Scanner(System.in); | ||
| StringBuilder builder = new StringBuilder(); |
| } else { | ||
| System.out.println("Делим на " + numberOfPeople + " человек."); | ||
| } | ||
| } while (numberOfPeople < 1); |
| System.out.println("Введите название блюда"); | ||
| scanner.next(); | ||
| while (!scanner.hasNext()) { | ||
| System.out.println("Что-то пошло не так!"); |
There was a problem hiding this comment.
🍏 Строку "Что-то пошло не так!" можно вынести в константу, так как она повторяется несколько раз в коде приложения. В этом случае если тебе нужно будет ее немного изменить, например, написать "Ой, что-то пошло не так!", то ты внесешь изменения в одном месте кода, а не вовсех местах использования.
| double number = (int) numberOfPeople; | ||
|
|
||
| sumPerPerson = sumOfDishes / number; | ||
| StringBuilder builder = new StringBuilder("Вы заказали " + "\n" + listOfNAmes + "\n" + "Общая стоимость стоимость заказа " + String.format("%.2f", Math.floor(sumOfDishes)) + " " + formater.formaterSum(sumOfDishes) + "." + " " + "Каждый заплатит " + String.format("%.2f", Math.floor(sumPerPerson)) + " " + formater.formaterSumPerPerson(sumPerPerson) +"."); |
There was a problem hiding this comment.
🍏 Вся мощь StringBuilder в этой строке сведена к нулю, так как сначала выполнятся все действия операторов "+" и результат уже готовым будет передан в StringBuilder)
Попробуй для построения строки использовать методы самого StringBuilder:
StringBuilder builder = new StringBuilder("Вы заказали \n")
builder.append(listOfNAmes)
builder.append("\n")
... ...
System.out.println(builder);
Больше про методы StringBuilder можно почитать вот здесь с примерами:
https://javarush.com/quests/lectures/questsyntaxpro.level09.lecture06
| } | ||
| class Formater { | ||
| public String format; | ||
| public String formaterSum(double sumOfDishes) { |
There was a problem hiding this comment.
🍏 formaterSum делает абсолютно то же самое, что и formaterSumPerPerson. Эти методы имеют одинаковую сигнатуру, принимают одинаковые типы аргументов и возвращают одинаковые типы значений. Достаточно использовать один метод, просто передавать в него разные данные.
| public String formaterSum(double sumOfDishes) { | ||
| int rub = (int) (sumOfDishes % 10); | ||
|
|
||
| switch (rub) { |
There was a problem hiding this comment.
🍏 Возможно, для этой ситуации подойдет использование простого if elseIf else, так как здесь всего четыре возможных случая. Нужно проверить, что число входит в один из четырех интервалов:
== 1 рубль
> 1 && <= 4 рубля
>= 5 && <= 9 рублей
==0 рублей
| class Formater { | ||
| public String format; | ||
| public String formaterSum(double sumOfDishes) { | ||
| int rub = (int) (sumOfDishes % 10); |
There was a problem hiding this comment.
| public class Main { | ||
| public static void main(String[] args) { | ||
| int numberOfPeople = 0; | ||
| Dish dish = new Dish(); |
There was a problem hiding this comment.
🍏 Здесь dish уже не используется, можно удалить
| } | ||
|
|
||
| public String askName(String name) { | ||
| System.out.println("Введите название блюда"); |
There was a problem hiding this comment.
🍏 Все повторяющиеся строки лучше выносить в константы)
| scanner.next(); | ||
| } else { | ||
| sumOfDishes = sumOfDishes + price; | ||
| System.out.println("Вы заказали: " + listOfNAmes + " " + price + " на сумму: " + String.format("%.2f",sumOfDishes)); |
There was a problem hiding this comment.
🍏 Здесь тоже можно использовать StringBuilder, чтобы не создавать промежуточных строк
| double number = (int) numberOfPeople; | ||
|
|
||
| sumPerPerson = sumOfDishes / number; | ||
| StringBuilder builder = new StringBuilder("Вы заказали "); |
There was a problem hiding this comment.
🍏 Всю работу билдера по формированию результирующей строки можно вынести в отдельный метод, в который будут переданы необходимые параметры
| public class Formater { | ||
| public String format; | ||
|
|
||
| public String formater(double test) { |
Понимаю, что это ужасно, но учусь программировать с нуля и это все, что я пока могу. Извините:(