Минимальное и максимальное значение

#java #max #minimum

Вопрос:

Я запустил этот код, все находит. maximumValue показывает правильный вывод, однако minValue в качестве вывода всегда отображается 0.

 Scanner sc = new Scanner(System.in);

int x= sc.nextInt();

int[] day =  new int[x];

int minValue = day[0]; 
int maxValue = day[0];

for (int i = 0; i < x; i  ) {
    day[i] = sc.nextInt();

    if (day[i] < minValue) minValue = day[i];
    if (day[i] > maxValue) maxValue = day[i];
}

System.out.println(minValue);
System.out.println(maxValue);
 

Ответ №1:

Почему это не работает

Вы читаете day[0] , прежде чем присваивать ему какое-либо значение.

Ваш код

 int[] day =  new int[x];                                 
int minValue = day[0]; 
int maxValue = day[0];
 

эквивалентно

 int[] day =  new int[x];                                 
int minValue = 0; 
int maxValue = 0;
 

Видишь https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.5:

Каждый… компонент массива инициализируется значением по умолчанию при его создании.

Для типа int значение по умолчанию равно нулю, то есть 0.

Ваш код работает max только случайно 🙂 Попробуйте ввести только отрицательные значения на вход, и вы max также дадите только 0 .

Как это исправить

Настоятельно рекомендуется разделить вычислительную часть от ввода/вывода. Java не может легко возвращать два значения из метода. Вы можете реализовать два отдельных метода, для max и min отдельно, или вы можете вернуть два значения в специально созданном объекте кортежа.

Часть ввода/вывода:

 final Scanner sc = new Scanner(System.in);

final int numberOfValues = sc.nextInt();
final int[] values =  new int[numberOfValues];
for (int i = 0; i < numberOfValues; i  ) {
    values[i] = sc.nextInt();
}

System.out.println(minValue(values));
System.out.println(maxValue(values));

 

И вычислительная часть (посмотрите на цикл для каждого https://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html):

 public int minValue(int[] array) {
    int min = Integer.MAX_VALUE;
    for (int value : array) {
        if (value < min) {
            min = value;
        }
    }
}
 

Аналогично maxValue() , теперь вы легко сделаете это самостоятельно.

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

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

Комментарии:

1. Кроме того, вы можете int minValue = Integer.MAX_VALUE исправить поведение кода

2. @Гюнтер …и int maxValue = Integer.MIN_VALUE 🙂

Ответ №2:

Ты можешь сделать это вот так.

 Scanner sc = new Scanner(System.in);

int x= sc.nextInt();
int[] day =  new int[x];

for (int i = 0; i < x; i  ) {
    day[i] = sc.nextInt();
}
int minValue = day[0]; 
int maxValue = day[0];

for (int i = 0; i < x; i  ) {
    if (day[i] < minValue) minValue = day[i];
    if (day[i] > maxValue) maxValue = day[i];
}

System.out.println(minValue);
System.out.println(maxValue);
    
 

Комментарии:

1. wahhhhhh приложение живет своей жизнью. everyoneeeeeee