2013-05-14 47 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