Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

Open
Secur1ty-21 wants to merge 4 commits into main
base: main
Choose a base branch
Loading
from master
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion settings.gradle
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ dependencyResolutionManagement {
mavenCentral()
}
}
rootProject.name = "BillCalculator"
rootProject.name = "Java-Module-Project"
36 changes: 23 additions & 13 deletions src/main/java/Calculator.java
View file Open in desktop
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;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кажется final тут лишний

Copy link
Owner Author

@Secur1ty-21 Secur1ty-21 Aug 13, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Может быть, но насколько помню final позволяет сохранять 1 байт памяти. А присвоение нового инстанца функциональность класса не подразумевает, меняется только внутреннее состояние объекта . Или вопрос в том, что предпочитается помечать final только числовые и текстовые константы, которые явно для этого созданы, чтобы потом не наткнуться на штыки final у своего объекта?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вообще ты прав, принято накладывать максимально возможные ограничения на объект, а уже если в дальнейшем понадобиться то их можно ослабить

Copy link
Owner Author

@Secur1ty-21 Secur1ty-21 Aug 15, 2022

Choose a reason for hiding this comment

The 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<>();
}
}
17 changes: 0 additions & 17 deletions src/main/java/Formatter.java
View file Open in desktop

This file was deleted.

10 changes: 0 additions & 10 deletions src/main/java/Item.java
View file Open in desktop

This file was deleted.

202 changes: 172 additions & 30 deletions src/main/java/Main.java
View file Open in desktop
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(); // Модель хранения продуктов.
Copy link

Choose a reason for hiding this comment

The 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;
Copy link

Choose a reason for hiding this comment

The 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
Copy link

Choose a reason for hiding this comment

The 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;
}
}
}

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