'break'에 해당되는 글 3건

  1. 2015.07.16 MATLAB의 break, continue 명령
  2. 2015.05.26 파이썬의 break 명령과 for ~ else 구문
  3. 2015.05.19 C/C++의 break 명령

 반복문 수행 시 어떤 경우에는 수행 중이던 반복문을 중단하고 빠져 나와야 하는 경우가 발생할 수도 있다. break 문은 for 구문이나 while 반복문 내에서 사용되며 반복문을 빠져 나오게 만드는 명령어이다. 반복문은 한번 시작하면 반복 변수가 마지막 값을 가질 때까지 반복을 수행해야 하는데 break 명령은 그 위치에서 반복을 중단하고 반복문을 빠져 나오게 만든다. 다음의 예를 살펴보자.


for k=0:10
   for n=0:10
       if (n==5)
           break
   end
   end
end


이 예에서 첫 번째 for 문은 k가 0부터 10까지 수행되고, 각각의 k값에 대해서 안쪽의 for 루프를 만나 n이 0부터 10이 될 때까지 수행을 해야 하지만 n이 5일 때에는 if의 조건이 참이 되므로 break 문을 만나게 된다. 이 때, 안쪽 루프를 탈출하게 된다. 다시 바깥쪽의 for 문을 돌게 되는 것이다. 이 중첩된 루프가 끝났을 때엔 k에는 10이, 그리고 n에는 5가 입력되어 있다.


 또 다른 예를 들어보자. 1과 자기 자신으로만 나누어지는 2보다 큰 양의 정수를 소수(prime number)라고 한다. 주어진 정수 n이 소수인가 아닌가를 판별하는 가장 간단한 방법으로는 n을 2,3,4,…,n-1로 나누어지는지 차례로 검사하는 것이다. 그 모든 수에 대해서 나누어지는 수가 (즉 나머지가 0인 수가) 하나도 없다면 n은 소수일 것이고 그렇지 않다면 n은 소수가 아닌 것이다. 나머지를 구하는 함수는 rem()함수이다. rem(m,n)은 m을 n으로 나눈 나머지를 반환하여 준다. 다음 프로그램을 살펴보자.


1 : n=input('양의 정수를 입력하시오');
2 : for k=2:n-1
3 :     m=rem(n,k);
4 :     if m==0 break, end
5 : end
6 : if m==0
7 :     sprintf('%d는 소수가 아님.',n)
8 : else
9 :     sprintf('%d는 소수.',n)
10: end


사용자로부터 숫자 n을 입력받아서 2번 줄의 for문으로 인해 2부터 n-1까지 숫자로 차례로 나눠서 그 나머지를 구한다. 만약 중간에 나머지가 0인 경우가 발생한다면 더 이상 반복문을 수행할 필요가 없는 것이다. 따라서 이 경우를 4번 줄에서 검사하여 바로 반복문을 빠져나오게 된다. 그리고 6번 줄에서 만약 m이 0이라면 어떤 숫자로부터 나눠진 경우가 발생한 것이므로 소수가 아니라는 판정을 내리고 그렇지 않은 경우 소수라는 판정을 내리게 되는 것이다. (참고로 소수의 리스트를 구할 수 있는 matlab 함수로는 primes()함수가 있다.)

 continue 명령은은 for문이나 while문 안에서 쓰이며 루프의 맨 처음으로 제어 흐름을 바꿔 주는 역할을 한다. 즉 while에서는 조건을 비교하는 부분으로, 그리고 for에서는 반복 변수값을 변화시켜서 for문 바로 다음의 명령문으로 흐름을 바꿔주는 역할을 한다. 다음의 예를 살펴보자.


1: clear all
2: for n=1:10
3:     tmp=n^3;
4:     if (n==5) continue, end
5:     k(n) = tmp;
6: end


이 예에서 k의 값이 변하는 추이를 살펴보자. n이 5가 되기 전에 k에 1, 8, 27, 64의 값을 저장한다. 그런데 n==5가 참이 되면 continue 문이 실행되고, 즉시 n=6으로 되고 3번 줄로 되돌아 가게 된다. 그러므로, 벡터 k(5)에는 125가 저장이 되지 않고 다음 반복문으로 넘어가게 된다.




Posted by 살레시오
,

 파이썬의 for 반복문 안에서 break 명령을 사용할 수 있는데 이 명령은 즉시 그것이 포함된 가장 안 쪽의 반복문을 빠져 나온다. 다음 반복문을 보자.


for n in lst:
   if n==0:
       break
   print(n)


이것은 lst 안의 요소들을 차례대로 프린트하다가 0이 발견되면 바로 반복을 멈추는 프로그램이다. 만약 lst=[1,2,3,0,4,5] 라면 1,2,3만 출력되고 반복문은 종료될 것이다. 만약 반복문의 중첩되어 있다면 가장 안쪽의 반복문만 빠져 나온다는 점에 유의해야 한다.


파이썬의 for 반복문은 else 명령과 짝을 이룰 수도 있다.


for 변수 in 반복가능자:
   수행문들1
else:
   수행문들2


else 블럭에 포함된 ‘수행문들2’는 for 반복문이 반복형의 마지막 요소까지 모두 반복했을 경우 그 다음에 수행된다. 즉, 모든 반복이 성공적으로 수행된 경우에 한 번 수행된다. 하지만 break문을 만나면 else 구문은 수행되지 않고 for 블럭을 완전히 빠져나간다.


for n in lst:
   if n==0: break
   print(n)
else:
   print(‘There is no 0.’) # break문을 만나지 않았다면 수행된다.


이 예제의 경우 lst 안에 0이 있다면 break를 만나게 되고 따라서  else 블럭은 수행되지 않고 for 반목문을 빠져 나오게 된다.


따라서 for 반복문이 종료된 시점에서 이 종료가 모든 반복을 다 수행한 후의 정상적인 종료인지, 아니면 break 명령에 의한 강제 종료인지에 따라서 수행해야 될 일을 구분할 필요가 있는 경우에 for~else 구문을 사용하면 된다.



Posted by 살레시오
,

4.6 break명령     [doc]     [smts]

 break 명령은 전 절에서 소개한 switch 명령과 반복문 안에서만 쓰이며 이 명령을 만나면 그것을 둘러싸고 있는 가장 안 쪽의 반복문 하나를 빠져 나온다.


다음의 간단한 예를 보자.


0406-01.c
for (int ia=0; ia<10; ia++) {
printf(“%d\n”,ia);
if (ia==3)
break;
}

이 프로그램의 결과는


0

1

2

3


이다. 왜냐면 ia가 3이라면 break 명령이 수행되어 for반복문 밖으로 빠져나오기 때문이다.


0406-02.c
int ia;
while(1) {
scanf(“%d”,&ia);
if (ia==0)
break
else
printf(“you typed %d.”,ia);
}

이 예는 사용자가 입력한 정수가 0 이 되면 break 명령을 만나서 무한 루프를 빠져나오는 것이다.


 또 다른 예로 사용자로부터 숫자(정수)를 입력받는데 정해진 입력이 아니면 다시 입력하도록 하는 것을 생각해 보자. 가상의 로봇에 대한 입력이 1번, 2번, 3번만 있는 경우 나머지 경우에 대해서는 다시 입력하도록 하려면 다음 예 break_ex01 과 같이 반복문과 break명령을 조합하여 사용하면 된다.


0406-03.c
#include <stdio.h>
int main(void)
{
  char cIn;
  printf("1. Turn left.\n");
  printf("2. Turn right.\n");
  printf("3. Stop.\n ");
  printf("Choose one : ");
  while(1) {
      scanf("%d", &cIn);
      if (cIn==1 || cIn==2 || cIn==3)
          break;
      printf("Wrong! Input again : ");
  }
}

이 예를 보면 while 반복문 안에서 scanf()함수에 의해서 하나의 정수를 입력받게 되어 있다. 입력받은 정수가 1, 2, 혹은 3이라면 break명령에 의해서 바로 반복문을 빠져 나가고 아니라면 scanf()함수가 반복되어 호출되도록 되어 있다. 이렇게 함으로서 올바른 숫자가 입력될 때까지 반복해서 입력을 받게끔 할 수 있다.


1. Turn left.
2. Turn right.
3. Stop.
Choose one : 5
Wrong! Input again : 1

또 다른 예를 들어보자. 소수(prime number)란 1과 그 자신의 수로만 나누어 떨어지는 수이다. 1000이하의 소수 중 가장 큰 것을 찾는 프로그램을 작성하고자 한다고 하자. 이 경우는 1000부터 하나씩 줄어가면서 소수인지 아닌지를 판별하는 것이 나을 것이다.


0406-04.c
#include <stdio.h>
int main() {
  for (int ia = 1000; ia>=2; ia--) {
      int ib = 2;
      while(ib < ia/2 ) {
          if (ia%ib == 0) break;
          ib++;
      }
      if (ib == ia/2 +1) {                  //❶
          printf("result: %d\n", ia);  //❷
          break;
      }
  }
}

이 예제에서 for문 안을 눈여겨보자. while 반복이 끝나고 ❶번줄로 넘어왔을 때 ib 변수값이 (ia/2+1)과 같다면 while반복문이 그 안의 break문을 만나지 않고 종료되었다는 의미이므로 (즉, 이것은 ia를 2 ~ (ia/2) 사이의 값으로 나눴을 때 한 번도 0이 되지 않았음을 의미한다) ia는 소수이다. 따라서 이 경우 바깥쪽 for반복문도 빠져나가게끔 되어 있다. 만약 while 반복이 끝나고 ❶번 줄로 넘어왔을 때 ib 변수값이 ia와 같지 않다면 이것은 2~(ia-1) 사이의 값으로 나눴을 때 어디선가 나머지가 0이라는 말이므로 소수가 아니라는 뜻이다. 따라서 다음 ia값을 다시 검사해야 된다. for문 바깥인 ❷로 빠져 나간 후 ia값을 printf()함수에 의해서 화면에 표시한다.


 이 예제를 이해했다면 for, while, break 에 대해서 어느 정도 이해를 했다고 볼 수 있다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

C/C++의 goto 명령  (0) 2015.05.19
C/C++의 continue 명령  (0) 2015.05.19
C/C++ 의 do ~ while 반복문  (0) 2015.05.18
C/C++ 의 while 반복문  (0) 2015.05.18
C/C++의 for 반복문  (0) 2015.05.18
Posted by 살레시오
,