2011-02-12 7 views
2

이 프로그램에서 내부 루프는 이 7 일 때 의 임의의 숫자를 생성 한 다음 생성을 중지합니다. 외부 루프는 내부 ​​루프를 100 번 반복합니다.
왜 외부 루프가 내부 루프를 다시 실행하지 않습니까?
한 번만 그런 것처럼 보입니다.Java에서 중첩 된 while 루프 학습

package test; 


public class Loops { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     int i = 0; 
     int sum = 0; 
     int counter = 0; 
     String randomNumberList = " "; 
     int c = 0; 
     while (c != 100){ 

      while (i != 7) { 
      i = (int) (101 * Math.random()); 
      sum += i; 
      ++counter; 
      randomNumberList += " " + i; 
      } 
     System.out.print("\n loop repeated" + counter+ " times and generated these numbers: " + randomNumberList); 
      ++c; 
     } 

    } 

} 
+0

시간이 많이 걸렸습니다. 나는 100 라인의 출력을 얻었다. 매번 출력이 같은 이유가 궁금하십니까? –

답변

6

내부 루프는 i = 7이 될 때까지 실행됩니다. 끝나면 여전히 7이므로 i를 다른 값으로 변경할 때까지는 다시 실행되지 않습니다.

do-while 루프로 변경하면 문제가 해결됩니다.

4

당신이 (또는 당신이 그것을 종료 후.)

따라서, 두 번째 및 외부 루프의 다음 반복에, 당신이 얻을 내부 루프를 시작하기 전에 i를 재설정하지 않는 이유만으로 내부는 while이지만 조건은 i != 7이고 여전히 false이며 내부 루프 본문을 실행하지 않습니다.

간단한 수정은 while 바로 앞에 i = 0을 추가하는 것입니다.

좀 더 우아한 해결 방법은 whiledo ... while으로 변경하는 것입니다.

0

최상의 해결 방법은 while 루프 대신 for 루프를 사용하고 변수 범위를 줄이는 것입니다. 위의 변경에

import java.util.Random; 

... 

public static void main(String[] args) { 
    Random rand = new Random(); 

    for (int c = 0; c < 100; ++c) { 
     String randomNumberList = " "; 
     int sum = 0; 
     int counter = 0; 
     for (int i = 0; i != 7; ++counter) { 
      i = rand.nextInt(101); 
      sum += i; 
      randomNumberList += " " + i; 
     } 
     System.out.println("loop repeated " + counter+ " times and generated these numbers: " + randomNumberList); 
    } 
} 

일부 노트 : 이것은 깨끗하고 관용적 코딩 스타일을 초래

  1. 당신은 잘린 루프가 사실로 인한 버그가 숨어있는 것을 찾을 수 있습니다 당신의 변수 외부 루프에 들어가기 전에 한 번만 초기화되었습니다. 축소 된 범위 randomNumberList, sumcounter은이를 수정합니다.
  2. 일반적으로 줄의 끝 부분이 아니라 시작 부분에 인쇄하는 것이 더 낫습니다. 특히 줄 바꿈으로 마지막 줄을 끝내지 않는 한 명령 프롬프트를 마지막 출력 줄 끝 부분에 놓습니다. 위의 그림과 같이 println을 사용하여 문제를 피하십시오.
  3. 0에서 100 사이의 난수를 생성하려는 경우 Random.nextInt()은 부동 소수점 연산 및 변환없이 동일한 결과를 얻습니다.