2013-05-14 43 views
0

我正试图编写一个程序,其中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

除了已经提供的建议,该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(); 
    } 
} 
1

这里包括两个:

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

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

+0

如果我不使用破解程序会连续打印“这是一个yes或no的问题”,它不会停止。 – 2013-05-14 01:26:05

+0

是的,因为你没有得到新的输入。您应该添加另一行以从'readLine'获取新输入。 – 2013-05-14 01:28:43

+0

在isYesorNo方法内还是在运行方法中添加另一个输入行? – 2013-05-14 01:31:16

2

如果你想要的东西不是true/false,但仍然是一组离散的值,我会使用enum来返回答案。

例如:

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

您可以用默认值替换MAYBE案例。这样,如果他们输入除yes或no以外的任何内容,他们将得到另一个第三个响应 – datguy 2013-05-14 01:51:58

+0

@datguy好电话现在编辑它。使用默认意味着它将在没有枚举的情况下使用true/false。 – adamjmarkham 2013-05-14 02:02:38

+0

将'readLine'更改为'readAnswer',如果它返回一个答案,在这种情况下似乎更有意义。 – adamjmarkham 2013-05-14 21:50:52