From 6758daab48070f2c030ed90e4272429fbd36f473 Mon Sep 17 00:00:00 2001 From: "S.Kuleshov" Date: 2024年3月12日 20:11:42 +0300 Subject: [PATCH 1/2] Implemented console application for dividing the bill total among a number of payers. --- README.md | 12 +++++++- src/main/java/CheckItem.java | 10 +++++++ src/main/java/Main.java | 52 +++++++++++++++++++++++++++++++++- src/main/java/ScanValues.java | 38 +++++++++++++++++++++++++ src/main/java/SharedCalc.java | 50 ++++++++++++++++++++++++++++++++ src/main/java/WordEndings.java | 18 ++++++++++++ 6 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 src/main/java/CheckItem.java create mode 100644 src/main/java/ScanValues.java create mode 100644 src/main/java/SharedCalc.java create mode 100644 src/main/java/WordEndings.java diff --git a/README.md b/README.md index 63be1bfe0..ca8fad57e 100644 --- a/README.md +++ b/README.md @@ -1 +1,11 @@ -# Пустой репозиторий для работы с Java кодом в Android Studio +# Приложение для разделения общего счета на равные платежи. +Данное приложение позволяет разделить сумму общего счета (например в ресторане) на равные платежи для распределения между участниками мероприятия. +Для использования приложения: +1. Введите количество участников, на которых надо будет разделить счет +2. Введите товары и суммы из чека + - Сначала вводится наименование товара/услуги + - Затем вводится стоимость товара/услуги (разделителем целой и дробной части является точка '.', цифры после второго знака после запятой игнорируются) + - Затем требуется ввести команду 'Завершить', если все затраты введены, либо любую строку или символ для продолжения ввода товаров/услуг +3. После завершения ввода будет выведен перечень всех затрат по чеку, итоговая сумма и размер платежа каждого участника + +Прошу обратить внимание! В случае, если общая сумма не делится на количество участников без остатка, то платеж платеж каждого округляется в большую сторону. При этом сумма переплаты также указывается в итоговом расчете. diff --git a/src/main/java/CheckItem.java b/src/main/java/CheckItem.java new file mode 100644 index 000000000..e6cb150f5 --- /dev/null +++ b/src/main/java/CheckItem.java @@ -0,0 +1,10 @@ +public class CheckItem { + String itemName; + double value; + + public CheckItem(String item, double value) { + this.itemName = item; + this.value = value; + } + +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java index db9356a08..fd4844d67 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,6 +1,56 @@ +import java.util.Locale; public class Main { public static void main(String[] args) { - System.out.println("Hello world!"); + + Locale.setDefault(Locale.US); // Для использования точки в качестве разделителя целой и дробной части double + SharedCalc calculator = new SharedCalc(); + + // Стадия 1: Выводим инструкции работы с программой + System.out.println("Приложение для разделения общего счета на равные платежи."); + System.out.println(" 1. Введите количество участников"); + System.out.println(" 2. Введите товары и суммы (в отдельной строке наименование товара, в следующей сумма)"); + System.out.println(" 3. Введите 'Завершить' по окончании ввода товаров"); + System.out.println("Вы получите список товаров и сумму для оплаты каждым участником.\n"); + + // Стадия 2: Цикл получения количества участников + System.out.println("Введите количество участников (2-999):"); + while (true) { + int persons = ScanValues.scanIntegerValue(); + if (persons> 1 && persons < 1000) { + System.out.printf("Счет будет разделен на %d %s%n", persons, WordEndings.convertPersons(persons)); + // Сообщаем калькулятору количество персон для разделения счета + calculator.setPersons(persons); + break; + } else System.out.printf("Введенное число %d неверно! Диапазон от 2 до 999:%n", persons); + } + + // Стадия 3: Добавляем товары и суммы + System.out.println("Вводите по-строчно товары и стоимость:"); + while (true) { + System.out.println("Введите название товара:"); + String item = ScanValues.scanStringValue(); + System.out.println("Теперь введите стоимость, например 12.34:"); + double value = ScanValues.scanDoubleValue(); + // Добавляем полученные значения в калькулятор и вывод сообщения об их добавлении + CheckItem newItem = new CheckItem(item, value); + calculator.addItem(newItem); + System.out.printf("Добавлен товар '%s' стоимостью %.2f %s, в чеке %d %s на сумму %.2f %s%n", + item, + value, + WordEndings.convertRubles((int) Math.floor(value)), + calculator.items.size(), + WordEndings.convertGoods(calculator.items.size()), + calculator.getTotal(), + WordEndings.convertRubles((int) Math.floor(calculator.getTotal()))); + + // Стадия 4: Выводим результат + System.out.println("Введите 'Завершить' для окончания или любое слово для продолжения"); + if (ScanValues.scanStringValue().equalsIgnoreCase("Завершить")) { + // Выводим статистику и завершаем цикл + System.out.println(calculator.getResultAsString()); + break; + } + } } } \ No newline at end of file diff --git a/src/main/java/ScanValues.java b/src/main/java/ScanValues.java new file mode 100644 index 000000000..e4db31d46 --- /dev/null +++ b/src/main/java/ScanValues.java @@ -0,0 +1,38 @@ +import java.util.Scanner; + +public class ScanValues { + public static int scanIntegerValue() { + Scanner scanner = new Scanner(System.in); + while (true) { + if (scanner.hasNextInt()) return scanner.nextInt(); + else { + System.out.println("Некорректный ввод! Введите целое число, например 15:"); + scanner.nextLine(); + } + } + } + + public static double scanDoubleValue() { + Scanner scanner = new Scanner(System.in); + while (true) { + if (scanner.hasNextDouble()) return Math.floor(scanner.nextDouble() * 100) / 100; + else { + System.out.println("Некорректный ввод! Введите число с разделителем, например 12.34:"); + scanner.nextLine(); + } + } + } + + public static String scanStringValue() { + Scanner scanner = new Scanner(System.in); + while (true) { + String result = scanner.next(); + if (!result.isEmpty()) return result; + else { + System.out.println("Пустое значение! Введите заново."); + scanner.nextLine(); + } + } + } + +} diff --git a/src/main/java/SharedCalc.java b/src/main/java/SharedCalc.java new file mode 100644 index 000000000..2ada57731 --- /dev/null +++ b/src/main/java/SharedCalc.java @@ -0,0 +1,50 @@ +import java.util.ArrayList; + +public class SharedCalc { + private int persons; + private double total; + ArrayList items = new ArrayList(); + + public void setPersons(int persons) { + this.persons = persons; + } + + public SharedCalc() { + this.persons = 0; + this.total = 0f; + } + public void addItem(CheckItem item) { + items.add(item); + total += item.value; + } + + public double getTotal() { + return total; + } + + public String getResultAsString() { + StringBuilder completeList = new StringBuilder(); + // Формируем чек в виде строки + System.out.println("Добавленные товары:"); + for (int i = 0; i < items.size(); i++) { + completeList.append(String.format("%s\n\t\t\t%.2f %s\n", + items.get(i).itemName, + items.get(i).value, + WordEndings.convertRubles((int) Math.floor(items.get(i).value)))); + } + completeList.append("------------------------\n"); + completeList.append(String.format("Итого:\n\t\t\t%.2f %s\n", + total, + WordEndings.convertRubles((int) Math.floor(total)))); + completeList.append("------------------------\n"); + double eachPart = Math.ceil(total / persons * 100) / 100; + completeList.append(String.format("С каждого по %.2f %s", + eachPart, + WordEndings.convertRubles((int) Math.floor(eachPart)))); + // Проверяем остаток и если он есть, то делаем приписку + double rest = total - eachPart * persons; + if (rest < 0) completeList.append(String.format(",\nа лишние %.2f %s в качестве чаевых.", -rest, WordEndings.convertRubles((int) Math.floor(-rest)))); + return completeList.toString(); + } + +} diff --git a/src/main/java/WordEndings.java b/src/main/java/WordEndings.java new file mode 100644 index 000000000..e5803cecd --- /dev/null +++ b/src/main/java/WordEndings.java @@ -0,0 +1,18 @@ +public class WordEndings { + public static String convertWord(String root, String oneItemEnd, String twoItemsEnd, String manyItemsEnd, int count) { + if (count % 10 == 1 && !(count / 10 % 10 == 1)) return root + oneItemEnd; // Если существительное в единственном числе + else if (count % 10> 1 && count % 10 < 5 && !(count / 10 % 10 == 1)) return root + twoItemsEnd; // Если существительное от 2 до 4, кроме дцать + else return root + manyItemsEnd; // Если существительное во множественном числе + } + + public static String convertRubles(int count) { + return convertWord("рубл", "ь", "я", "ей", count); + } + + public static String convertPersons(int count) { + return convertWord("персон", "у", "ы", "", count); + } + public static String convertGoods(int count) { + return convertWord("товар", "", "а", "ов", count); + } +} From fbd0b686ffc67a5a3e8d77ecacab32ce1072e76d Mon Sep 17 00:00:00 2001 From: "S.Kuleshov" Date: 2024年3月12日 21:01:16 +0300 Subject: [PATCH 2/2] 1. Scanner moved to class fields 2. Upper limitation 1000 persons removed 3. Fields in CheckItem.java made final 4. Negative values for the goods are excluded --- src/main/java/CheckItem.java | 4 ++-- src/main/java/Main.java | 8 ++++---- src/main/java/ScanValues.java | 16 ++++++++++------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/CheckItem.java b/src/main/java/CheckItem.java index e6cb150f5..7fc8cb8c2 100644 --- a/src/main/java/CheckItem.java +++ b/src/main/java/CheckItem.java @@ -1,6 +1,6 @@ public class CheckItem { - String itemName; - double value; + final String itemName; + final double value; public CheckItem(String item, double value) { this.itemName = item; diff --git a/src/main/java/Main.java b/src/main/java/Main.java index fd4844d67..0e5337715 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -14,15 +14,15 @@ public static void main(String[] args) { System.out.println("Вы получите список товаров и сумму для оплаты каждым участником.\n"); // Стадия 2: Цикл получения количества участников - System.out.println("Введите количество участников (2-999):"); + System.out.println("Введите количество участников (не меньше 2х):"); while (true) { int persons = ScanValues.scanIntegerValue(); - if (persons> 1 && persons < 1000) { + if (persons> 1) { System.out.printf("Счет будет разделен на %d %s%n", persons, WordEndings.convertPersons(persons)); // Сообщаем калькулятору количество персон для разделения счета calculator.setPersons(persons); break; - } else System.out.printf("Введенное число %d неверно! Диапазон от 2 до 999:%n", persons); + } else System.out.printf("Введенное число %d неверно! Требуется число больше 2х.", persons); } // Стадия 3: Добавляем товары и суммы @@ -31,7 +31,7 @@ public static void main(String[] args) { System.out.println("Введите название товара:"); String item = ScanValues.scanStringValue(); System.out.println("Теперь введите стоимость, например 12.34:"); - double value = ScanValues.scanDoubleValue(); + double value = ScanValues.scanDoublePositiveValue(); // Добавляем полученные значения в калькулятор и вывод сообщения об их добавлении CheckItem newItem = new CheckItem(item, value); calculator.addItem(newItem); diff --git a/src/main/java/ScanValues.java b/src/main/java/ScanValues.java index e4db31d46..a860f98cf 100644 --- a/src/main/java/ScanValues.java +++ b/src/main/java/ScanValues.java @@ -1,8 +1,8 @@ import java.util.Scanner; public class ScanValues { + private static final Scanner scanner = new Scanner(System.in); public static int scanIntegerValue() { - Scanner scanner = new Scanner(System.in); while (true) { if (scanner.hasNextInt()) return scanner.nextInt(); else { @@ -12,19 +12,23 @@ public static int scanIntegerValue() { } } - public static double scanDoubleValue() { - Scanner scanner = new Scanner(System.in); + public static double scanDoublePositiveValue() { while (true) { - if (scanner.hasNextDouble()) return Math.floor(scanner.nextDouble() * 100) / 100; + if (scanner.hasNextDouble()) { + double scannedValue = scanner.nextDouble(); + if (scannedValue> 0) return Math.floor(scannedValue * 100) / 100; + else { + System.out.println("Стоимость не может быть отрицательной или нулевой, введите снова."); + scanner.nextLine(); + } + } else { System.out.println("Некорректный ввод! Введите число с разделителем, например 12.34:"); - scanner.nextLine(); } } } public static String scanStringValue() { - Scanner scanner = new Scanner(System.in); while (true) { String result = scanner.next(); if (!result.isEmpty()) return result;

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