-3
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.

Nowhere Man
  • 15,995
  • 33
  • 19
  • 29
  • Пожалуйста, уточните вашу конкретную проблему или приведите более подробную информацию о том, что именно вам нужно. В текущем виде сложно понять, что именно вы спрашиваете. – Дух сообщества Dec 23 '23 at 15:32
  • 1
    Почему не можете? – andreymal Dec 23 '23 at 15:35
  • больше не не могу, а не получается( – Алихан Dec 23 '23 at 15:37
  • 1
    Почему не получается? – andreymal Dec 23 '23 at 15:38
  • 1
    напиши, в чем конкретно что-то не получается. пока выглядит так, что ты просто закинул, типа, сделайте... – Игорь Dec 23 '23 at 15:39
  • 1
    Пользователь не хочет ничего вводить? Оказывает сопротивление? А если серьёзно, как вы вводите товар и сумму, в один массив или разные? Вы знаете, что массивы в Java имеют фиксированную длину? Если хотите, чтобы размер массива увеличивался, следует использовать список ('List'). – Nowhere Man Dec 23 '23 at 16:16
  • Что у вас не получается? Помните, что учебные задания допустимы в качестве вопросов только при условии, что вы пытались решить их самостоятельно перед тем, как задать вопрос. Пожалуйста, отредактируйте вопрос и укажите, что именно вызвало у вас трудности при решении задачи (для этого нажмите [edit]). Например, приведите код, который вы написали, пытаясь решить задачу – Зонтик Dec 23 '23 at 16:18
  • добавил код, надеюсь донесу мысль которую хотел реализовать – Алихан Dec 23 '23 at 16:28
  • Я хотел чтобы пользователь вводил название товара, после чего указывал сумму и так до тех пор пока, пока я не напишу в консоль завершить. Далее мне надо будет показать то что записал в массив String и сложить сумму которая должна быть в массиве double, эту сумму поделить на число веденное в peopleNum. – Алихан Dec 23 '23 at 16:32
  • По вашему коду: 1) не нужен импорт SQLOutput 2) При вводе peopleNum нужен цикл, пока не будет введено корректное значение, иначе останется любое некорректное. 3) Значение peopleNum после ввода нигде не используется, создаются массивы на 100 элементов. 4) Массив сумм объявлен как double[], но вводятся в него целые числа 5) Классическая ошибка при вводе: одновременное использование Scanner::nextLine и Scanner::nextInt, см. Особенности использования scanner.nextLine() или любой из нескольких сотен дубликатов. – Nowhere Man Dec 23 '23 at 16:45
  • О, ещё упустил вложенный цикл при вводе сумм. Зачем вы пытаетесь ввести для каждого товара, которых у вас 100 штук, по 100 сумм, какой в этом смысл, если массив сумм один, и при вводе старые значения будут перетираться. – Nowhere Man Dec 23 '23 at 16:54
  • Разрешено ли вам пользоваться списками (коллекциями) в качестве динамических массивов, которые могут менять размер? – Nowhere Man Dec 23 '23 at 16:58
  • Да, в целом загвоздка только в создании массива. – Алихан Dec 23 '23 at 20:25

2 Answers2

1

Возможный вариант решения с устранением ошибок в коде вопроса:

  • Ввод 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())) &lt; 2) {
        System.out.println(&quot;Введите корректное число&quot;);
    }
    int max = 100;
    System.out.println(&quot;Введите название товара и сумму, не более &quot; + max + &quot; значений, или \&quot;завершить\&quot;&quot;);

    String[] items = new String[max];
    double[] amounts = new double[max];
    int count = 0;
    String input;
    // ввод
    while (count &lt; max &amp;&amp; !&quot;завершить&quot;.equalsIgnoreCase(input = scan.nextLine())) {
        items[count] = input;
        amounts[count] = Double.parseDouble(scan.nextLine());
        count++;
        System.out.println(&quot;Введите следующий товар и сумму или \&quot;завершить\&quot; для окончания ввода&quot;);
    }
    // вывод и вычисление общей суммы
    double total = 0d;
    for (int i = 0; i &lt; count; i++) {
        System.out.printf(&quot;%3d. %s: %.2f%n&quot;, i + 1, items[i], amounts[i]);
        total += amounts[i];
    }
    System.out.printf(&quot;Общая сумма: %.2f, средняя сумма на одного: %.2f%n&quot;, total, total / peopleNum);        
}

}


Небольшой пример использования стандартных возможностей Java (списки, кортежи, Stream API)

Код для решения данной задачи можно немного упростить, заменив обычные массивы с фиксированной длиной item, amounts списком List.

Размер списка будет автоматически увеличиваться при вводе новых данных, и не нужно будет вводить и проверять ограничения на максимальную длину в виде max = 100.

Также вместо двух отдельных списков следует использовать отдельный класс с полями "название" и "сумма", для чего в частности удобно использовать кортежи record.
Для вычисления суммы элементов списка можно использовать Stream API.

Вариант решения:

import java.util.*;

public class MyClass {

// кортеж для &quot;строк&quot; данных: название пункта меню и сумма 
record Item(String name, double amount){}

public static void main(String args[]) {
    Scanner scan = new Scanner(System.in);
    System.out.println(&quot;На какое количество человек необходимо разделить счет (не менее 2)?&quot;);

    int peopleNum;
    while ((peopleNum = Integer.parseInt(scan.nextLine())) &lt; 2) {
        System.out.println(&quot;Введите корректное число&quot;);
    }
    System.out.println(&quot;Введите название товара и сумму, или \&quot;завершить\&quot;&quot;);

    List&lt;Item&gt; items = new ArrayList&lt;&gt;(); // один список вместо двух массивов
    String input;
    // ввод
    while (!&quot;завершить&quot;.equalsIgnoreCase(input = scan.nextLine())) {
        items.add(new Item(input, Double.parseDouble(scan.nextLine())));
        System.out.println(&quot;Введите следующий товар и сумму или \&quot;завершить\&quot; для окончания ввода&quot;);    
    }
    // вывод и вычисление общей суммы
    double total = items.stream().mapToDouble(Item::amount).sum();
    items.forEach(System.out::println);
    System.out.printf(&quot;Общая сумма: %.2f, средняя сумма на одного: %.2f%n&quot;, total, total / peopleNum);
}

}

Nowhere Man
  • 15,995
  • 33
  • 19
  • 29
0

Вот пример того, как можно это сделать:

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 &lt;= 1) {
        System.out.println(&quot;Введите корректное число (больше 1):&quot;);
        peopleNum = scanner.nextInt();
    }

    scanner.nextLine(); // Очистка буфера

    String[] menuArray = new String[100];
    double[] sumArray = new double[100];
    int itemCount = 0; // Счётчик товаров

    System.out.println(&quot;Введите название товара и его сумму через пробел или 'завершить' для окончания ввода:&quot;);
    while (true) {
        String input = scanner.nextLine();
        if (&quot;завершить&quot;.equalsIgnoreCase(input)) {
            break; // Завершаем цикл, если пользователь ввёл &quot;завершить&quot;
        }

        String[] parts = input.split(&quot; &quot;);
        if (parts.length != 2) {
            System.out.println(&quot;Некорректный ввод, попробуйте ещё раз:&quot;);
            continue;
        }

        String itemName = parts[0];
        double itemSum;

        try {
            itemSum = Double.parseDouble(parts[1]);
        } catch (NumberFormatException e) {
            System.out.println(&quot;Сумма должна быть числом, попробуйте ещё раз:&quot;);
            continue;
        }

        menuArray[itemCount] = itemName;
        sumArray[itemCount] = itemSum;
        itemCount++;

        if (itemCount &gt;= menuArray.length) {
            System.out.println(&quot;Достигнут предел товаров!&quot;);
            break; // Завершить цикл, если достигнут предел массива
        }
    }

    double totalSum = 0;
    for (int i = 0; i &lt; itemCount; i++) {
        totalSum += sumArray[i]; // Суммирование стоимости товаров
        System.out.println(&quot;Товар: &quot; + menuArray[i] + &quot;, Сумма: &quot; + sumArray[i]);
    }

    double dividedSum = totalSum / peopleNum;
    System.out.printf(&quot;Общая сумма: %.2f\n&quot;, totalSum);
    System.out.printf(&quot;Каждый человек должен заплатить: %.2f\n&quot;, dividedSum);
}

}

anonymus
  • 331