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

true/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の場合、yesOrNotrueに設定されないため、条件がチェックされたときにwhileループが再度実行されます。

メソッドはreadAnswerプライベートな静的ヘルパー メソッドであり、入力文字列に基づいて正しい列挙値を返す必要があります。これは、文字列に対して if/else または switch ステートメントを使用して行います。

于 2013-05-14T01:37:39.687 に答える
1

ここで 2 つのこと:

  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。これが、すぐに「それはいいですね、来週行きましょう」と出力する理由です。それは実際には、あなたが提供した 'else' 条件ですif(isYesOrNo(answer))

現状では、応答が yes/no かどうかを確認し、yes/no でwhileない場合に実行されるループを開始し、途中でループを中断し、ループを生成した条件の 1 つにwhile戻ります。最初の場所 (読み取り: 「はい」ではありません)。これは最終的に「いいえ」として処理されます (そうではない可能性があります)。falsewhile

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 に答える