Java 谓词方法yes/no/maybe响应

Java 谓词方法yes/no/maybe响应,java,Java,我试图编写一个程序,其中run方法调用一个谓词方法,询问某人“今晚想去看电影吗?”。如果用户对问题输入“是”,我希望程序说“好的,我们今晚走。”如果用户输入“否”,我希望程序打印“太酷了,下周走”。但是如果用户输入“也许”我希望程序说“这是一个是或否的问题”,然后再次问问题“你今晚想去看电影吗?”然后等待用户再次输入响应我遇到的问题是,如果用户输入“可能”,程序会说“这是一个肯定或否定的问题”,然后自动打印“那很好,下周就走。”我该如何修复程序中的错误逻辑?这是我书中关于参数传递的章节中的一个问

我试图编写一个程序,其中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"));
    }
}
这里有两件事:

  • 逻辑是错误的。如果输入是
    “可能”
    ,那么您的
    是是或否
    将打印出
    “这是一个是或不是的问题”
    ,但随后返回
    false
    ,这将提供额外的(有问题的)输出
    “太酷了,我们下周去吧”

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

  • 这里有两件事:

  • 逻辑是错误的。如果输入是
    “可能”
    ,那么您的
    是是或否
    将打印出
    “这是一个是或不是的问题”
    ,但随后返回
    ,这将提供额外的(有问题的)输出
    “太酷了,我们下周去吧”

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


  • 如果您想要的不是真/假,而是一组离散的值,我将使用枚举返回答案

    例如:

    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语句来实现这一点。

    如果您想要的不是真/假,而是一组离散的值,我将使用枚举返回答案

    例如:

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

    除了已经提供的建议外,
    isYesOrNo
    方法包含一个重大错误,这实际上是基本问题的答案:

    我遇到的问题是,如果用户输入“可能”,程序会说“这是一个肯定或否定的问题”,然后自动打印“那很好,我们下周走。”我如何修复程序中的错误逻辑

    如果响应为“可能”,则不等于“是”,返回值将为
    false
    ——这就是为什么它会立即打印“太酷了,我们下周去吧”。这实际上就是您为
    if(isYesOrNo(answer))
    提供的“else”条件

    目前,您正在检查响应是否为yes/no,启动
    while
    循环(如果不是yes/no,则运行该循环),过早地中断
    while
    循环,然后在首先产生
    while
    循环的条件之一上返回
    false
    (读取:not'yes'),最终被处理为“否”(情况可能并非如此)

    如果要使用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();
        }
    }
    

    除了已经提供的建议外,
    isYesOrNo
    方法还包含一个重大错误,这实际上是基本问题的答案:

    我遇到的问题是,如果用户输入“可能”,程序会说“这是一个肯定或否定的问题”,然后自动打印“那很好,我们下周走。”我如何修复程序中的错误逻辑

    如果响应为“可能”,则不等于“是”,返回值将为
    false
    ——这就是为什么它会立即打印“太酷了,我们下周去吧”。这实际上就是您为
    if(isYesOrNo(answer))
    提供的“else”条件

    目前,您正在检查响应是否为yes/no,启动
    while
    循环(如果不是yes/no,则运行该循环),过早地中断
    while
    循环,然后在首先产生
    while
    循环的条件之一上返回
    false
    (读取:not'yes'),最终被处理为“否”(情况可能并非如此)

    如果要使用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();
        }
    }
    

    如果我不使用break,程序将持续打印“这是一个是或否的问题”,并且不会停止。是的,因为您没有得到新的输入。您应该添加另一行以从
    readLine
    获取新的输入。在isYesorNo方法或run方法中添加另一行输入?它应该位于
    isYesorNo
    方法的循环中,但是是的,它是