2013-03-28 155 views
3

如果你可以給我一些幫助,我有我的Java類的任務,我將不勝感激。此問題的提示是:如何退出Java循環?

編寫程序以讀取非負整數列表並顯示最大整數,最小整數和所有整數的平均值。用戶通過輸入一個不用於查找最大值,最小值和平均值的負標記值來指示輸入結束。平均值應該是double類型的值,以便用小數部分計算。

我和我的代碼遇到的問題是,在運行時,循環就不會結束,除非輸入的第一個值是負的,在這種情況下,它返回:

的最大輸入的號碼:0 的輸入的最小數量爲:0 輸入的數字的平均值爲:NaN

請幫忙!謝謝。薩姆

代碼:

package blah; 
import java.util.Scanner; 
public class blahblah 
{ 
    public static void main(String[] args) 
    { 
     Scanner keyboard = new Scanner(System.in); 
     System.out.println ("Please enter a list of positive integers."); 
     System.out.println ("Please enter a negative integer when finished."); 

     int in = 0; 
     int max = 0; 
     int min = 0; 
     int sum = 0; 
     int count = 0; 
     in = keyboard.nextInt(); 

     while (in>=0) 
     { 
      if (in > max) { 
       in = max; 
      } 
      if (in < min) { 
       in = min; 
      } 
      sum += in; 
      count++; 
      if (in < 0) { 
       break; 
      } 
     } 

     System.out.println("The maximum number entered was: " + max); 
     System.out.println("The minimum number entered was: " + min); 
     System.out.println("The average of the numbers entered was: " + (double)sum/count); 
    } 
} 
+2

一旦在循環中 - 你永遠不會改變... – Randy

+0

你也需要改變'in = max;'爲'max = in;'等等。賦值將右邊的值放入變量在左邊。 – iamnotmaynard

回答

3

您需要再次閱讀nextInt裏面你循環:

while (in>=0) 
{ 
    if (in>max){ 
     max=in; 
    } 
    if (in<min){ 
     min=in; 
    } 
    sum += in; 
    count++; 
    in = keyboard.nextInt(); 
    //Check not needed here, handled by while loop 
    //if (in<0){ 
    //  break; 
    //} 
} 

從評論編輯:你的任務是走錯了方向,所以你設置輸入等於最小/最大值,而不是設置最小/最大值等於輸入

+0

這解決了我永無止境的循環!謝謝。但是,現在我的程序正在返回,最大最小值和平均值都是0.我的邏輯在這裏有什麼問題? – Sleepy

+0

@SamPeezick因爲你在= min而不是min =在 –

0

您必須重新讀取來自用戶的輸入。相反的:

in = keyboard.nextInt(); 
while (in>=0) { 
    if (in>max){ 
     in=max; 
    } 
    if (in<min){ 
     in=min; 
    } 

    sum += in; 
    count++; 
    if (in<0){ 
     break; 
    } 
} 

用途:

in = keyboard.nextInt(); 
while (in>=0) { 
    if (in>max){ 
     in=max; 
    } 
    if (in<min){ 
     in=min; 
    } 

    sum += in; 
    count++; 

    // removed if, since loop checks it. 

    in = keyboard.nextInt(); // read on! 
} 
1

移動輸入讀循環,並在負突破:

while (true) { 
    in = keyboard.nextInt(); 
    if (in < 0) break; 
    // rest of loop 
} 

更好appraoch是使用一個for循環,它很好地捆綁了所有與環路相關的邏輯:

for (int in = keyboard.nextInt(); in >= 0; in = keyboard.nextInt()) { 
    // your current loop code 
} 

分離出迭代碼清楚什麼樣的代碼是迭代碼和退出循環代碼是完全致力於該計劃的任務,使荷蘭國際集團更容易閱讀和理解

這也意味着你不這樣做需要聲明int in,最好儘可能地減少變量的範圍 - 在這種情況下in只存在於循環中,這是唯一使用/需要的地方。

+0

@jlordo是 - 已經處理了,包括一個更好的替代恕我直言:) – Bohemian

+0

爲什麼不'while((in = keyboard.nextInt())> = 0 )'? –

+0

@ PM77-1你*可以*做到這一點,但使用這種語法被認爲是不好的做法 - CheckStyle插件認爲這是一個問題。看看我的編輯使用'for'循環,這更清晰。 – Bohemian

0

更改您的代碼以

in = keyboard.nextInt(); 
while (in>=0){ 
    if (in>max){ 
     in=max; 
    } 

    if (in<min){ 
     in=min; 
    } 

    sum += in; 
    count++; 
    in = keyboard.nextInt(); 
} 

正如你可以看到我已經添加in = keyboard.nextInt();,使越來越多的值從用戶

1

您語句讀取的值不是while循環中,所以它僅讀的第一項:

in = keyboard.nextInt(); 
while (in>=0) 
{ 

} 

更改爲:

in = keyboard.nextInt(); 
while (in>=0) 
{ 
    ... stuff ... 
in = keyboard.nextInt(); 
} 
0

你「中的」

在=最大

把值相同的變量;

它應該是其他方式

max = in;