Почему мой цикл выпрыгивает до того, как он посчитает последний номер? - PullRequest
0 голосов
/ 16 декабря 2018

Задача программы - взять целые числа от 1 до 100 и посчитать, сколько раз они встречаются.

Например, введенные пользователем числа: 1 2 2 3 3 25 25 67 98 99 99. Вывод будет:

1 occurs 1 time
2 occurs 2 times
3 occurs 2 times
25 occurs 2 times
67 occurs 1 time
98 occurs 1 time

Проблема

Хотя моя программа успешно посчитает большинство чисел, она не в состоянии сосчитать два 99-х, и если бы я заменил второй на последний 99 на 98, то результат был бы равен 98, но 2 раза это не произойдетсосчитать 99.

Я попытался отладить эту вещь, и я не должен говорить, что он не считает последние числа или числа в массиве, потому что это так, но он выпрыгивает прямо перед тем, как перейти кзаявления if-if.

Кажется, что он выпрыгивает из-за того, что первый оператор if является истинным, и поэтому ему не нужно переходить к другому, и он заканчивается циклом, но выяснение того, как заставить его по-прежнему печатать последнее число, сбивает с толкуя.

Вот код.Проблема заключается в методе LinearSearch ():

import java.util.Scanner;

public class Lab8 {

  public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    int usernumbers[] = new int[20];
    int size = usernumbers.length;

    System.out.println("Enter integers between 1 and 100, " + "enter a 0 to end ");

    // user populates the array usernumbers
    int i = 0;
    do {
      usernumbers[i] = input.nextInt();
    } while (usernumbers[i++] != 0);

    // invokes the method to sort the array
    arraySort(usernumbers);

    System.out.println(java.util.Arrays.toString(usernumbers));

    // this invokes the method to search the array for the numbers
    linearSearch(usernumbers);

    input.close();
  }

  public static void arraySort(int[] usernumbers) {
    // bubblesort for usernumbers[]
    int a = usernumbers.length;
    for (int i = 0; i < a - 1; i++) {
      for (int j = 0; j < a - i - 1; j++) {

        if (usernumbers[j] > usernumbers[j + 1]) {
          int temp = usernumbers[j];
          usernumbers[j] = usernumbers[j + 1];
          usernumbers[j + 1] = temp;
        }
      }
    }
  }

  public static void linearSearch(int[] usernumbers) {
    int compare = usernumbers[0];
    int count = 0;

    for (int i = 0; i < usernumbers.length; i++) {
      if (compare == usernumbers[i]) {
        count++;
      } else {
        if (count > 1 && compare != 0) {
          System.out.println(compare + " occurs " + count + " times");
        }

        if (count == 1 && compare != 0) {
          System.out.println(compare + " occurs " + count + " time");
        }

        count = 1;
        compare = usernumbers[i];
      }
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Проблема в том, что вы пропускаете итерацию последнего числа.

public class Job8 {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int usernumbers[] = new int[20];
        int size = usernumbers.length;

        System.out.println("Enter integers between 1 and 100, " + "enter a 0 to end ");

        // user populates the array usernumbers
        int i = 0;
        do {
            usernumbers[i] = input.nextInt();
        } while (usernumbers[i++] != 0);

        // invokes the method to sort the array
        arraySort(usernumbers);

        System.out.println(java.util.Arrays.toString(usernumbers));

        // this invokes the method to search the array for the numbers
        linearSearch(usernumbers);

        input.close();
    }

    public static void arraySort(int[] usernumbers) {
        // bubblesort for usernumbers[]
        int a = usernumbers.length;
        for (int i = 0; i < a - 1; i++) {
            for (int j = 0; j < a - i - 1; j++) {

                if (usernumbers[j] > usernumbers[j + 1]) {
                    int temp = usernumbers[j];
                    usernumbers[j] = usernumbers[j + 1];
                    usernumbers[j + 1] = temp;
                }
            }
        }
    }

    public static void linearSearch(int[] usernumbers) {
        int count = 0;
        int currentNumber = 0;
        for (int i = 0; i < usernumbers.length; i++) {
            int nextIndex = i + 1;
            currentNumber = usernumbers[i];

            if (currentNumber == 0) {
                continue;
            }

            if (nextIndex < usernumbers.length) {
                int nextNumber = usernumbers[nextIndex];
                if (currentNumber == nextNumber) {
                    count++;
                    continue;
                } else {
                    if (count == 0) {
                        System.out.println(currentNumber + " occurs once");
                    } else {
                        System.out.println(currentNumber + " occurs " + count + " times");
                        count = 0;
                    }
                }
            }
        }

        System.out.println(+currentNumber + " occurs " + (count + 1) + " times");
    }
}
0 голосов
/ 16 декабря 2018

Добро пожаловать на SO.

Боюсь, вы полностью неправильно прочитали проблему в своем коде.Проблема в том, что когда вы сортируете массив, он перемещает все нулевые значения вперед.Когда вы приходите печатать вхождения в linearSearch, вы предполагаете, что есть конечные нули, чтобы принудительно напечатать окончательное значение.Это должно быть относительно легко исправить, но если вы хотите подсказку, задайте мне вопрос в комментариях.

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