我想创建一个测验,给出一个错误消息,如果用户输入的(答案变量)不等于“ A”,“ B”,“ C”,“ D”或“ E”,则该答案无效”,然后再次询问该问题以寻求新的输入。即使答案确实等于“ A”,“ B”,“ C”,“ D”或“ E”,while循环仍会运行,并且我很难弄清原因。任何帮助将不胜感激。非常感谢。
zIndex
答案 0 :(得分:2)
不是A或不是B或不是C或不是D或不是E在逻辑上等效于A和B以及C以及D和E。(德摩根定律)您要不是A和Not B而不是C和Not D和Not C
答案 1 :(得分:2)
您有两个问题。
首先,您的情况不正确。如果要检查答案是否为允许的任何值,则您的条件应为以下任意一种:
!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"))
有关说明,请参见Matthew's answer。
第二,您递归地调用Quiz.ask(Question)
,即使用户在随后的调用中提供了正确的答案,也使循环继续在无效的答案上运行(请继续阅读并了解递归调用的工作方式-特别是如何管理局部变量)。
解决此问题的方法是在执行循环时(还有其他方法可以做到),如:
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 :(得分:0)
例如,在您的代码中,如果用户选择B,则第一个评估!answer.equals("A")
会破坏您想要的内容,返回 true 并忽略其他语句。
更改“ while循环”以根据您的需要正确评估您的状况(不断询问直到答案与“ A”或“ B”或“ C”或“ D”或“ E”不同)。因此,请准确表达:
while ( !( answer.equals("A") || answer.equals("B") || answer.equals("C") || answer.equals("D") || answer.equals("E") ) ){
...
}
请注意“!” (不是逻辑运算符),并且使用括号,这对于它的正常运行至关重要。