Возможный вариант решения с устранением ошибок в коде вопроса:
- Ввод
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);
}
}
SQLOutput2) При вводеpeopleNumнужен цикл, пока не будет введено корректное значение, иначе останется любое некорректное. 3) ЗначениеpeopleNumпосле ввода нигде не используется, создаются массивы на 100 элементов. 4) Массив сумм объявлен какdouble[], но вводятся в него целые числа 5) Классическая ошибка при вводе: одновременное использованиеScanner::nextLineиScanner::nextInt, см. Особенности использованияscanner.nextLine()или любой из нескольких сотен дубликатов. – Nowhere Man Dec 23 '23 at 16:45