Repository navigation
Expand file tree
/
Copy pathMain.java
More file actions
191 lines (183 loc) · 12.9 KB
/
Copy pathMain.java
File metadata and controls
191 lines (183 loc) · 12.9 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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
import java.util.Scanner;
public class Main {
final static Scanner scanner = new Scanner(System.in, "utf-8");
public static void main(String[] args) {
int numOfPeople = getNumOfPeople(); // Колисчестов людей в компании.
Calculator calculator = new Calculator(); // Модель хранения продуктов.
addsProductsInList(calculator, true); // Добавляем продукты в модель. 1 способ.
//addsProductsInList(calculator); // Добавляем продукты в модель. 2 способ.
printResults(calculator, numOfPeople); // Печатаем результат.
}
/**
* Запрашивает пользователя ввести количество человек в компании, и возвращает это количество.
*
* @return Возвращает число человек в комании.
*/
public static int getNumOfPeople() {
System.out.println("Привет! На сколько человек должен быть разделен счет?"); // Просим ввести количество людей
int numOfPeople;
try {
numOfPeople = Integer.parseInt(scanner.nextLine()); // Перехватываем вылет, если пользователь ввел не число
} catch (NumberFormatException e) {
numOfPeople = 0;
} // Получаем пользовательский ввод
while (numOfPeople <= 1) { // Если ввод неверный, сообщаем об ошибке и просим ввести снова
System.out.println("Неправильный ввод! Количество человек должно быть > 1, попробуйте ввести еще раз.");
// Повтор запроса ввода
System.out.println("На сколько человек должен быть разделен счет?");
try {
numOfPeople = Integer.parseInt(scanner.nextLine()); // Перехватываем вылет, если пользователь ввел не число
} catch (NumberFormatException e) {
numOfPeople = 0;
}
}
return numOfPeople;
}
/**
* Добавляет товары в список и подсчитывает общую сумму за них. Берет информацию из двух строк.
*
* @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;
}
}
}
/**
* Добавляет товары в список и подсчитывает общую сумму за них. Берет информацию из одной строки.
*
* @param calculator Экземляр класса, со списком товаров.
*/
public static void addsProductsInList(Calculator calculator) {
String userInputAdd; // Пользовательский ввод.
String name; // Имя товара.
String price; // Цена товара.
int[] indexes = new int[4]; // Массив индексов для вытаскивания подстроки.
while (true) {
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;
}
}
/**
* Печатает результат подсчетов.
*
* @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) + " рублей.");
}
}
/**
* Очистка массива от значений
*
* @param indexes Массив для обнуления
*/
public static void clearIndexes(int[] indexes) {
int size = indexes.length;
for (int i = 0; i < size; i++) {
indexes[i] = 0;
}
}
}