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
87 changes: 87 additions & 0 deletions src/main/java/CheckCalculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import java.util.ArrayList;
import java.util.HashMap;

public class CheckCalculator {

private int numPersons;
private double finalSum;
private HashMap<String,CheckItem> checkItems;
public CheckCalculator(int numPersons) {
this.numPersons = numPersons;
this.checkItems = new HashMap<>();
this.finalSum = 0;
}

public double calculate() {
if (numPersons < 2) {
System.out.println("Количество человек меньше 2");
return 0.0;
}
return finalSum / numPersons;
}
public double reCalculate() {
if (numPersons < 2) {
System.out.println("Количество человек меньше 2");
return 0.0;
}
double sum = 0;
for (CheckItem i: checkItems.values()) {
sum += i.calculateCost();
}
return sum / numPersons;
}

public void addCheckItem(String name, double price, int num) {
if (checkItems.containsKey(name)) {
CheckItem item = checkItems.get(name);
item.addNum(num);
checkItems.put(name,item);
} else {
checkItems.put(name, new CheckItem(name,price,num));
}

finalSum += price*num;
}

public void addCheckItem(String name, double price) {
addCheckItem(name,price,1);
}

public void printCheckItems() {
System.out.println("Добавленные товары:");
for (CheckItem i : this.checkItems.values()) {
System.out.println(i);
}
}
}

class CheckItem {
String name;
double price;
int num;

public CheckItem(String name, double price) {
this.name = name;
this.price = price;
this.num = 1;
}
public CheckItem(String name, double price, int num) {
this.name = name;
this.price = price;
this.num = num;
}

void addNum(int num) {
if (num > 0) {
this.num += num;
}
}
double calculateCost() {
return price*num;
}

@Override
public String toString() {
return String.format("%s %.2f * %d",name,price,num);
}
}
112 changes: 111 additions & 1 deletion src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,116 @@
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
Scanner input = new Scanner(System.in);
int numPersons = askNumPersons(input);

CheckCalculator calculator = new CheckCalculator(numPersons);
int numAdded = 0;
do {
String name = askName(input);
double price = askPrice(input);
calculator.addCheckItem(name,price);
System.out.println("Добавленные товары:\n"+name);
numAdded++;
} while (askContinue(input));

if (numAdded > 0) {
calculator.printCheckItems();
double sumPerOne = calculator.calculate();
rublesFormatter fmt = new rublesFormatter();
System.out.printf("%s с каждого человека\n", fmt.format(sumPerOne));
}
}

public static int askNumPersons(Scanner scanner) {
System.out.println("Введите количество человек (больше 1), между которыми разделить счет");
int num;
while (true) {
num = parsePositiveInt(scanner);
if (num <= 1) {
System.out.println("Неверное количество персон, введите число больше 1");
} else {
break;
}
}
return num;
}

public static String askName(Scanner scanner) {
System.out.println("Введите название блюда");
return scanner.next();
}

public static double askPrice(Scanner scanner) {
double price = 0.0;
while (true) {
System.out.println("Введите стоимость (руб.коп)");
price = parseDouble(scanner);
if (price < 0.0) {
System.out.println("Некорректное значение");
} else {
break;
}
}
return price;
}

public static boolean askContinue(Scanner scanner) {
System.out.println("Хотите что-то добавить? Напишите любой символ для продолжения, 'завершить' для выхода");
String input = scanner.next();
return !input.equalsIgnoreCase("завершить");
}

static int parsePositiveInt(Scanner scanner) {
String input = scanner.next().strip();
for (Character c: input.toCharArray()) {
if (!Character.isDigit(c)) {
return -1;
}
}
return Integer.parseInt(input);
}

static double parseDouble(Scanner scanner) {
String input = scanner.next().strip();
boolean haveDot = false;
for (Character c: input.toCharArray()) {
if (!Character.isDigit(c)) {
if (c.equals('.') && !haveDot) {
haveDot = true;
continue;
} else {
return -1.0;
}
}
}
return Double.parseDouble(input);
}

}

class rublesFormatter {
public String format(double num) {
return String.format("%.2f %s",num,numToRublesWord(Double.valueOf(num).intValue()));
}

public String numToRublesWord(int num) {
num = num % 100;
if ((num > 4) && (num < 20)) {
return "рублей";
} else {
num = num % 10;
switch (num) {
case 1:
return "рубль";
case 2:
case 3:
case 4:
return "рубля";
default:
return "рублей";
}
}
}
}