반복문 (2)

이지우·2022년 5월 12일
1

C언어

목록 보기
6/17

반복문은 다른 반복문 안에 겹쳐서 사용할 수 있다. 중첩 반복문은 반복문을 반복하여 실행하게 된다.

분기문을 이용하여 반복이 진행되는 중간에 반복문의 실행을 바꿀 수 있다.
break을 사용하여 반복을 끝내거나 continue로 반복 문장의 일부를 건너뛸 수 있다.


중첩 반복문

반복문 안에 샐행할 문장으로 반복문이 포함된 것이다.

  1. 별 5개를 그린다
  2. 1.을 3번 반복한다.

여기서 별 5개를 그리는 것도 반복이기 때문에 다음과 같이 바꿀 수 있다.

  1. 별 1개를 그린다.
  2. 1.을 5번 반복한다.
  3. 2.를 3번 반복한다.

이러면 중첩 반복문이다.

▼ 중첩 반복문을 사용한 별 출력

#include <stdio.h>

int main()
{
	int i, j;					// 반복 횟수를 세기 위한 제어 변수
    
    for (i = 0; i < 3; i++)		// i가 0부터 2까지 증가하면서 3번 반복
    {
    	for (j = 0; j < 5; j++)	// j가 0부터 4까지 증가하면서 5번 반복
        {
        	printf("*");		// 별 출력문
        }
    	printf("\n");			// 별을 5번 출력한 후에 줄 바꿈
    }
]

실행 결과

*****
*****
*****

i 값이 바뀔 때마다 안쪽 for문의 초기식에 의해서 j 값이 다시 0부터 시작된다.

i = 0, j = 0, 1, 2, 3, 4 -> printf("*");  5번 실행
       j = 5             -> printf("\n"); 1번 실행
       
i = 1, j = 0, 1, 2, 3, 4-> printf("*");   5번 실행
       j = 5             -> printf("\n"); 1번 실행

i = 2, j = 0, 1, 2, 3, 4-> printf("*");   5번 실행
       j = 5             -> printf("\n"); 1번 실행

중첩 반복문 사용 시 주의점

각 반복문에 서로 독립적인 제어 변수를 사용해야 한다.

for (i = 0; i < 3; i++)
{
	for (i = 0; i < 5; i++)
    {
    	printf("*");
    }
    printf("\n");
}

위의 예제에서 안쪽 for문의 제어 변수를 i로 변경하면 실행 결과가 달라지게 된다.

실행 결과

*****

2개의 for문의 제어 변수가 같으므로 안쪽 for문의 반복이 끝났을 때 i가 5가 되고 밖의 for문의 증감식으로 6이 되면 조건식이 거짓이 되어 반복이 끝나버린다.

중첩 반복문으로 구구단 출력하기

구구단의 2단부터 9단까지 8개를 반복으로 출력하기 위해 1개의 단을 출력하는 코드를 만들고 8번 반복하게 만든다.

1. 반복되는 기본 문장을 찾아서 구현한다.
2단의 첫 번째 줄을 다음과 같이 쓸 수 있다.

printf("2 * %d = %d\n", 1, 2 * 1);		// 2 * 1 = 2를 출력

2. 원하는 횟수만큼 반복한다.
위에서 만든 식을 9번 반복시킨다.

for ( j = 0; j < 9; j++)				// 출력문을 9번 반복
{
	printf("2 * %d = %d\n", 1, 2 * 1);	// 2 * 1 = 2를 출력
}

3. 반복 규칙을 적용한다.
2단의 다음줄로 넘어갈때마다 증감식으로 j 값이 증가되는 것을 이용하여 코드를 수정한다.

for ( j = 0; j < 9; j++)				// 출력문을 9번 반복
{
	printf("2 * %d = %d\n", j +1, 2 * 1);	// j를 곱하는 값으로 활용
    										// j가 0~8이므 j+1로 작성 
}

1개의 단을 출력하는 코드 완성

4. 구구단의 모든 단을 출력하기 위해 이 코드를 8번 반복한다.

for (i = 0; i < 8; i++)		// 8번 반복
{
	for ( j = 0; j < 9; j++)
	{
		printf("2 * %d = %d\n", j +1, 2 * 1);
	}
}

이 코드를 실행하면 2단만 8번 반복된다.
i 값이 변경될 때마다 다음 단으로 변경되기 위해 j-for문에서 출력문에 i를 활용하도록 수정한다.

for (i = 0; i < 8; i++)		// i가 0~7까지 8번 반복
{
	for ( j = 0; j < 9; j++)
	{
		printf("%d * %d = %d\n", i +2, j +1, 2 * 1);
	}
}

break

break는 반복문 안에서 반복을 즉시 끝낼 때 사용한다.

모든 반복문은 조건식이 거짓일 때 반복이 끝난다.
예외적으로 어떠한 조건에서 반복이 끝나도록 하고 싶을 때 break를 사용한다.

▼ 1부터 10까지 더하는 도중 총합이 30이 넘으면 반복 중단

#include <stdio.h>

int main()
{
	int i;
	int sum = 0;		// 1부터 10까지의 합을 누적할 변수
    
    for (i = 1; i <= 10; i++)	// i는 1~10까지 증가하면서 10번 반복
    {
    	sum += i;					// i 값을 sum에 누적
    	if (sum > 30)				// 누적된 값이 30보다 크면 반복문을 끝냄
        	break;
    }
    printf("누적한 값 : %d\n", sum);
    printf("마지막으로 더한 값 : %d\n", i);
}

실행 결과

누적한 값 : 36
마지막으로 더한 값 : 8

break는 자신을 포함하는 반복문만 벗어나기 때문에 중첩 반복문에서 break를 사용한 경우 그 블록을 포함한 반복문만 벗어난다.

while (...)
{
	for (...)
    {
    	...
        if ( 조건식 )
        	break;		// for문만 벗어남
    }
}

break로 무한 반복문 빠져나오기

반복문의 조건이 항상 참이 되도록 만들면 무한 반복문이 된다.

while (1)
{
	printf("Hello, world!\n");
}
for (;;)
{
	printf("Hello, world!\n");
}

조건에 따라 break를 사용하여 무한 반복을 끝낼 수 있다.

int count = 0;
while (1)
{
	printf("Hello, world!\n");
    count++;				// 반복될 때마다 1씩 증가
    if (count == 5) break;	// count 값이 5가 되면 break로 반복 종료 (5번 반복되고 종료됨)
}

continue

continue는 반복문의 일부를 건너뛴다.
continue를 만나면 다음 실행 위치가 반복문 블록의 끝이 된다.

3의 배수를 빼고 1부터 100까지의 합을 구할 경우

for (i = 1; i <=100; i++)
{
	if((i%3) == 0)	// i가 3의 배수일 때
    {
    	continue;	// sum += i; 문장을 건너뛰고 다시 반복
    }
    sum += i;
}

continue를 만나면 다음에는 그 뒤의 코드를 무시하고 for문의 증감식이 실행된다.

while문에서 continue를 사용하면 다음 실행 위치가 조건식이 된다. 위 코드를 while문으로 바꾸면 증감식을 무시하게 되어 무한 반복되어버린다.

i = 1;
while (i <=100)
{
	if((i%3) == 0)	// i가 3의 배수일 때
    {
    	continue;	// 증감식을 건너 뛰어서 조건식이 계속 참이 된다.
    }
    sum += i;
    i++;
}
profile
노력형 인간

0개의 댓글