Почему мой цикл пропускает это условие? - PullRequest
0 голосов
/ 23 февраля 2010

Время для моего ежедневного вопроса о новичке на Java :-D

Я не должен правильно понимать условия в цикле while.

У меня есть это:

while (true){

     if (){
       ...
     } else {
       ...
     }
     if (){
       ...
     } else {
       ...
     }
     if (SENTINEL){
       break;
     }
 }

Первый оператор if / else работает, а часовой работает, но второй оператор if пропускается. Если я переверну первый и второй оператор if, то первый оператор if по-прежнему всегда выполняется и пропускает второй. Чего мне не хватает?

Могу ли я иметь два оператора if / else в одном блоке, как этот?

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

public class FindRange extends ConsoleProgram {

    private static final int SENTINEL = 0;

    int value = 0;
    int highNumber = 0;
    int latestValue = 0;
    int lowNumber = 0;

    public void run() {         
        addNumbers();
    }

    private void addNumbers(){

        value = readInt("Enter number:");

        while(true){
            if (value == SENTINEL){
                break;
            }
            latestValue = readInt("Enter number:");
            getHighNumber();
            getLowNumber();         
            if (latestValue == SENTINEL){
                break;
            }
        }

        println("High Number is "+highNumber+".");
        println("Low Number is "+lowNumber+".");
    }

    private void getHighNumber(){
        if (latestValue >= value){
            highNumber = latestValue;
        }else {
            highNumber = value;
        }

    }
    private void getLowNumber(){
        if (latestValue <= value){
            lowNumber = latestValue;
        }else {
            lowNumber = value;
        }
    }
}

Ответы [ 4 ]

2 голосов
/ 23 февраля 2010

Вы пытаетесь найти минимум и максимум серии чисел? Если это так, вы обязательно должны использовать Math.min() и Math.max(). Это намного понятнее, и вы можете покончить с утверждениями if. Также достаточно просто сделать это в цикле с локальными переменными вместо полей.

Общая идиома примерно такая:

minValue = Math.min(minValue, candidateValue);
maxValue = Math.max(maxValue, candidatevalue);
1 голос
/ 23 февраля 2010

Возможно, что поведение, которое вы видите, проистекает из того факта, что вы всегда сравниваете последнее значение с начальным значением. Начальное значение никогда не изменится - поэтому, если вы введете следующие данные:

20, 60, 50

полученное максимальное значение будет равно 50. Это потому, что 50 - это самое последнее значение, которое будет больше 20. Я думаю, вы, вероятно, хотите сравнить последнее значение с высоким значением, не так ли?

1 голос
/ 23 февраля 2010

Вы можете определенно иметь 2 блока if / else внутри цикла; однако, если ваш страж получит удар, цикл закроется.

Поможет размещение всего блока.


Что произойдет (после прочтения опубликованного кода), когда любое новое значение, введенное вами в цикле, будет больше исходного значения, а lowNumber вернется к исходному. Так, например, если ваш ввод: 7 6 5 8 Ваши соответствующие низкие цифры будут: 7 6 5 7 Что неверно. Что вы могли бы сделать, так это скомпоновать переменную «value», установить низкое и высокое значения в исходное значение, а затем сравнить последние с низкими и высокими в методах get *.

0 голосов
/ 23 февраля 2010

Разве вы не должны устанавливать value = latestValue в нижней части цикла while?

Значение никогда не обновляется после первоначального чтения ... может быть что-то вроде этого:

public class FindRange extends ConsoleProgram {

    private static final int SENTINEL = 0;

    public void run() {         
        addNumbers();
    }

    private void addNumbers() {

        int value = 0;
        // Set this to highest possible value
        int highNumber = Integer.MIN_VALUE;
        // Set this to lowest possible value
        int lowNumber = Integer.MAX_VALUE;

        while (true) {

            value = readInt("Enter number:");
            if (value == SENTINEL)
                break;

            lowNumber = Math.min(lowNumber, value);
            highNumber = Math.max(highNumber, value);
        }

        println("High Number is " + Integer.toString(highNumber) + ".");
        println("Low Number is " + Integer.toString(lowNumber) + ".");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...