Не могу реализовать метод
import java.sql.SQLOutput;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("На какое кол-во человек необходимо разделить счет?");
int peopleNum = s.nextInt();
if (peopleNum == 1 || peopleNum < 1) {
System.out.println("Введите корректное число");
}
System.out.println("Введите название товара и сумму");
String[] menuArray = new String[100];
double[] sumArray = new double[100];
for (int i = 0; i < menuArray.length; i++) {
menuArray[i] = s.nextLine();
for (int b = 0; b < sumArray.length; b++) {
sumArray[b] = s.nextInt();
}
if (menuArray[i].equalsIgnoreCase("завершить")) {
break;
}
}
}
}
Мне нужно, чтобы пользователь вводил название товара и сумму, товар и сумма должны добавляться в массив.
Затем надо, чтобы этот цикл повторялся до тех пор, пока я не напишу завершить в консоли.
Далее мне надо будет показать то, что записал в массив String, и сложить сумму, которая должна быть в массиве double, эту сумму поделить на число, введенное в peopleNum.
Ответы (2 шт):
Возможный вариант решения с устранением ошибок в коде вопроса:
- Ввод
peopleNumв цикле, пока не будет введено корректное число. - Использование
Scanner::nextLine+Integer.parseInt/Double.parseDoubleдля ввода пользователя (при таком способе десятичным разделителем всегда в числах будет точка, независимо от локали); строки и числа всегда вводятся с новой строки. - Подсчёт количества пунктов меню при вводе в отдельной переменной
count, которое не может превышать заранее заданного ограничения (max = 100). - Использование форматированного вывода
System.out.printf
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
System.out.println("На какое количество человек необходимо разделить счет (не менее 2)?");
int peopleNum;
while ((peopleNum = Integer.parseInt(scan.nextLine())) < 2) {
System.out.println("Введите корректное число");
}
int max = 100;
System.out.println("Введите название товара и сумму, не более " + max + " значений, или \"завершить\"");
String[] items = new String[max];
double[] amounts = new double[max];
int count = 0;
String input;
// ввод
while (count < max && !"завершить".equalsIgnoreCase(input = scan.nextLine())) {
items[count] = input;
amounts[count] = Double.parseDouble(scan.nextLine());
count++;
System.out.println("Введите следующий товар и сумму или \"завершить\" для окончания ввода");
}
// вывод и вычисление общей суммы
double total = 0d;
for (int i = 0; i < count; i++) {
System.out.printf("%3d. %s: %.2f%n", i + 1, items[i], amounts[i]);
total += amounts[i];
}
System.out.printf("Общая сумма: %.2f, средняя сумма на одного: %.2f%n", total, total / peopleNum);
}
}
Небольшой пример использования стандартных возможностей Java (списки, кортежи, Stream API)
Код для решения данной задачи можно немного упростить, заменив обычные массивы с фиксированной длиной item, amounts списком List.
Размер списка будет автоматически увеличиваться при вводе новых данных, и не нужно будет вводить и проверять ограничения на максимальную длину в виде max = 100.
Также вместо двух отдельных списков следует использовать отдельный класс с полями "название" и "сумма", для чего в частности удобно использовать кортежи record.
Для вычисления суммы элементов списка можно использовать Stream API.
Вариант решения:
import java.util.*;
public class MyClass {
// кортеж для "строк" данных: название пункта меню и сумма
record Item(String name, double amount){}
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
System.out.println("На какое количество человек необходимо разделить счет (не менее 2)?");
int peopleNum;
while ((peopleNum = Integer.parseInt(scan.nextLine())) < 2) {
System.out.println("Введите корректное число");
}
System.out.println("Введите название товара и сумму, или \"завершить\"");
List<Item> items = new ArrayList<>(); // один список вместо двух массивов
String input;
// ввод
while (!"завершить".equalsIgnoreCase(input = scan.nextLine())) {
items.add(new Item(input, Double.parseDouble(scan.nextLine())));
System.out.println("Введите следующий товар и сумму или \"завершить\" для окончания ввода");
}
// вывод и вычисление общей суммы
double total = items.stream().mapToDouble(Item::amount).sum();
items.forEach(System.out::println);
System.out.printf("Общая сумма: %.2f, средняя сумма на одного: %.2f%n", total, total / peopleNum);
}
}
Вот пример того, как можно это сделать:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("На какое кол-во человек необходимо разделить счет?");
int peopleNum = scanner.nextInt();
while (peopleNum <= 1) {
System.out.println("Введите корректное число (больше 1):");
peopleNum = scanner.nextInt();
}
scanner.nextLine(); // Очистка буфера
String[] menuArray = new String[100];
double[] sumArray = new double[100];
int itemCount = 0; // Счётчик товаров
System.out.println("Введите название товара и его сумму через пробел или 'завершить' для окончания ввода:");
while (true) {
String input = scanner.nextLine();
if ("завершить".equalsIgnoreCase(input)) {
break; // Завершаем цикл, если пользователь ввёл "завершить"
}
String[] parts = input.split(" ");
if (parts.length != 2) {
System.out.println("Некорректный ввод, попробуйте ещё раз:");
continue;
}
String itemName = parts[0];
double itemSum;
try {
itemSum = Double.parseDouble(parts[1]);
} catch (NumberFormatException e) {
System.out.println("Сумма должна быть числом, попробуйте ещё раз:");
continue;
}
menuArray[itemCount] = itemName;
sumArray[itemCount] = itemSum;
itemCount++;
if (itemCount >= menuArray.length) {
System.out.println("Достигнут предел товаров!");
break; // Завершить цикл, если достигнут предел массива
}
}
double totalSum = 0;
for (int i = 0; i < itemCount; i++) {
totalSum += sumArray[i]; // Суммирование стоимости товаров
System.out.println("Товар: " + menuArray[i] + ", Сумма: " + sumArray[i]);
}
double dividedSum = totalSum / peopleNum;
System.out.printf("Общая сумма: %.2f\n", totalSum);
System.out.printf("Каждый человек должен заплатить: %.2f\n", dividedSum);
}
}