Как выйти из цикла с номером 0?но теперь у меня есть другие проблемы - PullRequest
0 голосов
/ 25 сентября 2010
package hw3;

public class Main {
    public static void main(String[] args) {
        final int NumberOfElements = 1000;
        int[] num = new int[NumberOfElements];
        int var = 0;
        //create input
        java.util.Scanner input = new java.util.Scanner(System.in);
        for (int i = 0; i < NumberOfElements; i++) {
            System.out.print("Enter any positive number or enter 0 to stop: ");
            num[i] = input.nextInt();
            var++; 
            if (num[i] == 0)

                break;

            }
             Arrays.sort( num, 0, var);
             int i;
             for (i = 0; i < var; i++) {
             System.out.print("   " + num[i]);


        }
    }
}

Напишите программу на Java, читающую последовательность положительных целых чисел, введенных по одному в строке Программа прекращает чтение, когда вводится целое число «0». Программа отсортирует и выведет их в порядке возрастания номеров. Например: 5 1 7 12 36 8 0 Выход: 1 5 7 8 12 36

Ответы [ 3 ]

1 голос
/ 25 сентября 2010

Попытайтесь понять проблему: есть три шага.
Шаг 1: Получите информацию от пользователя. Продолжайте получать ввод, пока пользователь не введет 0
Шаг 2: Сортировка
Шаг 3: Распечатайте результаты

Шаг 1: Ваша for петля почти правильная.
Но цикл for должен заканчиваться сразу же после того, как вы получили ввод.
В следующем коде

   num[i] = input.nextInt();
   var++; 
   if (num[i] == 0)
      break;

вы добавляете пользовательский ввод в массив и затем проверяете, является ли он 0. Это означает, что 0 также будет частью вашего массива. Если вы не хотите этого, вы должны проверить входные данные и добавить их в массив, только если это не 0.

Также обратите внимание на объявление i перед циклом for. Потому что нам это нужно после цикла for. Зачем? см. ниже.

int i = 0; 
for (i = 0; i < NumberOfElements; i++) {
   int n = input.nextInt();
    if (n == 0)
       break;
    else
       num[i] = n;
} //for loop ends here

Шаг 2: Сортировать
Arrays.sort(num);

Шаг 3: Распечатать вывод:

for (i = 0; i < num.length; i++) {
      System.out.print("  " + num[i]);
   }

Проблема заключается в том, что на шаге 2 сортируется массив из 1000 элементов, в то время как вам нужно учитывать только количество элементов, введенных пользователем. Вы не знаете, что изначально именно поэтому вы создали массив из 1000 элементов. Но в этот момент (после шага 2) вы do знаете, сколько элементов введено пользователем. Это присутствует в i

Итак, новый шаг между 1 и 2: создайте новые массивы, содержащие только те элементы, которые введены пользователем.
Шаг 1.5:

int[] newArray = Arrays.copyOf(num, i);

Теперь отсортируйте этот новый массив и напечатайте его (так же, как ваш код, но использует только что созданный массив)

Arrays.sort(newArray);

for (i = 0; i < newArray.length; i++) {
      System.out.print("  " + newArray[i]);
   }

Примечания:
1. Идеальный способ сделать это - использовать списки, а не массивы, но, вероятно, поскольку это домашнее задание, вы можете иметь для использования массивов.

  1. Поскольку это домашняя работа, я не знаю, разрешено ли вам использовать Arrays.sort или Arrays.copy. Ваш профессор может нахмуриться из-за этого, потому что, возможно, он намеревался изучать конструкции языка через for, if и while. В этом случае вам нужно выполнить шаг 1.5 (сделать массив нужного размера) и выполнить сортировку самостоятельно.
    Это не сложно (но просто помните, что это не лучший способ сделать это, кроме домашней работы)

Копировать массив (самодельный) (вместо шага 1.4 выше)

int[] newArray = new int[i]
for(int j=0; j<i; j++){
   newArray[j] = num[j];
}

Сортировка (домашняя) (вместо шага 2 выше):

  1. Перебрать элементы
  2. Если один элемент больше, чем предыдущий элемент, swap их (в порядке возрастания, элемент prev всегда меньше или равен следующему элементу)

Есть два цикла, потому что вы должны выполнять сравнение на непрерывной основе: первый элемент, сравнить со всем массивом, поместить его в правильное положение, взять второй сравнить со всем массивом и т. Д ...)

  for(int j=0; j<newArray.length; j++) {
      for(int k=0; k<newArray.length; k++) {
         if(newArray[k] > newArray[j]) { 
            //the swap logic:
            int t = newArray[k];
            newArray[k] = newArray[j];
            newArray[j] = t;
         }
      }
   }

Попытайтесь понять, что на самом деле происходит, вместо того, чтобы просто копировать вставку. Когда вы поймете логику самодельной сортировки, подумайте об этом: Второй цикл for в виде or(int k=0; k<newArray.length; k++) { может быть просто for(int k=0; k<newArray.length; k++) {. Почему?

Ваш цикл печати останется таким, каким вы его написали, но вы будете печатать newArray вместо num. Возможно, вы захотите изменить переменную цикла на int j или что-то еще, но i также будет работать. (i содержит количество входов сейчас, поэтому я бы не стал использовать его для каких-либо других целей. Но это просто способ кодирования. Технически нет разницы - код будет работать так же)

Я не объединяю части. Я оставлю это тебе, иначе будет похоже, что я сделал твою домашнюю работу: -)

0 голосов
/ 25 сентября 2010

num[i] содержит последнее число, которое вы читаете.Таким образом, вы должны сравнить его с 0, и если оно равно 0, вы должны закончить цикл.Прочитайте о операторах ветвления , чтобы узнать, как это сделать.

Возможно, вам также полезно прочитать о операторах управления потоком в целом.

0 голосов
/ 25 сентября 2010

Здесь ваше приложение читает int, вы можете проверить, что последним является! = Из 0. И break цикл.
Если вам не нравится использовать break, вы все равно можете добавить условие в for.

Для сортировки массива существует решение Arrays.sort().

И для их печати вам понадобится еще один цикл, но будьте осторожны, поскольку в вашем массиве может быть менее 1000 элементов, вы не можете просто напечатать весь массив.
Вам нужно будет найти способ подсчитать количество элементов, которые вы добавили в массив.


После редактирования:

Хорошо, ваше приложение работает, вот что я получил:

Мак-Макхдын: ~ Макхдын $ java hw3.Main
Введите любой положительный номер или введите 0, чтобы остановить: 1
Введите любой положительный номер или введите 0, чтобы остановить: 2
Введите любой положительный номер или введите 0, чтобы остановить: 3
Введите любой положительный номер или введите 0, чтобы остановить: 4
Введите любой положительный номер или введите 0, чтобы остановить: 5
Введите любой положительный номер или введите 0 для остановки: 0
Мак-Макхдын: ~ Макхдын $

0, которое вы имеете, должно быть откуда-то еще. Разве ваш фактический код немного отличается от того, который вы опубликовали здесь?


Ресурсы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...