way245 Ответов: 2

Что это за случайные 0 и почему мое среднее не работает?


<pre>scan = new Scanner(System.in);
        try {
            System.out.print("Please enter the filename for the integer values: ");
            File file = new File(scan.nextLine());
            scan = new Scanner(file);
            System.out.println("Integer Array Contents: ");
            String del = "";
            int totalOdd = 0;
            int lastZero = -1;
            int minimum = Integer.MAX_VALUE;
            int maximum = Integer.MIN_VALUE;
            int sum = 0;
            double mean;
            int totalIndex = 0;
            int[] oddNumbers = new int[15];
            int arrayIndex = 0;
            while (scan.hasNextLine()) {
                int num = Integer.parseInt(scan.next()); //parse the number into an integer.
                System.out.print(del + num);
                del = ", ";
                if (num%2!= 0) { //it's odd
                    oddNumbers[arrayIndex] = num; //you have to use the arrayIndex variable here
                    arrayIndex++;
                    totalOdd++; //technically we could combine these vars if we wanted
                }
                if (num == 0) {
                    lastZero= totalIndex;
                }
               
                if (num < minimum) {
                    minimum = num;
                }
               
                if (num > maximum) {
                    maximum = num;
                }
                sum += num;
                totalIndex++;
            }
           
            mean = sum/totalIndex;
            System.out.println();
            System.out.println("Total odd numbers: " + totalOdd);
            System.out.print("Odd numbers are: ");
            for (int i = 0; i < totalIndex; i++) {
                System.out.print(oddNumbers[i] + " ");
            }
           
            System.out.println();
            System.out.println("Index of last zero: " + lastZero);
            System.out.println("Minimum: " + minimum);  
            System.out.println("Maximum: " + maximum);
            System.out.println("Sum: " + sum);
            System.out.println("Element mean is: " + mean);
            scan.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}



Мой выход:

Integer Array Contents: 
-3, 2, 0, 0, 1, -5
Total odd numbers: 3
Odd numbers are: -3 1 -5 0 0 0 
Index of last zero: 3
Minimum: -5
Maximum: 2
Sum: -5
Element mean is: 0.0


Почему эти 3 0 находятся в разделе "нечетные числа:" и как мне избавиться от них, чтобы просто показать другие числа.
Почему это средство не работает? Среднее значение должно быть: -0,833

Что я уже пробовал:

Первоначально у меня было много проблем с форматированием, min и max, но теперь это то, что я делаю, и не могу понять, что я делаю неправильно.

ZurdoDev

Просто отладьте свой код и пройдитесь по нему строка за строкой, и вы сможете точно увидеть, что происходит.

way245

Я сделал. Вот почему я здесь.

ZurdoDev

Вы спросили, почему появляются 0. Отладьте свой код и посмотрите, что происходит в каждой строке. Вы поймете, почему он делает то, что делает.

way245

Ошибок в коде нет, так что отладчик мне не помогает. Я знаю,что это связано с моей петлей for. У вас есть какие-нибудь идеи?

ZurdoDev

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

way245

Я понимаю, что происходит, просто не понимаю, как я это исправлю. Который является, почему я пришел сюда.

ZurdoDev

Тогда почему он печатает 0s? Если вы знаете, почему, то вы можете это исправить.

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

И тот факт, что вы продолжаете отвечать, говорит мне, что вы все еще не отладили код.

Dave Kreskowiak

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

Rick York

При вычислении среднего значения, вероятно, было бы лучше сначала вычислить сумму всех переменных, а затем разделить на количество после того, как вы суммировали все значения.

2 Ответов

Рейтинг:
2

Patrice T

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

Отладчик-Википедия, свободная энциклопедия[^]
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
2

OriginalGriff

Это довольно просто: totalIndex подсчитывает каждую прочитанную строку, totalOdd подсчитывает количество нечетных чисел, которые вы найдете.
А потом вы печатаете нечетные числа, используя неправильный номер:

System.out.print("Odd numbers are: ");
for (int i = 0; i < totalIndex; i++) {
    System.out.print(oddNumbers[i] + " ");
}
Изменить totalIndex к totalOdd и ваши ложные нули исчезнут.
А что ты имеешь в виду? Это целочисленное деление для вас!
Ваша сумма равна -3 + 2 + 0 + 0 + 1 - 5 == -5, а число элементов-6. В целочисленном делении -5 / 6 равно 0.
Измените свою сумму на двойную, и это должно сработать.


Rick York

Сумма не обязательно должна быть изменена на двойную,но деление определенно должно быть сделано с двумя двойными.

OriginalGriff

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