2014-11-24 68 views
0

嗨我有麻煩的家庭作業。該程序使用兩種不同的方法來平均和顯示用戶定義的一組數字。我想到了所有這些,但是我在檢查錯誤時遇到了困難。我不希望用戶能夠說,他們想要在開始時平均負數或零數量的數字,所以我試圖使用if/else語句和do while循環來向用戶顯示錯誤消息並讓他們有機會再次嘗試。使用do/while循環錯誤檢查用戶輸入

當用戶輸入1以在輸入無效數字後再次嘗試該程序時,程序允許用戶再次嘗試。但是,一旦他們正確地輸入了所有內容並完成程序,程序就會重新開始。一旦程序正確完成,我希望程序結束。

任何幫助,將不勝感激。謝謝!

public static void main(String[] args) 
{ 
    //Defining the variables in main method 
    int inputNumber; 
    int repeat = 0; 

    //Creating the array and checking for negative or no numbers using do..while and if..else 
    do 
    { 
     String aStr = JOptionPane.showInputDialog(null, "How many numbers would you like to be averaged?"); 
     inputNumber = Integer.parseInt(aStr); 

      if(inputNumber <= 0) 
      { 
       String errorStr = JOptionPane.showInputDialog(null, "Cannot be a negative number or a zero. Press 1 to try again."); 
       repeat = Integer.parseInt(errorStr); 
      } 
      else 
      { 
       double[] array = new double[inputNumber]; 
       displayAverage(average(array)); 
      } 
    } while (repeat == 1); 
} // end main 

// Creating a method called "average" that calculates and returns the average to main 
public static double average(double [] methodArray) 
{ 
    // Defining variables in average method 
    int index; 
    double total = 0; 
    double average; 

    // Taking user inputed numbers and adding them up 
    for(index = 0; index < methodArray.length; index++) 
    { 
     String bStr = JOptionPane.showInputDialog(null, "Enter number " + (index + 1)); 
     methodArray[index] = Double.parseDouble(bStr); 

     total = total + methodArray[index]; 
    } 
    // Calculating the average 
    average = total/index; 
    return average; 
} //end average method 

// Creating a method called "displayAverage" that displays the average in a dialog box 
public static void displayAverage(double returnedAverage) 
{ 
    JOptionPane.showMessageDialog(null, "The average of all your numbers is " + returnedAverage); 
} 

} //結束類

+0

究竟是什麼問題?你無法理解「do-while」的含義?或者你在檢查輸入的有效性方面有問題?或者你有超過1個輸入的問題? – 2014-11-24 01:51:41

+0

我遇到的問題是與輸入的有效性檢查有關。我似乎要麼不正確地使用do-while要麼從某些答案/評論的外觀來看它位於不正確的位置。 – detomaso55 2014-11-24 03:23:44

+0

下次如果你可以寫下一個只顯示問題的小程序(calculateAverage和displayAverage簡直不相關),那麼它會好得多,並且2.明確你遇到的預期行爲和有問題的行爲。在很多情況下,通過做1,你可以自己找出解決方案。 – 2014-11-24 03:29:36

回答

1

看來,用戶再次嘗試並進入有效輸入後,你永遠不會改變的repeat如此循環將永遠不會退出的價值。在else如果你的if-else在循環內,你需要重新指定repeat到1以外的東西,所以循環可以退出!

0

要循環直到獲得有效的輸入,請嘗試如下所示:僅當輸入有效時,纔將validInput布爾值設置爲true。

boolean validInput = false; 
while (!validInput) { 
    //get input from user 
    if (userInputIsValid) { //however this is done 
     validInput = true; 
    } 
} 
+0

這個問題具體是關於正確使用do/while的問題。雖然這個代碼是相同的,但它不關於OP的要求。 – hfontanez 2014-11-24 03:15:36

+0

@hfontanez我明白這個問題是關於提示用戶輸入,獲取輸入,如果輸入不好,則循環,如果它很好,則打破循環。 OP恰好使用了「do-while循環」,但是不必要的。 – yts 2014-11-24 03:19:37

+0

@hfontanez yts是正確的。對不起,我應該更清楚。我不一定非要使用do-while循環,它只是我目前知道在檢查有效輸入時如何重複我的程序的唯一方法。在我嘗試使用do-while之前,我只使用if-else語句來檢查有效的輸入,但問題在於我的程序只是通知用戶錯誤,然後終止程序。 – detomaso55 2014-11-24 03:31:14

0

你必須做這樣的事情:

boolean repeat = false; 

    do 
    { 
     String aStr = JOptionPane.showInputDialog(null, 
       "How many numbers would you like to be averaged?"); 
     try 
     { 
      inputNumber = Integer.parseInt(aStr); 
      if (inputNumber <= 0) 
      { 
       JOptionPane.showMessageDialog(null, 
        "Input must be a number greater than zero. Try again.", 
        "ERROR: Invalid input", JOptionPane.ERROR_MESSAGE); 
       repeat = true; 
      } 
      else 
      { 
       double[] array = new double[inputNumber]; 
       displayAverage(average(array)); 
      } 
     } 
     catch (NumberFormatException e) 
     { 
      JOptionPane.showMessageDialog(null, 
        "Input must be a numeric string. Try again", 
        "ERROR: Invalid input", JOptionPane.ERROR_MESSAGE); 
      repeat = true; 
     } 

    } while (repeat); 

需要在try/catch來處理無效的數字字符串像一個空白的文本字段,或其他非數字字符。

您可能還想包含其他邏輯來處理取消按鈕。

0

雖然有另外一個答案給出了正確的答案(我相信是這樣),但我想詳細說明一下。

這是僞代碼:

do { 
    inputNumber = getInput(); 
    if(inputNumber <= 0) { 
     displayErrorMessage(); 
     repeat = 1;  // your logic makes no sense when people input non-1 
    } else { 
     calculateAverage(inputNumber); 
    }  
} while (repeat == 1) 

的問題是相當明顯的:一旦你得到了一個無效inputNumber,設置repeat = 1造成do-while循環再繼續。然而,之後,即使用戶輸入有效的inputNumber,repeat保持爲1,並且每次它在while(repeat ==1)中檢查時,它仍將評估爲真。

我強烈建議您學習以基本方式使用調試器,以便您可以跟蹤代碼,並且即使您輸入有效數字,您也可以通過查看它保持循環來輕鬆識別問題,因爲repeat始終爲1

另一個建議是重寫一下你的代碼,使其更容易理解。相反,在命名將重複這意味着什麼,你可以寫的東西:

boolean inputIsValid= false; 
do { 
    inputNumber = getInput(); 

    inputIsValid= verifyInput(inputNumber); 

    if (inputIsValid) { 
     calculateAverage(inputNumber); 
    } else { 
     displayErrorMessage(); 
    } 
} while (! inputIsValid) 

流量,恕我直言,更直觀。

這只是第一步。你甚至可以更好地包裹得輸入邏輯在一個單獨的方法,使主要的邏輯是這樣的:

inputNumber = getInput(); 
calculateAverage(inputNumber); 

,你把循環中getInput()。看起來更清楚不是嗎?