谓词方法是/否/可能是响应

时间:2013-05-14 01:20:46

标签: java

我正在尝试编写一个程序,其中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"));
    }
}

3 个答案:

答案 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)

这里有两件事:

  1. 逻辑错误。如果输入为"maybe",则您的isYesOrNo将打印出"it's a yes or no question",但随后会返回false,这会产生额外的(有问题的)输出""that's cool let's go next week"。< / p>

  2. 循环中的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();
    }
}