我正在尝试编写一个程序,其中run方法调用谓词方法,询问某人“你今晚想去看电影吗?”。如果用户对问题输入“是”,我希望程序说“好的。让我们今晚去吧”。如果用户输入“否”,我希望程序打印“下周可以下载。”但是,如果用户输入“可能”,我希望我的程序说“这是一个是或否是问题”然后再问一个问题“你想今晚去看电影吗?”然后等待用户进入再次回应。
我遇到的问题是,如果用户输入“可能”程序说“这是一个是或否是问题”,那么自动打印“下周就可以了。”我如何修复程序中的错误逻辑?这是本书中关于参数传递的章节中的一个问题。我是否正确地设计了我的程序,以便将run字符串中的字符串值传递给isYesorNo方法,以便我编写什么内容?
import acm.program.*;
public class MoviesTonight extends ConsoleProgram {
public void run() {
String answer = readLine("do you want to go to a movie tonight?");
if (isYesorNo(answer)) {
println("Ok. Let's go tonight");
} else
println("that's cool let's go next week");
}
private boolean isYesorNo(String response) {
while (!response.equals("yes") && !response.equals("no")) {
println("it's a yes or no question");
break;
}
return (response.equals("yes"));
}
}
答案 0 :(得分:2)
如果你想要的不是真/假,我会使用枚举来返回答案,但仍然是一组离散的值。
例如:
enum Answer {
YES,
NO,
MAYBE
}
然后打开枚举而不是if / else(降低到个人喜好,我认为switch语句更干净),将所有内容置于while循环中:
boolean yesOrNo = false;
while (!yesOrNo) {
Answer answer = readAnswer("do you want to go to a movie tonight?");
switch (answer) {
case ANSWER.YES:
println("Ok. Let's go tonight");
yesOrNo = true;
break;
case ANSWER.NO:
println("that's cool let's go next week");
yesOrNo = true;
break;
default:
println("it's a yes or no question");
break;
}
}
所以基本上如果答案是MAYBE,yesOrNo
没有设置为true,所以在检查条件时再次执行while循环。
readAnswer
方法应该是私有静态助手方法,并根据输入字符串返回正确的枚举值。要么通过在字符串上使用if / else或switch语句来执行此操作。
答案 1 :(得分:1)
这里有两件事:
逻辑错误。如果输入为"maybe"
,则您的isYesOrNo
将打印出"it's a yes or no question"
,但随后会返回false
,这会产生额外的(有问题的)输出""that's cool let's go next week"
。< / p>
循环中的break
没有意义,这是真正的问题。循环应该继续,除非条件满足,它应该在循环的第一次执行时中断。
答案 2 :(得分:0)
除了已提供的建议外,isYesOrNo
方法还包含重大错误,实际上是您的基本问题的答案:
我遇到的问题是,如果用户输入“可能”程序说“这是一个是或否是问题”,那么会自动打印“下周就可以了。”如何在我的程序中修复这个不正确的逻辑?
return (response.equals("yes"));
如果回答是'可能',那么它不等于'是',并且返回将是false
- 这就是为什么它会立即打印出来,“这很酷,让我们下周去吧”。这实际上是您为if(isYesOrNo(answer))
提供的“其他”条件。
目前,您正在检查响应是否为是,启动while
循环,如果不是/否则运行,过早地中断while
循环,然后在第一个产生false
循环的条件之一上返回while
(读:不是'是'),最终被处理为'否'(可能不是情况)。
如果您想使用if-else:
,请尝试以下内容public void askQuestion(){
String response = readline("Do you want to go to a movie tonight?");
getYesNoResponse(response);
}
public void getYesNoResponse(String answer){
if (answer.equals("yes"){
//print the yes response
} else if (answer.equals("no") {
//print the no response
} else {
askQuestion();
}
}