2014-10-17 212 views
3

請注意,儘管我對Java很滿意,但我並不是特別有天賦,也不知道所有術語,因此請用非常小的編碼術語和普通英語解釋您的答案,或者在使用它之後解釋行話的含義。此外,這是我第一次與Stackoverflow,所以讓我知道這是一個體面的問題,並給我一些指針。Do-while循環問題

我在高中時期參加AP計算機科學課。我們使用Java。我們最近被教導了do-while循環,並且我剛剛完成了使用do-while循環的「實驗室」,但是存在一個問題。

首先,讓我解釋一下實驗室。該程序生成一個1-10之間的隨機整數,用戶必須猜測(猜測使用掃描儀存儲爲int),有幾個整數值跟蹤猜測次數,多少次猜測大於計算機整數,以及有多少太低了。當你看我的代碼時,你會注意到我有一個System.out.println(compGen);//compGen is the computer generated int。目的是測試代碼。

問題在於比較userGen(用戶猜測)和compGen的if語句中。

if(userGen==compGen) 
{ 
//do a lot of stuff 
} 

在這個if語句,它不打印,我已經寫了,如果用戶猜測不止一次正確的SOP。但是,我沒有把它寫入程序,它似乎是自己做的。我使用了早期提到的打印compGen int的SOP,並且將其作爲我的第一次猜測輸入,並且完美運行。 if語句塊中的所有內容都可以完美執行並正確地打印所有內容。但是,當我做了第二次猜測,第三次猜測或任何不是第一次的猜測時,沒有打印任何內容。看到下面的代碼並運行它。我不相信這應該有所作爲,但我使用的IDE是Eclipse,因此是包聲明。請幫忙。

package Chapter_3.Lab03_Chapter3; 
    import java.util.*; 

public class Guess 
{ 
    public static void main(String[] args) 
    { 
    Scanner userInput = new Scanner(System.in);//Scanner 
    int compGen = (int)(Math.random()* 10 + 1);//compGen is computer number 
    System.out.println(compGen); //USED TO VERIFY FAILURE. VALUE WAS ENTERED TO TEST CODE 
    int guessTrack = 0;//tracks number of guesses 
    int tooHighTrack = 0;//CREATING INTS TO TRACK STUFF 
    int tooLowTrack = 0; 
    System.out.println("Welcome to the integer guessing game that everyoone loves!");//PROMPT 
    System.out.println("Please enter your guess for the integer. Remeber, it is between one and ten.");//GREETING 
    int userGen = userInput.nextInt();//USER GUESS 

    do 
    { 
     guessTrack++;//Increase guess value 
     if(userGen > compGen)//checks user value in relation to computer generated int 
     { 
      System.out.println("Try again! Your guess was too high!");//inform user of bad guess 
      userGen = userInput.nextInt();//new guess 
      tooHighTrack++;//if guess is too high, this int tracker increases 
     } 
     else if(userGen < compGen)//checks user value in relation to computer generated int 
     { 
      System.out.println("Try again! Your guess was too low!");//inform user of guess 
      userGen = userInput.nextInt();//new guess 
      tooLowTrack++;//increases if user guess is too low 
     } 
     else if(userGen==compGen)//if both values are equivalent, execute THIS IS THE PROBLEM STATEMENT!! 
     { 
      System.out.println("Great job! You guessed the right number!");//congratulate 
      if(guessTrack>1) 
      { 
       System.out.println("It took you: "+guessTrack+" guess to get the right answer.");//print guess tracked int 
      } 
      else 
      { 
       System.out.println("It took you: "+guessTrack+" guesses to get the right answer.");//print guess tracked int 
      }    
      System.out.println(tooHighTrack +" guesses were too high and "+ tooLowTrack+ " were too low.");//print how many guess were too big or too low 
      System.out.println("HELLO"); //Used to verify failure of code 
      userInput.close();//close scanner object 
     } 
    } 
    while (userGen != compGen);//condition to be ultimately checked   
} 
} 

我一直無法弄清楚什麼是錯的。有一次,我刪除了整個if語句並重新輸入(我知道它不會做任何事情,但我必須嘗試)。這個問題對我來說毫無意義。沒有任何錯誤或任何東西彈出,沒有任何東西彈出在控制檯上,這讓我感到害怕。提前致謝。

回答

5

首先,你把很多文字放在這裏。也許下次嘗試最小化問題作爲一個建議;)否則一切都很好

到你的問題。讓我最小化你的代碼,然後向你解釋發生了什麼。

代碼1.

int val = scanner.nextInt(); 
do { 
    if (val < 5) { 
     // too low 
     val = scanner.nextInt(); 
    } else if (val > 5) { 
     // too high 
     val = scanner.nextInt(); 
    } else { 
     // correct 
     // THIS CODE DOESN'T RUN?! 
    } 
} while (val != 5); 

2.什麼是你的代碼嗎?

您在循環之前閱讀您的第一個數字。沒關係。然後,你輸入一個if-elseif-else語句。請注意,一旦進入其中一個塊,其他塊將不會執行。 現在的問題是,你閱讀你的下一個用戶輸入內部的if-elseif!該程序讀取下一個值並留下整個if-elseif-else。您的代碼不會執行,因爲循環會在下一次迭代之前結束,因此正確的用戶輸入沒有經過if-elseif-else。

3.解決方案

刪除所有nextInt()讀取,只是有一個作爲第一件事循環:

int val; 
do { 
    val = scanner.nextInt(); 
    if (val < 5) { 
     // too low 
    } else if (val > 5) { 
     // too high 
    } else { 
     // correct 
     // THIS CODE RUNS NOW! 
    } 
} while (val != 5); 

這樣的事情,結構需要至少做些什麼一次在檢查環路狀況之前,通常使用do while環路而不是while環路

+0

感謝您提出減少問題的建議。這是我的第一篇文章,並希望說清楚,我沒有這個網站的經驗。現在到你的答案,我讚賞按積分分組,這絕對有幫助。下面的用戶指出,如果提交了正確的答案,則由於while條件將是錯誤的,因此do-while將終止。你的答案不會有同樣的問題嗎?即使'nextInt()'在塊的頂部? – Ungeheuer 2014-10-17 00:56:32

+1

不,因爲用戶輸入在if-elseif-else進入之前被讀取。因此,輸入始終在相同的迭代過程中完成,並在之後結束。 – Felk 2014-10-17 01:01:34

+0

哦!現在我明白了!通過在頂部輸入用戶輸入,答案將過濾到if/else-if塊,保留該值並允許'userGen == compGen'代碼正確執行。而且我仍然可以得到「猜得太高」的代碼,因爲我在循環中得到了int。你先生非常聰明。 :) – Ungeheuer 2014-10-17 01:02:26

3

您正在循環中設置用戶輸入,然後再檢查它。嘗試這樣的循環後的else if(userGen==compGen)塊的體移動到:

public static void main(String[] args) 
    { 
    Scanner userInput = new Scanner(System.in);//Scanner 
    int compGen = (int)(Math.random()* 10 + 1);//compGen is computer number 
    System.out.println(compGen); //USED TO VERIFY FAILURE. VALUE WAS ENTERED TO TEST CODE 
    int guessTrack = 0;//tracks number of guesses 
    int tooHighTrack = 0;//CREATING INTS TO TRACK STUFF 
    int tooLowTrack = 0; 
    System.out.println("Welcome to the integer guessing game that everyoone loves!");//PROMPT 
    System.out.println("Please enter your guess for the integer. Remeber, it is between one and ten.");//GREETING 
    int userGen = userInput.nextInt();//USER GUESS 

    do 
    { 
     guessTrack++;//Increase guess value 
     if(userGen > compGen)//checks user value in relation to computer generated int 
     { 
      System.out.println("Try again! Your guess was too high!");//inform user of bad guess 
      userGen = userInput.nextInt();//new guess 
      tooHighTrack++;//if guess is too high, this int tracker increases 
     } 
     else if(userGen < compGen)//checks user value in relation to computer generated int 
     { 
      System.out.println("Try again! Your guess was too low!");//inform user of guess 
      userGen = userInput.nextInt();//new guess 
      tooLowTrack++;//increases if user guess is too low 
     } 
    } 
    while (userGen != compGen);//condition to be ultimately checked 

    //The numbers have matched since it exited the loop. 
    System.out.println("Great job! You guessed the right number!");//congratulate 
    if(guessTrack>1) 
    { 
     System.out.println("It took you: "+guessTrack+" guess to get the right answer.");//print guess tracked int 
    } 
    else 
    { 
     System.out.println("It took you: "+guessTrack+" guesses to get the right answer.");//print guess tracked int 
    }    
    System.out.println(tooHighTrack +" guesses were too high and "+ tooLowTrack+ " were too low.");//print how many guess were too big or too low 
    System.out.println("HELLO"); //Used to verify failure of code 
    userInput.close();//close scanner object 
} 
+1

我明白你的意思了。我甚至沒有想到,在userGen和compGen相等時,循環停止。有時我覺得很蠢。謝謝!! – Ungeheuer 2014-10-17 00:52:49

+1

@JohnnyCoder別擔心,每個人都會遇到這種情況。當你回顧它時,錯誤是顯而易見的。 – Pokechu22 2014-10-17 01:05:04

1

while條件只要程序到達循環內的代碼的結束進行檢查。所以假設他們輸入了錯誤的數字;該程序說它太低或太高,然後要求另一個號碼:

userGen = userInput.nextInt();//new guess 

現在假設這個新號碼是正確的。該程序完成您的if語句,然後進入循環結束。那麼,在那一點上,userGen等於compGen。因此,while條件失敗,程序立即退出循環,而沒有進入打印結果的代碼。

解決此問題的一種方法是將userGen == compGen的邏輯移動到循環的外部 - 即在循環結束後打印結果。那樣,只要循環退出,它就會被執行。請注意,當您退出循環時,我們知道userGen == compGen,因爲如果它不是,循環會返回。

+0

你和@ Pokechu22說同樣的事情,所以非常感謝你。我不知道我的錯在哪裏。我其實是一個相當不錯的編碼器,但有時候我可能只是愚蠢的。 – Ungeheuer 2014-10-17 00:54:37

+0

@JohnnyCoder是的,我可以告訴你,你是一個體面的編碼器。我也是如此,我已經這樣做了37年了,我仍然犯了愚蠢的錯誤。你沒什麼問題,我們都有偶爾的盲點。如果你決定從事編程工作,我認爲你會很擅長。 – ajb 2014-10-17 01:09:54

1

比方說,計算機生成的數量爲3個,你猜5 5> 3,所以如果(userGen> compGen)語句執行:

 System.out.println("Try again! Your guess was too high!");//inform user of bad guess 
     userGen = userInput.nextInt();//new guess 
     tooHighTrack++;//if guess is too high, this int tracker increases 
您打印的消息

,得到一個新的猜測,然後增加你的計數器......但是當你得到新的猜測時,說這是正確的答案3,userGen現在等於CompGen(均爲3),現在等於 ,同時評估條件:

while(userGen!= compGen)

這現在是錯誤的,因爲userGen == compGen(都是3)。您的代碼永遠不會有機會打印正確的消息 ,因爲循環在它發生之前退出。希望有幫助

+0

謝謝瑞克,你和其他2人指出了同樣的事情。你們都很棒。非常感謝您的幫助。尤其是你所有的快速反應。 – Ungeheuer 2014-10-17 00:55:42

0

您的userGen在每次用戶輸入後都沒有被檢查。 問題是你有一個else-if塊的內部檢查,它會在再次循環前檢查while語句的結束。

如果更改

else if(userGen==compGen) 

if(userGen==compGen) 

然後因爲它不是分開的if-else塊,它會在每次輸入後進行檢查(之前檢查while條件)

或者,您可以將您的用戶輸入移動到do-while塊的起始位置,如下所示:

package Chapter_3.Lab03_Chapter3; 
import java.util.*; 

public class Guess 
{ 
    public static void main(String[] args) 
    { 
    Scanner userInput = new Scanner(System.in);//Scanner 
    int compGen = (int)(Math.random()* 10 + 1);//compGen is computer number 
    System.out.println(compGen); //USED TO VERIFY FAILURE. VALUE WAS ENTERED TO TEST CODE 
    int guessTrack = 0;//tracks number of guesses 
    int tooHighTrack = 0;//CREATING INTS TO TRACK STUFF 
    int tooLowTrack = 0; 
    System.out.println("Welcome to the integer guessing game that everyoone loves!");//PROMPT 
    System.out.println("Please enter your guess for the integer. Remeber, it is between one and ten.");//GREETING 
    int userGen = -1;//USER GUESS 

    do 
    { 
     userGen = userInput.nextInt(); 
     guessTrack++;//Increase guess value 
     if(userGen > compGen)//checks user value in relation to computer generated int 
     { 
      System.out.println("Try again! Your guess was too high!");//inform user of bad guess 
      userGen = userInput.nextInt();//new guess 
      tooHighTrack++;//if guess is too high, this int tracker increases 
     } 
     else if(userGen < compGen)//checks user value in relation to computer generated int 
     { 
      System.out.println("Try again! Your guess was too low!");//inform user of guess 
      userGen = userInput.nextInt();//new guess 
      tooLowTrack++;//increases if user guess is too low 
     } 
     else if(userGen==compGen)//if both values are equivalent, execute THIS IS THE PROBLEM STATEMENT!! 
     { 
      System.out.println("Great job! You guessed the right number!");//congratulate 
      if(guessTrack>1) 
      { 
       System.out.println("It took you: "+guessTrack+" guess to get the right answer.");//print guess tracked int 
      } 
      else 
      { 
       System.out.println("It took you: "+guessTrack+" guesses to get the right answer.");//print guess tracked int 
      }    
      System.out.println(tooHighTrack +" guesses were too high and "+ tooLowTrack+ " were too low.");//print how many guess were too big or too low 
      System.out.println("HELLO"); //Used to verify failure of code 
      userInput.close();//close scanner object 
     } 
    } 
    while (userGen != compGen);//condition to be ultimately checked   
} 
} 

這將導致您的if-else塊被檢查,每次用戶輸入數據之前,檢查do-while的條件。

+0

謝謝。另一位用戶指出,將'nextInt()'移動到塊的頂部。我喜歡將if-else改爲if的想法。它創建了另一個IDE,IDE必須檢查哪個也會使代碼運行。好主意的人。謝謝! – Ungeheuer 2014-10-17 01:13:21