Почему мое время l oop все еще работает, даже если условие ложно? - PullRequest
1 голос
/ 14 февраля 2020

Я хочу создать тест, который выдает сообщение об ошибке, что ответ недействителен, если пользовательский ввод (переменная ответа) не равен «A», «B», «C», «D» или «E», а затем снова задает вопрос для нового ввода. Даже когда ответ равен «A», «B», «C», «D» или «E», l oop все еще работает, и у меня возникают проблемы с выяснением причины. Любая помощь будет принята с благодарностью. Большое спасибо.

import javax.swing.JOptionPane;
public class Quiz {
    static String ask(String Question) {
        String answer = JOptionPane.showInputDialog(Question);
        answer = answer.toUpperCase();
        while (!answer.equals("A") || !answer.equals("B") || !answer.equals("C") || 
!answer.equals("D") || !answer.equals("E")) {
            JOptionPane.showMessageDialog(null,"Invalid answer. Please enter A, B, C, D, or E.");
            Quiz.ask(Question);
        }
    return answer;
}

public static void main(String[] args) {
    String question = "What is a user defined blueprint from which objects are created in Java?\n";
    question += "A. Method\n";
    question += "B. Variable\n";
    question += "C. Class\n";
    question += "D. Loop\n";
    question += "E. Array";
    Quiz.ask(question);
    }
}

Ответы [ 3 ]

2 голосов
/ 14 февраля 2020

У вас две проблемы.

Во-первых, ваше состояние неверно. Если вы хотите проверить, что ответом является любое из допустимых значений, то ваше условие должно быть одним из:

!answer.equals("A") && !answer.equals("B") 
    && !answer.equals("C") && !answer.equals("D")
    && !answer.equals("E")

и

!(answer.equals("A") || answer.equals("B") 
    || answer.equals("C") || answer.equals("D")
    || answer.equals("E"))

См. Ответ Мэтью для объяснения.

Во-вторых, вы набираете Quiz.ask(Question) рекурсивно, что заставляет ваш l oop продолжать работать с неверными ответами, даже если пользователь вводит правильный ответ при последующем вызове (пожалуйста, прочитайте и понять, как работают рекурсивные вызовы - особенно, как управляются локальные переменные). Исправление для этого было бы делать пока l oop (есть другие способы сделать это), как в:

String answer;
boolean invalid = false;
do {
    if(invalid) {
        JOptionPane.showMessageDialog(null,
                "Invalid answer. Please enter A, B, C, D, or E.");
    }

    answer = JOptionPane.showInputDialog(Question);
    answer = answer.toUpperCase();
    invalid = !(answer.equals("A") || answer.equals("B") 
               || answer.equals("C") || answer.equals("D")
               || answer.equals("E"));
} while (invalid);
    return answer;
2 голосов
/ 14 февраля 2020

Not A или Not B или Not C или Not D или Not E логически эквивалентны A и B и C и D и E. (Закон ДеМоргана) Вы хотите Not A и не B и Not C а не D и не C

0 голосов
/ 14 февраля 2020
  • " Пока L oop" продолжается до тех пор, пока условие оценивается как истинное.
  • "||" ( ИЛИ логический оператор ) возвращает false только в том случае, если все утверждения ложны, например: false || false = false

Если в вашем коде пользователь выберет B, например, первая оценка !answer.equals("A") сломает то, что вы хотите, возвращая true и игнорируя другие операторы.

Измените «while l oop», чтобы правильно оценить свое состояние по своему желанию (продолжайте спрашивать, пока ответ не будет отличаться от «A», «B», «C», «D» или "Е"). Итак, express именно так:

while ( !( answer.equals("A") || answer.equals("B") || answer.equals("C") || answer.equals("D") || answer.equals("E") ) ){
   ...
}

Обратите внимание на "!" (НЕ логический оператор) и использование скобок , это важно для его работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...