0

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

3 回答 3

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 语句来执行此操作。

于 2013-05-14T01:37:39.687 回答
1

这里有两件事:

  1. 逻辑是错误的。如果输入是"maybe",那么您isYesOrNo将打印出来"it's a yes or no question",然后返回false,这会给出额外的(有问题的)输出""that's cool let's go next week"

  2. break循环中没有意义,这是真正的问题。除非满足条件,否则循环应该继续,它应该在第一次执行循环时中断。

于 2013-05-14T01:22:54.020 回答
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();
    }
}
于 2013-05-14T23:33:26.033 回答