이중반복문 continue - ijungbanbogmun continue

C언어

c언어 - 중첩for문 구구단에 break와 continue 실습

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#include <stdio.h>

int main(void)

{

int cur=2;

int is;

for(cur=1; cur<10; cur++)

{

if(cur%2!=0)        // cur을2로 나누었을때 나머지가 0이아니라면

continue;    // 출력에서 제외

for(is=1; is<10; is++)

{    if(cur<is)        // is가 cur보다 크다면

break;        // 탈출!!

printf("%d x %d = %d \n",cur,is,cur*is);

}

printf("\n");

}

return 0;

}

cs

출력 

중첩 for문으로 1단부터 9단까지 출력되는 구구단을 프로그램 한 후

break문은 조건이 만족되면 반복을 탈출하니 cur보다 is가 크면 탈출하도록 하였습니다.

continue는 조건을 제외하고 출력했지요?

cur%2!=0  --> cur를 2로 나누었을때 나머지가 0이 아니라면 제외시킵니다.

이조건을 모두 만족시키니 

짝수 2,4,6,8단이 출력되었고

cur과 is값이 같아지면 다음 단으로 넘어갑니다.

반복문의 생략과 탈출을 실습하는 예제였습니다^_^!

파이썬이야기

[파이썬, python] 이중 Loop와 continue에 관하여

파이썬의 순회문(loop)의 경우 continue, break, pass 등을 통해 loop를 조정할 수 있다. 오늘 어떤 분이 다른 사람의 코드를 사용 중인데loop의 continue가 제대로 작동하지 않는다고 하셔서 이를 살펴보았다. 그 문제는 for loop이 이중으로 만들어져있는 경우 안쪽 loop가 continue를 했을 때 해당 loop 안에서 continue가 이루어지는 것이 아니라 바깥의 loop로 continue가 되어야하는데 어떻게 해야하는가라는 질문이었다. 해당 코드의 개략적인 윤곽은 아래와 같다.   

붉은색 박스에서 조건문(if)가 있고 조건을 만족시키면 붉은색 박스의 loop로 continue가 되는 것이 아니라 파란색 박스로 continue가 되어한다는 것이다. 위와 같은 상황에서는 변수 Decision을 Yes로 하든지 No로 하든지 상관없이 동일한 결과가 출력된다. (여기서 break를 써버리면 바로 아래의 Result.append()로 내려가서 의도한 바와 다른 결과를 얻게 된다.)다른 언어에서는 어떻게 될지는 모르겠지만 파이썬에서는 def를 사용하여 return을 true, false로 해주면 이 문제는 간단하게 해결된다. 해결 방법은 아래와 같다. 

종전의 붉은색 박스의 loop문을 함수로 전환하고 return값을 지정해준다. 이 값을 충족시켰을 경우 True가 반환되므로 파란색 박스의 continue가 작동하게 된다. 이렇게 되면 변수 Decision을 Yes, No 등으로 입력하여 조정할 수 있게 된다. Yes를 쓰면 아무 것도 없는 빈 리스트가 나오고 다른 글자를 입력하면 [1,2,3,4.. 이 출력된다.

다중 데이터 출력에도 사용되고, 여러 건의 데이터 검증 시에도 사용되는 반복문.

다양한 반복문 구문이 있지만 그 중에서도 가장 많이 사용하는 건 아무래도 for 반복문이 아닐까 싶다.

변수를 선언해서 원하는 만큼의 반복을 수행하기도 하고
List 내의 Element를 순차적으로 추출해서 바로 데이터를 사용하는 방식으로도 사용한다.

반복문은 아무래도 중첩해서 사용할 때, 그 진가를 발휘한다고 생각하는데
어쩌면 학부생 시절에 별 찍을 때부터 중첩 반복문을 지겹게 써봐서 그렇게 생각할 수도 있다.
(교수님.. 잘 지내시나요. 교수님도 요즘 사이버강의 하시려나 궁금합니다...☆)

break와 continue로만 반복문을 제어한다고 생각했는데, 중첩 반복문을 한 번에 빠져나오기 위한 신박한 방법이 있다는 걸 알게 되었다.

개발하다가 맞닥들인 문제를 해결하기 위해 혼자 공부하는 과정에서 알게된 것도 아니고, 이번에는 코드 인스펙션 과정에서 다른 개발자가 사용했던 구문을 보면서 새롭게 알게된 문법이다.

바로 레이블 (label) 이다.

앗, 이미 이 개념을 알고 있다면, 더 이상 이 포스팅을 볼 이유가 없다.

물론 html에도 label이 있지만, 그 태그는 아니고 반복문에서 사용할 수 있는 일종의 변수의 개념으로
break 혹은 continue와 같이 선언해주면 원하는 반복문으로 이동할 수 있다.

사용법은 간단하다.

1) 빠져나가길 원하거나 다시 시작하길 원하는 반복문 앞에 Label을 붙이자.

testExit: for(int i=0; i < 10; i++) {
(물론 가독성을 위해 testExit: 다음 줄로 넘어가서 반복문을 선언해도 된다.)

2) 중첩된 반복문 내부에서 break <label 명>; 또는 continue <label 명>; 을 사용한다.

본인이 원하는 조건에 도달하는 경우, 기존에 사용하던 방식대로 break, continue를 사용해준다.

3) 단, Label을 통해 이동하려면 break, continue보다 위에 선언되어 있어야 한다.

for문을 빠져나가서 그 밑에 선언해놓은 for문으로 점프하고 그런건 안된다 ^0^
일종의 변수이므로, 당연히 먼저 선언되어 있는 label로만 이동이 가능하다.

이해를 위해 간단한 예시를 들어보자.

1) 반복문 내에서 원하는 값이 나왔을 때, 더 이상의 반복을 수행하지 않고 종료하길 원할 때

// 해당 반복문의 이름을 지정하는 레이블을 준다. searchDoubleNine: for (int i=2; i < 10; i++) { System.out.println(i + "단 시작!"); for (int j=1; j < 10; j++) { int result = i*j; System.out.print(result + " "); if (result == 49) { // 원하는 값을 찾았으니, 더 이상 반복문을 수행하지 않는다. // searchDoubleNine 이름의 반복문을 빠져나간다 break searchDoubleNine; } } System.out.println(); } System.out.println("찾았다 49!");

이렇게 써놓고 보니, 중첩되지 않은 for 구문을 사용할 때는 레이블이 생략되었다고 보면 되겠다.

break; 의 형태로 사용할 때는 별도의 레이블 지정이 없기 때문에
감싸고 있는 바로 바깥쪽의 반복문만 빠져나간다고 생각하면 된다.

continue <label 명>의 형태로 사용할 수 있는 예시를 하나 더 들어보자.

2) 중첩 반복문 내의 특정 조건은 건너뛰고, 바깥에 선언한 반복문의 다음 단계부터 다시 시작할 때.

// 해당 반복문의 이름을 지정하는 레이블을 준다. System.out.println("369 게임 시작! 단, 33, 66, 99가 나오면 다음 십의 자리로 넘어간다."); checkTwins: for (int i=0; i =< 10; i++) { for (int j=0; j < 10; j++) { int result = i*10 + j; // 1의 자리 수가 3, 6, 9에 해당된다면 if (j != 0 && j%3 == 0) { // [1] 33, 66, 99에 해당되는 대상이면 다음 십의 자리로 넘어간다. if (i == j) { continue checkTwins; } // [2] 1의 자리만 3, 6, 9라면 숫자를 세지 않고 다음 숫자로 넘어간다. continue; } else { // 아무것도 해당되지 않으면 숫자를 센다. System.out.print(result + " "); } } } System.out.println("게임 끝!");

결과문을 생각해보면 다음과 같겠다. (eclipse도 안켜보고 이렇게 올려도 되나 ^_ㅜ)

1 2 4 5 7 8 10 11 12 14 15 ..... 30 31 32 40 41 42 44 .... 60 61 62 64 65 70 .....

처음에는 코드 인스펙에 시간이 너무 많이 들어서 앞으로 어떻게 해야 하나 생각했는데,
이렇게 하나씩 새로운 지식만 얻어갈 수 있다면 내게 중요하고 도움이 되는 시간임은 분명해진다.

내가 또 누군가에게 이렇게 쓰임새있는 꿀팁과 지식을 나눠줄 시간이 있기를!
이 블로그를 보는 당신에게도 정시퇴근을 위한 좋은 포스팅이 되었기를!

내가 하는 일을 좋아하고 즐거워해서 참 다행이다. 

Toplist

최신 우편물

태그