forked from Yandex-Practicum/Java-Module-Project
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMain.java
More file actions
145 lines (128 loc) · 7.18 KB
/
Main.java
File metadata and controls
145 lines (128 loc) · 7.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import java.io.IOError;
import java.io.IOException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;
String name;
String test1 = "Завершить";
String test2 = "Complete";
double price;
double summ;
Calculator Calc = new Calculator();
do {
n = ReadInt(sc, "На сколько человек необходимо разделить счёт ?");
if (n == 1) System.out.println("Нет смысла ничего считать и делить при 1 человеке");
else if (n < 1) System.out.println("Количество людей должно быть больше 1");
else System.out.println(String.format("Будем делить на %d %s", n, OutPers(n)));
} while (n < 2);
System.out.println("Что будем покупать ?");
while(true) {
System.out.println("Введите название товара или слово \"Завершить\" (\"Complete\")");
name = sc.next();
if (name.equalsIgnoreCase(test1) || name.equalsIgnoreCase(test2))
break;
if (name.isEmpty())
System.out.println("Обратите внимаение! Вы не ввели пустое имя, видимо не хотите раскрывать имя товара...");
do {
price = ReadDouble(sc, "Введите стоимость товара в формате рубли.копейки, если копеек нет их можно не вводить");
if (price < 0.0)
System.out.println("Ошибка!! Товар не может стоить меньше 0 рублей 00 копеек");
else if (price == 0.0)
System.out.println("Обратите внимание! Бесплатный товар, но мы его добавим");
} while(price < 0);
Calc.calculate(name, price);
System.out.println(jl;lString.format("Добавлен товар \"%s\" по цене %.2f, каждому теперь нужно внести уже по %s\n",
name, price, OutMoneySum(Calc.sum / n, 2)));
System.out.println("Если больше не хотите добавлять товар наберите слово \"Завершить\" или \"Complete\"");
System.out.println("Английское можно ввести в любом регистре, но русское именно так, как написано\n");
}
System.out.println(String.format("\nДобавленные товары:\n%s\nОбщая сумма: %s на %d %s\nКаждому нужно внести по %s\n",
Calc.list, OutMoneySum(Calc.sum, 1), n, OutPers(n), OutMoneySum(Calc.sum / n, 2)));
}
// Вывод денежной суммы в формате
// для var == 1: хх рубль/рубля/рублей xx копейка/копейки/копеек
// для var == 2: хх рублю/рубля/рублей xx копейке/копейки/копеек
private static String OutMoneySum(double sum, int var) {
int rub = (int)sum;
int kop = (int)((sum - rub) * 100 + 0.5);
return String.format("%d %s %d %s", rub, OutRub(rub, var), kop, OutKop(kop, var));
}
private static String OutRub(int rub, int var) {
String Out = "рубль"; // именительный падеж
if (var == 2)
Out = "рублю"; // дательный падеж
int p1 = rub % 100;
if ((p1 >= 5) && (p1 <= 20)) // Обработка исключений от 11 до 14: рублей
Out = "рублей";
else {
int p2 = p1 % 10;
if ((p2 >= 5) || (p2 == 0)) // Обработка оканчивающихся от 5 до 9 и на 0: рублей
Out = "рублей";
else if (p2 >= 2)
Out = "рубля"; // Обработка оканчивающихся от 2 до 4: рубля
}
return Out; // При 1 остается в единственном числе: рубль/рублю
}
private static String OutKop(int kop, int var) {
String Out = "копейка"; // именительный падеж
if (var == 2)
Out = "копейке"; // дательный падеж
int p1 = kop % 100;
if ((p1 >= 5) && (p1 <= 20)) // Обработка исключений от 11 до 14: копеек
Out = "копеек";
else {
int p2 = p1 % 10;
if ((p2 >= 5) || (p2 == 0)) // Обработка оканчивающихся от 5 до 9 и на 0: копеек
Out = "копеек";
else if (p2 >= 2)
Out = "копейки"; // Обработка оканчивающихся от 2 до 4: копейки
}
return Out; // При 1 остается в единственном числе: копейка/копейке
}
// Вывод в формате: (на) хх человека/человек
private static String OutPers(int persons) {
String Out = "человека"; // Разделить на 1, 2, 3, 4 человека
int p1 = persons % 100;
if ((p1 >= 5) && (p1 <= 20)) // исключение от 11 до 14 человек
Out = "человек";
else {
int p2 = p1 % 10;
if ((p2 >= 5) || (p2 == 0))
Out = "человек";
}
return Out; // При последней цифре 1, 2, 3, 4 (кроме 11..14) остается значение по умолчанию: человека
}
private static class Calculator {
double sum = 0;
String list = "";
void calculate(String name, double price) {
this.sum += price;
this.list += String.format("%s по цене %.2f\n", name, price);
}
}
private static int ReadInt(Scanner sc, String prompt) {
int ret;
System.out.println(prompt);
while(!sc.hasNextInt()) {
sc.next();
System.out.println("Это явно не целое число. Попробуйте снова. Вводите целое число !");
System.out.println(prompt);
}
ret = sc.nextInt();
return ret;
}
private static double ReadDouble(Scanner sc, String prompt) {
double ret;
System.out.println(prompt);
while(!sc.hasNextDouble()) {
sc.next();
System.out.println("Это явно не число. Возможно, вместо точки нужно поставить запятую\nПопробуйте еще раз");
System.out.println(prompt);
}
System.out.println();
ret = sc.nextDouble();
return ret;
}
}