-
Notifications
You must be signed in to change notification settings - Fork 0
First check solution #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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,22 +1,32 @@ | ||
| class Calculator { | ||
| import java.util.ArrayList; | ||
| import java.util.List; | ||
|
|
||
| int friendsCount; | ||
| public class Calculator { | ||
| private float totalAmount; | ||
| // Не Map с сохранением цены т.к. в сохранении цены кажого товора нет необходимости по заданию. | ||
| private final List<String> products; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Кажется final тут лишний
Owner
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Может быть, но насколько помню final позволяет сохранять 1 байт памяти. А присвоение нового инстанца функциональность класса не подразумевает, меняется только внутреннее состояние объекта . Или вопрос в том, что предпочитается помечать final только числовые и текстовые константы, которые явно для этого созданы, чтобы потом не наткнуться на штыки final у своего объекта? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Вообще ты прав, принято накладывать максимально возможные ограничения на объект, а уже если в дальнейшем понадобиться то их можно ослабить
Owner
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Понял, спасибо за пояснения! |
||
|
|
||
| String cart = "Добавленные товары:"; | ||
| double totalPrice = 0; | ||
|
|
||
| Calculator(int friendsCount) { | ||
| this.friendsCount = friendsCount; | ||
| /** | ||
| * Добавление товара в калькулятор. | ||
| * | ||
| * @param name имя товара. | ||
| * @param price цена товара. | ||
| */ | ||
| public void addProduct(String name, double price) { | ||
| totalAmount += price; | ||
| products.add(name); | ||
| } | ||
|
|
||
| void addItem(Item item) { | ||
| totalPrice += item.price; | ||
| cart = cart + "\n" + item.name; | ||
| public List<String> getProducts() { | ||
| return products; | ||
| } | ||
|
|
||
| System.out.println(item.name + " в корзине"); | ||
| public float getTotalAmount() { | ||
| return totalAmount; | ||
| } | ||
|
|
||
| double divideSum() { | ||
| return totalPrice / friendsCount; | ||
| Calculator() { | ||
| totalAmount = 0; | ||
| products = new ArrayList<>(); | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,49 +1,191 @@ | ||
| import java.util.Scanner; | ||
|
|
||
| public class Main { | ||
| final static Scanner scanner = new Scanner(System.in, "utf-8"); | ||
|
|
||
| public static void main(String[] args) { | ||
| Scanner scanner = new Scanner(System.in); | ||
| int numOfPeople = getNumOfPeople(); // Колисчестов людей в компании. | ||
| Calculator calculator = new Calculator(); // Модель хранения продуктов. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. В комментарии написано "Модель хранения продуктов", а класс называется Calculator, это может запутать людей которые читают код |
||
| addsProductsInList(calculator, true); // Добавляем продукты в модель. 1 способ. | ||
| //addsProductsInList(calculator); // Добавляем продукты в модель. 2 способ. | ||
| printResults(calculator, numOfPeople); // Печатаем результат. | ||
| } | ||
|
|
||
| int friendCount; | ||
| while (true) { | ||
| System.out.println("На сколько человек необходимо разделить счет?"); | ||
| friendCount = scanner.nextInt(); | ||
| /** | ||
| * Запрашивает пользователя ввести количество человек в компании, и возвращает это количество. | ||
| * | ||
| * @return Возвращает число человек в комании. | ||
| */ | ||
| public static int getNumOfPeople() { | ||
| System.out.println("Привет! На сколько человек должен быть разделен счет?"); // Просим ввести количество людей | ||
| int numOfPeople; | ||
| try { | ||
| numOfPeople = Integer.parseInt(scanner.nextLine()); // Перехватываем вылет, если пользователь ввел не число | ||
| } catch (NumberFormatException e) { | ||
| numOfPeople = 0; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. В данном случае если пользователь введет строку "два", то он получит ошибку "Неправильный ввод! Количество человек должно быть > 1, попробуйте ввести еще раз." |
||
| } // Получаем пользовательский ввод | ||
| while (numOfPeople <= 1) { // Если ввод неверный, сообщаем об ошибке и просим ввести снова | ||
| System.out.println("Неправильный ввод! Количество человек должно быть > 1, попробуйте ввести еще раз."); | ||
| // Повтор запроса ввода | ||
| System.out.println("На сколько человек должен быть разделен счет?"); | ||
| try { | ||
| numOfPeople = Integer.parseInt(scanner.nextLine()); // Перехватываем вылет, если пользователь ввел не число | ||
| } catch (NumberFormatException e) { | ||
| numOfPeople = 0; | ||
| } | ||
|
Comment on lines
+31
to
+35
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Тут повторяется код, который написан в 22 - 26 строках |
||
| } | ||
| return numOfPeople; | ||
| } | ||
|
|
||
| if (friendCount > 1) { | ||
| /** | ||
| * Добавляет товары в список и подсчитывает общую сумму за них. Берет информацию из двух строк. | ||
| * | ||
| * @param calculator Экземляр класса, со списком товаров. | ||
| * @param change Маркер чтобы использовать другой способ | ||
| */ | ||
| public static void addsProductsInList(Calculator calculator, boolean change) { | ||
| String name; // Имя товара. | ||
| String price; // Цена товара. | ||
| while (true) { | ||
| System.out.println("Введите имя товара"); // Просим пользователя ввести имя товара. | ||
| name = scanner.nextLine(); // Получаем имя товара. | ||
| System.out.println("Введите цену товара в формате -> 'рубли.копейки' [10.45, 11.40]"); // Просим пользователя ввести имя товара. | ||
| price = scanner.nextLine(); // Получаем цену товара текстом. | ||
| if (name.isEmpty() || price.isEmpty()) { | ||
| System.out.println("Неправильный ввод, повторите попытку!"); // Сообщение об ошибке. | ||
| continue; | ||
| } | ||
| try { // Пробуем текстовую цену товара преобразовать в вещественное число. | ||
| calculator.addProduct(name, Float.parseFloat(price)); // Добавление товара в список. | ||
| } catch (NumberFormatException e) { | ||
| System.out.println("Неправильный ввод, повторите попытку! Убедитесь что правильно указали цену!"); // Сообщение об ошибке. | ||
| continue; | ||
| } | ||
| System.out.println("Товар был успешно добавлен!"); // Сообщение об успешном добавлении.System.out.println("Хотите добавить еще один продукт?\nВведите \"Завершить\" чтобы закончить добавление товаров.\nВведите любую букву для продолжения."); // Спрашиваем пользователя, хочет ли он добавить еще один товар. | ||
| System.out.println("Хотите добавить еще один продукт?\n" + | ||
| "1.Введите \"Завершить\" чтобы закончить добавление товаров.\n" + | ||
| "2.Введите любой символ для продолжения."); | ||
| name = scanner.nextLine(); // Получаем ответ на вопрос. | ||
| if (name.equalsIgnoreCase("завершить")) { // Если пользователь ввел "Завершить", выходим из цикла. | ||
| break; | ||
| } else if (friendCount == 1) { | ||
| System.out.println( | ||
| "Нет смысла делить сумму на одного человека. Давайте попробуем ввести другое значение, которое будет больше единицы."); | ||
| } else { | ||
| System.out.println("Неверное количество друзей. Значение должно быть болье единицы, давайте попробуем еще раз."); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| Calculator calculator = new Calculator(friendCount); | ||
|
|
||
| /** | ||
| * Добавляет товары в список и подсчитывает общую сумму за них. Берет информацию из одной строки. | ||
| * | ||
| * @param calculator Экземляр класса, со списком товаров. | ||
| */ | ||
| public static void addsProductsInList(Calculator calculator) { | ||
| String userInputAdd; // Пользовательский ввод. | ||
| String name; // Имя товара. | ||
| String price; // Цена товара. | ||
| int[] indexes = new int[4]; // Массив индексов для вытаскивания подстроки. | ||
| while (true) { | ||
| System.out.println("Введите название товара"); | ||
| String name = scanner.next(); | ||
|
|
||
| System.out.println("Введите стоимость товара в формате: 'рубли.копейки' [10.45, 11.40]"); | ||
| double price = scanner.nextDouble(); | ||
|
|
||
| calculator.addItem(new Item(name, price)); | ||
|
|
||
| System.out.println( | ||
| "Хотите добавить еще один товар? Введите любой символ для продолжения, либо 'Завершить' если больше нет товаров для добавления"); | ||
| String answer = scanner.next(); | ||
|
|
||
| if (answer.equalsIgnoreCase("Завершить")) { | ||
| System.out.println("Введите имя товара и его цену в соответствии с форматом, чтобы добавить. Формат -> \"'имя товара' 10.0\"."); // Просим пользователя ввести товар. | ||
| userInputAdd = scanner.nextLine(); // Получаем пользовательский ввод. | ||
| if (!userInputAdd.isEmpty()) { // Если пользователь что-то ввел. | ||
| parseUserAddInput(userInputAdd, indexes); | ||
| if (indexes[0] < 1 || indexes[1] < 1 || indexes[2] < 1 || indexes[3] < 1) { // Проверка ввода пользователя на соответствие формату. | ||
| if (indexes[0] == 0 || indexes[1] == -1) { | ||
| System.out.println("Неправильный ввод, повторите попытку! Убедитесь что поместили имя товара в ковычки!"); // Сообщение об ошибке. | ||
| } else { | ||
| System.out.println("Неправильный ввод, повторите попытку! Убедитесь что правильно указали цену!"); // Сообщение об ошибке. | ||
| } | ||
| clearIndexes(indexes); | ||
| continue; // Перемещение к началу тела цикла. | ||
| } | ||
| if (userInputAdd.charAt(indexes[2] - 1) == '-') { // Проверка на существование минуса перед числом. | ||
| System.out.println("Неправильный ввод, повторите попытку! Цена товара не может быть отрицательной!"); | ||
| clearIndexes(indexes); | ||
| continue; | ||
| } | ||
| name = userInputAdd.substring(indexes[0], indexes[1]); // Извлечение из пользовательского ввода имени товара. | ||
| if (name.isEmpty()) { | ||
| name = Character.toString(userInputAdd.charAt(indexes[0])); | ||
| } | ||
| price = userInputAdd.substring(indexes[2], indexes[3]); // Извлечение из пользовательского ввода цены товара. | ||
| if (price.isEmpty()) { | ||
| price = Character.toString(userInputAdd.charAt(indexes[2])); | ||
| } | ||
| calculator.addProduct(name, Float.parseFloat(price)); // Добавление товара в список. | ||
| System.out.println("Товар был успешно добавлен!"); // Сообщение об успешном добавлении. | ||
| clearIndexes(indexes); | ||
| } else { | ||
| System.out.println("Неправильный ввод, повторите попытку!"); | ||
| continue; | ||
| } | ||
| System.out.println("Хотите добавить еще один продукт?\nВведите \"Завершить\" чтобы закончить добавление товаров.\nВведите любую букву для продолжения."); // Спрашиваем пользователя, хочет ли он добавить еще один товар. | ||
| userInputAdd = scanner.nextLine(); // Получаем ответ на вопрос. | ||
| if (userInputAdd.equalsIgnoreCase("завершить")) { // Если пользователь ввел "Завершить", выходим из цикла. | ||
| break; | ||
| } | ||
| } | ||
| } | ||
|
|
||
| /** | ||
| * Парсер для извлечения из пользовательского ввод данных, для добавления в список продуктов. | ||
| * | ||
| * @param userInput Пользовательский ввод. | ||
| * @param indexes Массив для сохранения индексов, для подстрок. | ||
| */ | ||
| public static void parseUserAddInput(String userInput, int[] indexes) { | ||
| indexes[0] = userInput.indexOf('\'') + 1; // Буква после первого попавшегося символа "'". | ||
| indexes[1] = userInput.indexOf('\'', indexes[0]); // Буква перед следующим попавшимся символом "'". | ||
| if (indexes[0] == 0 || indexes[1] == -1) { | ||
| return; | ||
| } | ||
| int length = userInput.length(); | ||
| for (int i = indexes[1]; i < length; i++) { // Начинаем со следующего символа после второй "'". | ||
| if (Character.isDigit(userInput.charAt(i)) && indexes[2] == 0) { // Находим цифру. | ||
| indexes[2] = i; | ||
| } | ||
| // Если после нахождения цифры нашелся символ не цифры и это не ., то запоминаем последнее вхождение цифры. | ||
| if (!Character.isDigit(userInput.charAt(i)) && userInput.charAt(i) != '.' && indexes[2] != 0) { | ||
| indexes[3] = i - 1; | ||
| return; | ||
| } | ||
| } | ||
| if (indexes[2] != 0 && indexes[3] == 0) { | ||
| indexes[3] = userInput.length() - 1; | ||
| } | ||
| } | ||
|
|
||
| double result = calculator.divideSum(); | ||
| Formatter formatter = new Formatter(); | ||
| /** | ||
| * Печатает результат подсчетов. | ||
| * | ||
| * @param calculator Список всех продуктов и их общей стоимости. | ||
| * @param numOfPeople Количество человек в компании. | ||
| */ | ||
| public static void printResults(Calculator calculator, int numOfPeople) { | ||
| System.out.println("Добавленные товары:"); | ||
| int size = calculator.getProducts().size(); | ||
| float part = calculator.getTotalAmount() / numOfPeople; // Поделенный счет на одного человека | ||
| for (int i = 0; i < size; i++) { | ||
| System.out.println(calculator.getProducts().get(i) + "."); | ||
| } | ||
| String format = "На каждого человека получится по = %.2f"; // Округление до 2 чисел после запятой | ||
| if (part % 100 > 10 && part % 100 < 15) { | ||
| System.out.println(String.format(format, part) + " рублей."); | ||
| } else if (part % 10 == 1) { | ||
| System.out.println(String.format(format, part) + " рублю."); | ||
| } else if (part % 10 > 1 && part % 10 < 5) { | ||
| System.out.println(String.format(format, part) + " рубля."); | ||
| } else { | ||
| System.out.println(String.format(format, part) + " рублей."); | ||
| } | ||
| } | ||
|
|
||
| System.out.println(calculator.cart); | ||
| System.out.println("Каждому человеку к оплате: " + formatter.roundResult(result) + " " + formatter.formatValue(result)); | ||
| /** | ||
| * Очистка массива от значений | ||
| * | ||
| * @param indexes Массив для обнуления | ||
| */ | ||
| public static void clearIndexes(int[] indexes) { | ||
| int size = indexes.length; | ||
| for (int i = 0; i < size; i++) { | ||
| indexes[i] = 0; | ||
| } | ||
| } | ||
| } | ||