While 무한루프

Cmaster
이동: 둘러보기, 찾기

목차

while 무한 루프

  • 반복문의 조건을 항상 참이 되도록 하면 무한루프를 수행하게 된다.
    • 보통 조건을 1로 두고 사용한다.
    • 0 이외의 어떤 값을 주더라도 상관은 없지만 1이 가장 보기가 좋은 것 같다.
  • 한 가지 주의할 점은 반드시 루프를 벗어나는 점이 있어야 한다는 것이다.
    • 즉 루프를 수행하다가 어떤 조건을 만족하면 루프를 벗어나게 하는 명령이 반드시 필요한 것이다.
    • 이러한 방법은 루프를 언제까지 수행해야 할지 모르는 경우나 조건이 많은 경우 등 다양하게 사용할 수 있다.
    • 조건을 이용하여 벗어날 때는 if문을 사용하여 조건을 검사하고 조건이 만족할 때 break를 이용하면 루프를 벗어나게 된다.
      • 단, 벗어날 때는 자기가 직접 속해있는 루프 하나만 벗어나게 된다.
    • 또 다른 제어문으로써 continue가 있으며, 이는 루프의 시작부분으로 제어를 이동한다.
      • continue 아랫부분은 실행하지 않는다.
  • break와 continue는 모든 루프 속에서 사용할 수 있다.
    • 그러나 continue는 가급적이면 사용하지 않는 것을 권하고 있다.
    • 즉, 프로그램의 가독성을 저해하고 혼란을 초래하여 디버깅을 어렵게 만들 수도 있기 때문이다.
    • continue를 사용하지 않고도 프로그램을 작성할 수 있기 때문이다. 꼭 필요한 경우에 한해서 사용하도록 한다.

While inf.png

Examples

예제 04-02-1

while의 무한 루프를 이용한 1부터 10까지 출력하기
  1. // 예제 04-02-1
  2. #include <stdio.h>
  3. int main()
  4. {
  5. 	int x=1;		// 초깃값 
  6. 	while(1) {		// 반복할 조건 검사, 여기서는 무한 루프이다.
  7. 		printf("%d ", x);
  8. 		x++;		// 루프를 벗어날 조건을 변화시킴 
  9. 		if(x>10)	// 루프를 벗어나기 위한 검사
  10. 			break;
  11. 	}
  12. }
  • 해설
6: 무한루프 설정, while의 조건이 1이므로 항상 참이다.

8: 조건 변수를 변화한다.

9: 조건을 루프 내에서 검사한다. 조건이 맞으면

10: break를 만나서 빠져나간다.

Notice: 반드시 빠져나가는 조건이 필요하다.

  • 실행 결과

Ex040201.png

예제 04-02-2

정수를 여러 개 입력받아 합, 평균, 개수를 출력하라. 단, 0보다 작으면 루프를 벗어나고, 100보다 큰 수는 개수, 합, 평균에서 제외하며 계속 다음 데이터를 받는다.
  1. // 예제 04-02-2
  2. #include <stdio.h>
  3. int main()
  4. {
  5. 	int x, sum=0, count=0;
  6. 	double ave;
  7. 	while(1) {
  8. 		printf("양의 정수를 입력하시오(음수 : 끝) : ");
  9. 		scanf("%d", &x);
  10. 		if( x < 0 ) // 음수이면 루프를 빠져나감. 
  11. 			break;
  12. 		else if( x > 100 )
  13. 			// 100 이상이면 계산하지 않고 while로
  14. 			// 가서 다음 루프 실행 
  15. 			continue;
  16. 		sum += x;
  17. 		count++;
  18. 	}
  19. 	ave= (double) sum/ (double) count;
  20. 	printf(" 합계 : %d, 평균 : %f, 개수 : %d\n", sum, ave, count);
  21. }
  • 해설
5: 변수를 선언하고 필요한 변수에 초깃값을 설정한다. sum은 합, count는 데이터의 개수를 저장.

6: 평균을 계산하여 저장할 double변수를 선언한다.

7: 무한 루프 설정

8,9: 변수를 하나씩 받아들인다.

10: 음수이면 루프를 벗어난다.

12: 그렇지 않고 100보다 크면 아무것도 수행하지 않고 while로 바로 간다. continue를 만나면 다음에 있는 문장을 수행하지 않고 다음 번의 루프를 수행하기 위해서 루프의 처음으로 간다.

16: 0보다 작거나 100보다 크지 않으면 합을 누적하고

17: 입력 데이터의 개수를 하나 증가한다.

19: 음수가 입력되었을 때 이곳으로 벗어나서 평균을 계산한다. 평균을 계산할 때 sum과 count를 실수로 변환한다.

Notice: continue는 가급적이면 사용하지 않도록 한다. 사실 continue없이도 프로그래밍이 가능하다. 간혹 사용하면 코드가 간단해 지는 경우는 있다. 꼭 필요할 때만 사용한다. 프로그램을 이해하는데 도움이 되지 않을 경우가 많기 때문이다.

  • 실행 결과

Ex040202.png


예제 04-02-3

while 무한루프를 이용하여 피보나치 수열을 출력하고 황금비를 구한다.
  1. // 예제 04-02-3
  2. #include <stdio.h>
  3. int main()
  4. {
  5. 	int x=1, y=1, z=0;
  6. 	printf("1, 1, ");	// 처음 두 수인 "1, 1, "을 출력한다. 
  7. 	while(1) {
  8. 		z = x + y;
  9. 		if(z < 0) // 가장 큰 정수보다 커지게 되면 음수로 바뀌는 성질을 이용한다. 
  10. 			break;
  11. 		printf("%d, ", z);
  12. 		x = y;
  13. 		y = z;
  14. 	}
  15. 	printf("\n");
  16. 	printf("황금비 = %f\n", (double)y / (double)x);
  17. }
  • 해설
5: 처음 두 항을 1로 설정한다.

6: 처음 두 항을 출력한다.

7: 무한루프 설정, while의 조건이 1이므로 항상 참이다.

8: 그 다음 수를 만든다. 앞의 두 수를 더하여 그 다음 수를 만든다.

9: 만들어진 수가 0보다 작으면 루프를 끝낸다. 2의 보수체계에서 가장 큰 수보다 더 커지게 되면 음수가 된다.

11: 그렇지 않으면 만들어진 피보나치 수를 출력하고

12,13: 다음 수를 만들기 위해 새로운 수로 앞의 수를 설정한다.

16: 피보나치의 연속하는 두 수의 비가 황금비이다. 즉, 뒤의 수 나누기 앞의 수를 하면 된다. 황금비는 1:1.618이다.

  • 실행 결과

Ex040203.png


QUIZ

Quiz 04-02-1

while 무한 루프를 이용하여 양의 정수를 소인수분해하라.
개인 도구
이름공간
변수
행위
목록
도구모음