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" diff --git a/src/main/java/Calculator.java b/src/main/java/Calculator.java index 2fbc00d..5e2e779 100644 --- a/src/main/java/Calculator.java +++ b/src/main/java/Calculator.java @@ -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 products; - 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 getProducts() { + return products; + } - System.out.println(item.name + " в корзине"); + public float getTotalAmount() { + return totalAmount; } - double divideSum() { - return totalPrice / friendsCount; + Calculator() { + totalAmount = 0; + products = new ArrayList(); } } 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..ac9bca6 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -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(); // Модель хранения продуктов. + 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; + } // Получаем пользовательский ввод + while (numOfPeople <= 1) { // Если ввод неверный, сообщаем об ошибке и просим ввести снова + System.out.println("Неправильный ввод! Количество человек должно быть> 1, попробуйте ввести еще раз."); + // Повтор запроса ввода + System.out.println("На сколько человек должен быть разделен счет?"); + try { + numOfPeople = Integer.parseInt(scanner.nextLine()); // Перехватываем вылет, если пользователь ввел не число + } catch (NumberFormatException e) { + numOfPeople = 0; + } + } + 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; + } } }

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