Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

KNK Chap.6 (6.4) 본문

C

KNK Chap.6 (6.4)

Daryl 2022. 12. 16. 19:54

6.4 루프에서 벗어나기

프로그래밍을 하다 보면 루프를 중간에 종료시켜야 할 때가 있음.

또는 종료 지점이 여러개인 반복문을 짜야 할 때도 있음.

두 경우 다 break 문을 통해 만족시킬 수 있음.

그래서 break문을 먼저 배운 후에 continue문과 goto문을 배울 것임.

 

break문

자연수 n이 소수인지 판별하는 프로그램을 작성한다 치자.

일단 for문을 통해 n을 2에서 n-1 사이의 숫자들로 나누는 코드를 작성하는 것임.

여기서 나눗수가 발견되면 바로 반복문을 중단해야 함.

루프가 종료된 후 if문을 통해 중도 종료됐는지(n이 합성수) 아닌지(n이 소수) 판별 가능함.

예제 ↓

for (d = 2; d < n; ++d) {
	if (n % d == 0) {
    	break;
    }
}

if (d < n) {
	printf("%d은/는 %d로 나뉘어진다\n", n, d);
} else {
	printf("%d은/는 소수이다.\n", n);
}

break문은 가장 안쪽의 while문, for문, do문, switch문에서 제어를 밖을 옮김.

그래서 위와 같은 구문이 여러 겹으로 작성되면 break문은 딱 한 구문에서만 벗어날 수 있게 함.

while문 내에 있는 switch 문의 경우를 보면

while (...) {
    switch (...) {
    	...
        break;
        ...
    }
}

break문은 switch문에서 제어를 밖으로 빼냄. 그러나 while문에서 빼내진 않음.

이 부분은 추후 구체적으로 배울 것임.

 

continue문

따지자면 continue문은 루프에서 벗어나는 구문은 아니지만, break와 비슷함.

break가 프로그램의 제어를 루프 이후로 전달한다면,

continue는 제어를 루프가 끝나기 이전에 전달함.

즉, break가 루프에서 벗어나게 해준다면 continue는 루프 안에 남게 해줌.

차이점은 또 있음. break는 switch문과 루프문에 쓸 수 있지만 continue는 루프에만 쓸 수 있음.

 

continue가 어떻게 사용되는지 보기 위해 예제를 만들겠음.

숫자 여러 개를 연속적으로 받아 그들의 합을 계산하는 예제임.

루프는 10개의 0이 아닌 수가 입력되면 종료될 것임.

0이 입력되면 continue가 실행되어 루프 본문을 생략하나, 루프가 종료되지 않음.

n = 0;
sum = 0;
while (n < 10) {
	scanf("%d", &i);
    
    if (i == 0) {
    	continue;
    }
    
    sum += i;
    ++n;
    /* continue jumps to here */
}

위 예제를 continue 없이 작성하면

n = 0;
sum = 0;
while (n < 10) {
	scanf("%d", &i);
    
    if (i == 0) {
    	sum += i;
   		++n;
    }
}

 

goto문

break문과 continue문은 프로그램의 제어를 설정된 범위의 다른 줄로 옮기는 도약문임.

이와 달리 goto문은 해당 구문에 표식label이 있는 한, 함수 내 어느 구문으로든 도약 가능함.

[C99]C99는 goto문에 약간의 범위를 부여함. 가변 크기를 갖는 배열의 선언을 우회할 때 쓸 수 없음.

 

표식이란 구문의 시작에 표기한 식별자임.

identifier : statement

구문은 두 개 이상의 식별자를 가질 수 있음.

goto문 자체는 아래와 같은 구조를 가짐.

goto identifier ;

구문 goto L;을 실행하면 프로그램의 제어를 표식 L이 있는 구문으로 옮김.

여기서 표식 L은 반드시 goto문이 있는 함수 내에 있어야 함.

 

루프 강제 종료에도 goto문을 쓸 수 있음.

for (d = 2; d < n; ++d) {
	if (n % d == 0) {
    	goto gone;
    }
}

done:
	if (d < n) {
    	printf("%d id divisible by %d\n", n, d);
    } else {
    	printf("%d is a prime\n", n);
    }

goto문은 옛 프로그래밍 언어들의 잔재라 C 프로그램에서 자주 쓰이진 않음.

이미 goto를 대체할 만한 break, continue, return, exit() 등이 있기 때문.

 

물론 루프 내에 switch문이 있는 경우, 전체 반복문에서 벗어날 때 goto문을 쓰면 유용함.

while (...)
	switch (...) {
    	...
        goto loop_done; /* 이 상황에선 break가 안 먹힘 */
        ...
    }
}
loop_done: ...

또한 반복문이 여러 겹일 때도 goto문은 유용하게 사용됨.

그러나 goto문에서 표식은 goto문 이전에 있어서는 안됨.

 

[프로그래밍] 은행계좌 프로그램

사용자에게 여러 명령어를 나열해서 보여주고, 그 중 사용자가 무엇을 선택하면,

해당 명령에 따라 프로그램은 행동을 하고, 그 행동이 종료되면 다시 명령어 목록을 띄움.

이 과정은 사용자가 종료 명령어를 선택해야 종료됨.

 

이런 프로그램의 핵심은 루프임. 여기서 루프는 세 가지로 나뉠 것임.

명령어를 묻는 구문, 명령어를 읽는 구문, 명령을 실행하는 구문으로.

for   (;;)   {
	명령어를 묻는다;
    명령어를 읽는다;
    명령을 실행한다;
}

명령 실행 부분에선 switch문이나 계단식 if문을 사용하는 것이 좋을 것임. 구조 ↓

for    (;;)    {
	명령어를 묻는다;
    명령어를 읽는다;
    switch (명령어)
    case   명령어1:
    	명령1 실행;
        break;
    case   명령어2:
    	명령2 실행;
        break;
    ...
    case   명령어n:
    	명령n 실행;
        break;
    default:
    	에러 메시지 출력;
        break;
    }
}

위 코드를 토대로 은행계좌 관리 프로그램을 작성해볼 것임.

프로그램은 사용자에게 계좌의 금액을 초기화하거나, 입금하거나, 출금하거나,

현재 금액을 출력하거나, 프로그램을 종료하는 선택지들이 있을 것임.

여기서 선택은 정수 0,1,2,3,4로 정해줄 것임. 

예를 들어

Commands: 0=clear, 1=credit, 2=debit, 3=balance, 4=exit

이런 식으로. 여기서 4번 명령을 입력하면 switch문 뿐만 아니라 전체 루프에서 벗어나야 함.

break문은 당연히 안 되고, goto문은 자주 쓰이진 않기 때문에, 아예 return문으로 종료시킬 것임.

여기서 return문은 main 함수가 운영체제에 값을 반환하게 함.

switch문에서 return문이 사용될 때, return문 뒤의 구문들은 실행될 수 없기 때문에

break문은 굳이 쓰지 않았음. 몇몇 컴파일러는 return문 뒤에 구문이 있으면 경고하기도 함.

 

 

 

'C' 카테고리의 다른 글

KNK Chap.7 (7.1)  (1) 2022.12.19
KNK Chap.6 (6.5~Q&A)  (0) 2022.12.19
KNK Chap.6 (6.3)  (0) 2022.12.16
KNK Chap.6 (6.2)  (0) 2022.12.16
KNK Chap.6 (6.1)  (0) 2022.12.16
Comments