Надеюсь, кто-нибудь сможет мне с этим помочь.
У меня сейчас онлайн-класс 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
Я повторяю то, что @AndyTurner утверждает выше. Также обратите внимание на этот отличный справочник: Как отлаживать небольшие программы
Спасибо тебе за это. Я посмотрю на это. Извините за сверхдлинный пост! Я постараюсь лучше в будущем.
Хочу кое-что добавить. @Josh попробуй написать элегантный код. Если вы можете что-то упростить, сделайте это. Нет причин создавать массивы так, как вы делаете, и это выглядит некрасиво. Вместо этого попробуйте сделать это так: int[] array = new int[8];
Кроме того, массивы основаны на 0, а не на 1, и беглый взгляд на ваш код показывает, что вы можете игнорировать это.




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;
}
Спасибо за помощь, хотя в будущем я попытаюсь отладить свою программу, так как я не знал, что это вообще возможно. Мой профессор НЕ учил меня, что я могу это делать.
Вы также можете указать, что вы можете использовать Integer.MAX_VALUE и MIN_VALUE вместо произвольных значений, таких как 999 и -999. И вы можете использовать Arrays.fill для помещения одного и того же значения в каждый элемент массива вместо явного цикла.
Проблема в 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);
Это много кода и ввода / вывода; не так много объяснений, почему это неправильно. Лучше всего использовать отладчик для пошагового выполнения кода.