Skip to content
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
67 changes: 67 additions & 0 deletions src/main/java/Calculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import java.util.ArrayList;
import java.util.Locale;
import java.util.Scanner;

public class Calculator {
/* Класс хронит в себе добавленные товары и общую сумму за эти товары */

ArrayList<Goods> goodsList = new ArrayList<>(); // Создаем массив для имен продуктов
double summa; // Создаем переменную под общую сумму

public Calculator() {
Scanner scanner = new Scanner(System.in); // Подключаем сканер
while(true) {
String goodsName;
System.out.println("Введите товар или команду [Завершить]:"); // Просим пользователя ввести название товара или завершить подсчет
goodsName = scanner.next(); // Сканируем введенный текст

if(goodsName.equalsIgnoreCase("Завершить")) { // Сравниваем строку с командой завершения
break; // если пользователь ввел "Завершить", то останавливаем цикл
}
else if (goodsName.trim().isEmpty()) { // Режем пробелы и проверяем на пустоту
System.out.println("Ошибка! Название товара не должно быть пустым."); // Если пользователь не ввел название и нажал Enter
continue;
}
else { // Иначе (если все ОК) добавляем товар и просим пользователя ввести цену товара
Goods goods = new Goods(goodsName);
while(true) { // Цикл нужен, чтобы запрашивать цену товара у пользователя, пока тот не введет корректное значение
double price; // Для цены товаров
try {
Scanner scannerPrice = new Scanner(System.in); // Подключаем сканер (если этого не сделать, до зацикливается)
scannerPrice.useLocale(Locale.US); // В ТЗ сказано, что при вводе/выводе число должно разделяться точкой
System.out.println("Введите его цену в формате Рубли.Копейки:"); // Спрашиваем цену у пользователя
price = scannerPrice.nextDouble(); // Сканирует ответ

if(price >=0) { // если цена корректная
goods.price = price;
goodsList.add(goods);
summa += price;
break; // Останавливаем цикл с запросом цены
}
else { // Иначе выводим сообщение об ошибке
System.out.println("Ошибка. Цена не может быть отрицательной");
}

}
catch(Exception ex) {
System.out.println("Ошибка! Цена должна быть числом в формате Рубли.Копейки.");
}
}
}
}
}

void printGoods() {
Formatter formatter = new Formatter(); // Создаем экземпляр класса форматтера

System.out.println("Добавленные товары:\n");
for (Goods goods : goodsList) {
System.out.println(goods.name + "-"+ formatter.numberFormat(goods.price));
}
System.out.println("Общая сумма "+ formatter.numberFormat(summa)); // Выводим общую сумму за все товары
}
void divideSumma(int people) {
Formatter formatter = new Formatter(); // Создаем экземпляр класса форматтера
System.out.println("Каждый должен заплатить "+ formatter.numberFormat(summa / people)); // Выводим результат
}
}
23 changes: 23 additions & 0 deletions src/main/java/Formatter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import java.util.Locale;

public class Formatter {
/* Класс формирует число для вывода суммы оплаты и добавляет к нему слово "Рубль" с нужным окончанием */
String numberFormat(double number) {
String wordEnd;

int floor = (int) Math.floor(number); // Округляем число до целого

if (floor % 10 == 1 && floor % 100 != 11) { // Вычисляем остаток от деления числа на 10 и на 100 (1 - рубль, а 111 - рублей)
wordEnd = "рубль"; // Если остаток соответствует условию, то возвращаем "рубль"
}
else if (floor % 10 >= 2 && floor % 10 <=4 && (floor % 100 < 10 || floor % 100 >= 20)) { // Вычисляем остаток от деления числа на 10 и на 100 (2 - рубля, а 112 - рублей)
wordEnd = "рубля"; // Если остаток соответствует условию, то возвращаем "рубля"
}
else { // Во всех остальных случаях
wordEnd = "рублей"; // Возвращаем "рублей"
}

return String.format(Locale.ROOT,"%.2f", number) +" "+ wordEnd; // Возвращаем число с двумя знаками после точки (Locale как раз для точки, иначе выводится запятая)
}

}
8 changes: 8 additions & 0 deletions src/main/java/Goods.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
public class Goods {
String name; // Для названий товаров
double price; // Для цены товаров

public Goods(String name) {
this.name = name;
}
}
7 changes: 6 additions & 1 deletion src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import java.util.Locale;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
PeopleCounter peopleCounter = new PeopleCounter(); // Создаем экземпляр класса счетчика людей
Calculator calc = new Calculator(); // Создаем экземпляр класса калькулятора
calc.printGoods(); // Выводим все добавленные товары на экран
calc.divideSumma(peopleCounter.peopleNumber); // Выводим итоговую сумму на одного человека
}
}
29 changes: 29 additions & 0 deletions src/main/java/PeopleCounter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import java.util.Locale;
import java.util.Scanner;

public class PeopleCounter {
public int peopleNumber; // Кол-во людей для разделения счет

public PeopleCounter() {
while(true) {
System.out.println("На скольких человек необходимо разделить счёт"); // Задаем вопрос пользователю

try {
Scanner scanner = new Scanner(System.in); // Подключаем сканер
scanner.useLocale(Locale.US); // В ТЗ сказано, что при вводе/выводе число должно разделяться точкой
peopleNumber = scanner.nextInt(); // Сканируем его ответ
if (peopleNumber <= 1) {
System.out.println("Ошибка. Нельзя разделить счет на введенное количество людей");
}
else { // Если ответ корректный, то останавливаем цикл
break;
}
}
catch(Exception ex) {
System.out.println("Ошибка! Нужно ввести целое цисло.");
}
}
}


}