Java присваивает массиву неправильный номер

Надеюсь, кто-нибудь сможет мне с этим помочь.

У меня сейчас онлайн-класс Java OOP, и я почти выполнил это задание, но столкнулся с проблемой, и профессор не отвечает на мои электронные письма.

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

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

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

Заранее спасибо.

package dow.with.arrays;

import java.util.Arrays;

public class DOWWithArrays
{

    public static void main(String[] args)
    { //start
        InputFile inFile = new InputFile("input.txt");
        OutputFile outFile = new OutputFile("output.txt");

        //INITILIZATION
        int day = 0;
        int temp = 0;
        int[] high = new int[8];         //declares an array of integers for high temps
        int[] low  = new int[8];          //declares an array of integers for low temps
        int[] count = new int[8];        //declares an array of integers for counting days
        int[] total = new int[8];        //declares an array of integers for total temp

        for (day = 0; day < 8; day++) //initilization for the arrays
        {
            high[day] = -999;
            low[day] = 999;
            count[day] = 0;
            total[day] = 0;
        }

        //tells user the DOW Temp program is starting
        System.out.println("DOW Temperature Started. Please wait...");

        System.out.println(Arrays.toString(high)); //GET RID OF THIS BEFORE TURN IN
        System.out.println(Arrays.toString(low)); //GET RID OF THIS BEFORE TURN IN
        System.out.println(Arrays.toString(count)); //GET RID OF THIS BEFORE TURN IN
        System.out.println(Arrays.toString(total)); //GET RID OF THIS BEFORE TURN IN

        while (!inFile.eof())
        { //not the end of file
            day = inFile.readInt(); //read first int
            temp = inFile.readInt(); //read second int

            if (temp > high[day]) //assigns the current highest temperature
            {                     //into the correct place in the high array
                high[day] = temp;
            } else if (temp < low[day])//assigns the current lowest temperature
            {                        //into the correct place in the low array
                low[day] = temp;
            }
            count[day]++; //counts how many temps there are in the specific day
            total[day] = total[day] + temp; //calculates the total temp for each day

        } //now end of file

        for (day = 1; day < 8; day++)
        {
            outFile.writeInt(day);  //write day #
            outFile.writeInt(high[day]);  //write high temp for that day
            outFile.writeInt(low[day]); //write low temp for that day
            outFile.writeInt(total[day] / count[day]); //write average temp for that day
            outFile.writeEOL();   //write end of line
            System.out.println(day);
        } //for

        System.out.println(Arrays.toString(high)); //GET RID OF THIS BEFORE TURN IN
        System.out.println(Arrays.toString(low)); //GET RID OF THIS BEFORE TURN IN
        System.out.println(Arrays.toString(count)); //GET RID OF THIS BEFORE TURN IN
        System.out.println(Arrays.toString(total)); //GET RID OF THIS BEFORE TURN IN

        outFile.close();
        System.out.println("DOW Temperature Completed Sucessfully.");
    } //stop

} //end DOW With Arrays

ПЕРЕД:

[-999, -999, -999, -999, -999, -999, -999, -999]
[999, 999, 999, 999, 999, 999, 999, 999]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]`

ПОСЛЕ:

[-999, 62, 56, 70, 61, 59, 77, 55] 
[999, 55, 999, 63, 59, 999, 999, 999] 
[0, 2, 2, 3, 2, 2, 1, 1] 
[0, 117, 110, 200, 120, 108, 77, 55]

ФАЙЛ ДО:

1 62
1 55
2 54
2 56
3 67
3 70
3 63
4 61
4 59
5 49
5 59
6 77
7 55

ФАЙЛ ПОСЛЕ:

1 62 55 58 
2 56 999 55 
3 70 63 66 
4 61 59 60 
5 59 999 54 
6 77 999 77 
7 55 999 55

Это много кода и ввода / вывода; не так много объяснений, почему это неправильно. Лучше всего использовать отладчик для пошагового выполнения кода.

Andy Turner 04.08.2018 21:15

Я повторяю то, что @AndyTurner утверждает выше. Также обратите внимание на этот отличный справочник: Как отлаживать небольшие программы

Hovercraft Full Of Eels 04.08.2018 21:16

Спасибо тебе за это. Я посмотрю на это. Извините за сверхдлинный пост! Я постараюсь лучше в будущем.

Josh 04.08.2018 21:16

Хочу кое-что добавить. @Josh попробуй написать элегантный код. Если вы можете что-то упростить, сделайте это. Нет причин создавать массивы так, как вы делаете, и это выглядит некрасиво. Вместо этого попробуйте сделать это так: int[] array = new int[8];

Soutzikevich 04.08.2018 21:19

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

Hovercraft Full Of Eels 04.08.2018 21:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
96
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

If - Else if ... если выражение if - true, else if игнорируется. Думаю, ошибка здесь:

if (temp > high[day]) //assigns the current highest temperature
{                     //into the correct place in the high array
    high[day] = temp;
} else if (temp < low[day])//assigns the current lowest temperature
{                        //into the correct place in the low array
            low[day] = temp;
}

попробуйте удалить else:

if (temp > high[day]) //assigns the current highest temperature
{                     //into the correct place in the high array
    high[day] = temp;
}

if (temp < low[day])//assigns the current lowest temperature
{                        //into the correct place in the low array
            low[day] = temp;
}

Спасибо за помощь, хотя в будущем я попытаюсь отладить свою программу, так как я не знал, что это вообще возможно. Мой профессор НЕ учил меня, что я могу это делать.

Josh 04.08.2018 21:25

Вы также можете указать, что вы можете использовать Integer.MAX_VALUE и MIN_VALUE вместо произвольных значений, таких как 999 и -999. И вы можете использовать Arrays.fill для помещения одного и того же значения в каждый элемент массива вместо явного цикла.

Andy Turner 04.08.2018 21:25

Проблема в else; убери это:

if (temp > high[day]) {
    high[day] = temp;
}

if (temp < low[day]) {
    low[day] = temp;
}

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

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

if (temp > high[day]) //assigns the current highest temperature
{                     //into the correct place in the high array
    high[day] = temp;
} else if (temp < low[day])//assigns the current lowest temperature
{                        //into the correct place in the low array
    low[day] = temp;
}

Должно быть:

if (temp > high[day]) //assigns the current highest temperature
{                     //into the correct place in the high array
    high[day] = temp;
}

if (temp < low[day])//assigns the current lowest temperature
{                        //into the correct place in the low array
    low[day] = temp;
}

Вы могли бы понять это сами, если бы вы просто следили за потоком кода в своей голове или, лучше, с помощью отладчика, для первого случая, когда поведение было неправильным, день номер 2. Или более простой, день номер 7.

Кроме того, специально для этой части кода изучите функции Math.min / Math.max и, возможно, Integer.MIN_VALUE / Integer.MAX_VALUE и +=.

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

У вас уже есть ответ от Фриги; Я просто хотел указать на некоторые альтернативы.

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

Вы можете обнаружить это явно, посмотрев на count в течение дня: если он равен нулю, обновите оба:

if (count[day] == 0) {
  low[day] = high[day] = temp;
} else if (temp > high[day]) {
  high[day] = temp;
} else if (temp < low[day]) {
  low[day] = temp;
}

В качестве альтернативы вы можете просто использовать min и max и никаких (явных) условий:

high[day] = Math.max(high[day], temp);
low[day] = Math.min(low[day], temp);

Другие вопросы по теме