From e1f6893023e1e00e765909b127129a7ab6ece3d6 Mon Sep 17 00:00:00 2001 From: s-buvaka Date: 2022年7月27日 23:03:27 +0300 Subject: [PATCH 1/4] Remove classes --- src/main/java/Calculator.java | 22 ---------------- src/main/java/Formatter.java | 17 ------------- src/main/java/Item.java | 10 -------- src/main/java/Main.java | 47 +++-------------------------------- 4 files changed, 3 insertions(+), 93 deletions(-) delete mode 100644 src/main/java/Calculator.java delete mode 100644 src/main/java/Formatter.java delete mode 100644 src/main/java/Item.java diff --git a/src/main/java/Calculator.java b/src/main/java/Calculator.java deleted file mode 100644 index 2fbc00d..0000000 --- a/src/main/java/Calculator.java +++ /dev/null @@ -1,22 +0,0 @@ -class Calculator { - - int friendsCount; - - String cart = "Добавленные товары:"; - double totalPrice = 0; - - Calculator(int friendsCount) { - this.friendsCount = friendsCount; - } - - void addItem(Item item) { - totalPrice += item.price; - cart = cart + "\n" + item.name; - - System.out.println(item.name + " в корзине"); - } - - double divideSum() { - return totalPrice / friendsCount; - } -} diff --git a/src/main/java/Formatter.java b/src/main/java/Formatter.java deleted file mode 100644 index 3f915b7..0000000 --- a/src/main/java/Formatter.java +++ /dev/null @@ -1,17 +0,0 @@ -public class Formatter { - - String formatValue(double price) { - double roundedValue = Math.floor(price); - if (roundedValue == 1) { - return "рубль"; - } else if (roundedValue>= 2 && roundedValue <= 4) { - return "рубля"; - } else { - return "рублей"; - } - } - - String roundResult(final double result) { - return String.format("%.2f", result); - } -} diff --git a/src/main/java/Item.java b/src/main/java/Item.java deleted file mode 100644 index fad8a4e..0000000 --- a/src/main/java/Item.java +++ /dev/null @@ -1,10 +0,0 @@ -class Item { - - String name; - double price; - - Item(String name, double price) { - this.name = name; - this.price = price; - } -} diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 11ba5d3..a9198c4 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,49 +1,8 @@ -import java.util.Scanner; - public class Main { public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - - int friendCount; - while (true) { - System.out.println("На сколько человек необходимо разделить счет?"); - friendCount = scanner.nextInt(); - - if (friendCount> 1) { - break; - } else if (friendCount == 1) { - System.out.println( - "Нет смысла делить сумму на одного человека. Давайте попробуем ввести другое значение, которое будет больше единицы."); - } else { - System.out.println("Неверное количество друзей. Значение должно быть болье единицы, давайте попробуем еще раз."); - } - } - - Calculator calculator = new Calculator(friendCount); - - 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("Завершить")) { - break; - } - } - - double result = calculator.divideSum(); - Formatter formatter = new Formatter(); - - System.out.println(calculator.cart); - System.out.println("Каждому человеку к оплате: " + formatter.roundResult(result) + " " + formatter.formatValue(result)); + // ваш код начнется здесь + // вы не должны ограничиваться только классом Main и можете создавать свои классы по необходимости + System.out.println("Привет Мир"); } } From c521234c876be18b465b2fd45ef8a71d814fb7a9 Mon Sep 17 00:00:00 2001 From: s-buvaka Date: 2022年7月27日 23:13:52 +0300 Subject: [PATCH 2/4] Change project name --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 716abf2..be110bf 100644 --- a/settings.gradle +++ b/settings.gradle @@ -12,4 +12,4 @@ dependencyResolutionManagement { mavenCentral() } } -rootProject.name = "BillCalculator" +rootProject.name = "Java-Module-Project" From 7b3c825832fd7e816691fa02e26ba87fd80e3e9f Mon Sep 17 00:00:00 2001 From: Secur1ty-21 Date: 2022年8月12日 05:48:06 +0300 Subject: [PATCH 3/4] First solution. --- src/main/java/Calculator.java | 31 +++++++ src/main/java/Main.java | 153 +++++++++++++++++++++++++++++++++- 2 files changed, 181 insertions(+), 3 deletions(-) create mode 100644 src/main/java/Calculator.java diff --git a/src/main/java/Calculator.java b/src/main/java/Calculator.java new file mode 100644 index 0000000..117acd5 --- /dev/null +++ b/src/main/java/Calculator.java @@ -0,0 +1,31 @@ +import java.util.ArrayList; +import java.util.List; + +public class Calculator { + private float totalAmount; + private final List products; + + /** + * Добавление товаров в калькулятор. + * + * @param name имя товара. + * @param price цена товара. + */ + public void addProduct(String name, double price) { + totalAmount += price; + products.add(name); + } + + public List getProducts() { + return products; + } + + public float getTotalAmount() { + return totalAmount; + } + + Calculator() { + totalAmount = 0; + products = new ArrayList(); + } +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java index a9198c4..0a2e4fb 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,8 +1,155 @@ +import java.io.UnsupportedEncodingException; +import java.util.Scanner; + public class Main { + final static Scanner scanner = new Scanner(System.in, "utf-8"); public static void main(String[] args) { - // ваш код начнется здесь - // вы не должны ограничиваться только классом Main и можете создавать свои классы по необходимости - System.out.println("Привет Мир"); + int numOfPeople = getNumOfPeople(); // Колисчестов людей в компании. + Calculator calculator = new Calculator(); // Модель хранения продуктов. + addsProductsInList(calculator); // Добавляем продукты в модель. + printResults(calculator, numOfPeople); // Печатаем результат. + } + + /** + * Запрашивает пользователя ввести количество человек в компании, и возвращает это количество. + * + * @return Возвращает число человек в комании. + */ + public static int getNumOfPeople() { + System.out.println("Привет! На сколько человек должен быть разделен счет?"); // Просим ввести количество людей + int numOfPeople; + try { + numOfPeople = Integer.parseInt(scanner.nextLine()); // Перехватываем вылет, если пользователь ввел не число + } catch (NumberFormatException e) { + numOfPeople = 0; + } // Получаем пользовательский ввод + while (numOfPeople <= 1) { // Если ввод неверный, сообщаем об ошибке и просим ввести снова + System.out.println("Неправильный ввод! Количество человек должно быть> 1, попробуйте ввести еще раз."); + // Повтор запроса ввода + System.out.println("На сколько человек должен быть разделен счет?"); + try { + numOfPeople = Integer.parseInt(scanner.nextLine()); // Перехватываем вылет, если пользователь ввел не число + } catch (NumberFormatException e) { + numOfPeople = 0; + } + } + return numOfPeople; + } + + /** + * Добавляет товары в список и подсчитывает общую сумму за них. + * + * @param calculator Экземляр класса, со списком товаров. + */ + public static void addsProductsInList(Calculator calculator) { + String userInputAdd; // Пользовательский ввод. + String name; // Имя товара. + String price; // Цена товара. + int[] indexes = new int[4]; // Массив индексов для вытаскивания подстроки. + while (true) { + System.out.println("Введите имя товара и его цену в соответствии с форматом, чтобы добавить. Формат -> \"'рубли.копейки' [10.45, 11.40]\"."); // Просим пользователя ввести товар. + 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; + } + } + + /** + * Печатает результат подсчетов. + * + * @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) + " рублей."); + } + } + + /** + * Очистка массива от значений + * @param indexes Массив для обнуления + */ + public static void clearIndexes(int[] indexes) { + int size = indexes.length; + for (int i = 0; i < size; i++) { + indexes[i] = 0; + } } } From 3ca208f4c829f6b0c5e67d817a993bb39077ed08 Mon Sep 17 00:00:00 2001 From: Secur1ty-21 Date: 2022年8月12日 16:45:21 +0300 Subject: [PATCH 4/4] Add second way for add product and a bit of refactoring. --- src/main/java/Calculator.java | 3 ++- src/main/java/Main.java | 46 +++++++++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/main/java/Calculator.java b/src/main/java/Calculator.java index 117acd5..5e2e779 100644 --- a/src/main/java/Calculator.java +++ b/src/main/java/Calculator.java @@ -3,10 +3,11 @@ public class Calculator { private float totalAmount; + // Не Map с сохранением цены т.к. в сохранении цены кажого товора нет необходимости по заданию. private final List products; /** - * Добавление товаров в калькулятор. + * Добавление товара в калькулятор. * * @param name имя товара. * @param price цена товара. diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 0a2e4fb..ac9bca6 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,4 +1,3 @@ -import java.io.UnsupportedEncodingException; import java.util.Scanner; public class Main { @@ -7,7 +6,8 @@ public class Main { public static void main(String[] args) { int numOfPeople = getNumOfPeople(); // Колисчестов людей в компании. Calculator calculator = new Calculator(); // Модель хранения продуктов. - addsProductsInList(calculator); // Добавляем продукты в модель. + addsProductsInList(calculator, true); // Добавляем продукты в модель. 1 способ. + //addsProductsInList(calculator); // Добавляем продукты в модель. 2 способ. printResults(calculator, numOfPeople); // Печатаем результат. } @@ -38,7 +38,42 @@ public static int getNumOfPeople() { } /** - * Добавляет товары в список и подсчитывает общую сумму за них. + * Добавляет товары в список и подсчитывает общую сумму за них. Берет информацию из двух строк. + * + * @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; + } + } + } + + /** + * Добавляет товары в список и подсчитывает общую сумму за них. Берет информацию из одной строки. * * @param calculator Экземляр класса, со списком товаров. */ @@ -48,7 +83,7 @@ public static void addsProductsInList(Calculator calculator) { String price; // Цена товара. int[] indexes = new int[4]; // Массив индексов для вытаскивания подстроки. while (true) { - System.out.println("Введите имя товара и его цену в соответствии с форматом, чтобы добавить. Формат -> \"'рубли.копейки' [10.45, 11.40]\"."); // Просим пользователя ввести товар. + System.out.println("Введите имя товара и его цену в соответствии с форматом, чтобы добавить. Формат -> \"'имя товара' 10.0\"."); // Просим пользователя ввести товар. userInputAdd = scanner.nextLine(); // Получаем пользовательский ввод. if (!userInputAdd.isEmpty()) { // Если пользователь что-то ввел. parseUserAddInput(userInputAdd, indexes); @@ -82,7 +117,7 @@ public static void addsProductsInList(Calculator calculator) { continue; } System.out.println("Хотите добавить еще один продукт?\nВведите \"Завершить\" чтобы закончить добавление товаров.\nВведите любую букву для продолжения."); // Спрашиваем пользователя, хочет ли он добавить еще один товар. - userInputAdd = scanner.nextLine(); // Получаем ответ на вопрос + userInputAdd = scanner.nextLine(); // Получаем ответ на вопрос. if (userInputAdd.equalsIgnoreCase("завершить")) { // Если пользователь ввел "Завершить", выходим из цикла. break; } @@ -144,6 +179,7 @@ public static void printResults(Calculator calculator, int numOfPeople) { /** * Очистка массива от значений + * * @param indexes Массив для обнуления */ public static void clearIndexes(int[] indexes) {

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