중첩 반복문

중첩

중첩 반복문의 개념

중첩 반복문은 반복문 안에 반복될 문장으로 또 반복문이 포함된 것입니다.
예컨대 하나의 line에 #기호 5개를 출력하는 코드를 반복될 문장으로 봅니다.
그리고, 이 문장을 3번 출력하면 중첩 반복문이 되는 것입니다. 아래 예제를 봅시다.

1.#include <stdio.h>

2.int main(void)
3.{
4.	int i, j;                //반복 횟수 제어 변수 선언
5.
6.	for (i = 0; i < 3; i++)    // i가 0부터 2까지 증가하면서 3번 반복
7.	{
8.		for (j = 0; j < 5; j++) //j가 0부터 4까지 증가하면서 5번 반복
9.		{
10.			printf("#");         // # 출력문
11.		}
12.		printf("\n");            // #을 5번 출력한 후에 줄을 바꾼다.
13.	}
14.
15.	return 0;
16.}

위 코드를 보면 for 문 안에 또 다른 for문이 있습니다. 중첩 for문입니다. 6행의 첫째 for 문이 3회 반복을 합니다. 8행의 둘째 for문이 5회를 반복합니다.
즉 , 8행에서 11행까지는 #기호를 5번 출력합니다. 이 반복문을 6행의 for문에서 다시 3번 더 반복합니다. 따라서 모두 15번 #이 출력 됩니다. 12행의 출력문은 #이 5번 출력 된 후에 줄을 바꾸어 주는 역할을 합니다. i값이 변경 될 때마다 8행 for문의 j값이 다시 0 부터 시작되는 것을 주의 해야 합니다.
위 예제의 결과는 다음과 같습니다.
#####
#####
#####

중첩 반복문의 제어 변수

각 반복문은 서로 다른 독립적인 제어 변수를 사용해야 합니다.
각 반복문이 각자 원하는 횟수를 반복할 수 있기 때문입니다. 예컨대 , 다음 예제를 봅시다.

1.for(i=0 ; i<3 ; i++)
2.{
3.    for(i=0 ; i<5 ; i++)
4.    {
5.         printf("#");
6.     }
7.}

중첩 for문이 반복 횟수 제어 변수로 동일한 변수 i 를 사용한 예제입니다.
얼핏 보면 1행의 바깥쪽 for문이 3번 반복 되고 3행의 안쪽 for문이 5번 반복 되는 것으로 보입니다.
따라서 , #기호가 총 15 번 출력 될 것 같습니다.
그러나 , 실행 결과는 #이 5 번 출력 됩니다.
왜냐하면 안쪽 for문이 반복 되어 바깥쪽 for문의 제어 변수 i도 그 영향을 받기 때문입니다.
안쪽 for 문의 반복이 종료되어 6행을 빠져 나오면 i 값은 5 입니다.
그러면 바깥쪽 for문도 i값이 6이 되므로 1행의 조건식 (i < 3)을 충족할 수 없고 반복은 종료 됩니다.

구구단 출력 예제

중첩 반복문을 사용하여 구구단을 출력하는 코드를 만들어 봅시다.
구구단은 2단부터 9단까지 입니다. 일단 한 개의 단을 출력하는 코드를 만들고 그 코드를 8번 반복합니다.
printf(“2 * %d = %d\n” , 1 , 2 * 1) ; //2*1=2를 출력합니다.

원하는 횟수만큼 반복합니다.
for ( j=0 ; j < 9 ; j++) //출력문 9번 반복
{
printf (“2 * %d = %d\n” , 1 , 2 * 1) ;
}

수식이 출력 될 때마다 두 번째 곱해지는 값이 1부터 하나씩 증가합니다.
따라서 이 변화를 반영합니다.
for ( j=1 ; j <= 9 ; j++)
{
printf (“2 * %d = %d\n” , j , 2 * j) ;
}

2 단을 출력하는 코드를 작성하였습니다.
이제 모든 단을 출력하기 위해 위의 코드를 8번 반복합니다.
for (i=0 ; i < 8 ; i++)
{
for ( j=1 ; j <= 9 ; j++)
{
printf (“2 * %d = %d\n” , j , 2 * j) ;
}
}
바깥쪽 for문이 반복될 때마다 2단 이외에 다음 단이 출력 되도록 i값을 활용합니다.

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