중첩 반복문은 반복문 안에 반복문이 포함되어 있는 형태를 말합니다. 중첩 반복문에는 중첩 for문과 중첩 while문이 있습니다. 이번 페이지에서는 중첩 for문에 대해 알아보겠습니다.
중첩 for문의 구조
for(초기조건1; 종결조건1; 증감식1) //외부 반복문
{
for(초기조건2; 종결조건2; 증감식2) //내부 반복문
{
반복할 명령문;
}
}
for(초기조건1; 종결조건1; 증감식1)에 해당하는 반복문을 외부반복문, for(초기조건2; 종결조건2; 증감식2)에 해당하는 반복문을 내부 반복문이라고 합니다. 시계의 초침이 한 바퀴 돌면 분침이 한 칸 움직이는 것처럼 내부 반복문의 루프가 끝나고 나면 외부 반복문이 한 번 증가 또는 감소합니다.
중첩 for문의 예제
(1단계) 예제 : i, j 값 출력하기
출력 결과
코드
#include <stdio.h>
int main(){
int i, j;
for(i=1;i<=3;i++){ //외부 for()문
printf("i=%d\n", i); //i값 출력
for(j=1;j<=5;j++){ //내부 for()문
printf("\tj=%d\n", j); //j값 출력
}
}
return 0;
}
i에 대한 외부 for()문은 6행의 printf()문의 내용(i의 값)을 출력하고 7행에서 j에 대한 내부 for()문을 만납니다. 내부 for()문은 j의 값을 1부터 5까지 출력하며 내부 for()문이 완료되면, i에 대한 외부 for()문으로 돌아가서 i의 값이 1 증가 합니다. 종결조건이 '참(true)'이라면 다시 6행의 printf()문이 실행되고 j에 대한 내부 for()문을 만나 5회 수행합니다. i의 값이 3이 될 때까지 반복 수행하며, 프로그램이 종료될 때까지 8행의 printf()문은 총 15회 실행됩니다. j에 대한 내부 for()문이 시계 바늘의 초침이라면 i에 대한 외부 for()문은 분침이라 할 수 있습니다.
(2단계) 예제 : 구구단 출력하기
출력 결과
코드
#include <stdio.h>
int main(){
int i, j;
for(i=2;i<10;i++){ //외부 for()문
printf("=== %d단 ===\n", i); //각 '단'의 제목출력, i의 값은 '단'수
for(j=1;j<10;j++){ //내부 for()문
printf("%d * %d = %d\n", i, j, i*j); //곱셈표 출력
}
}
return 0;
}
2단부터 9단까지 구구단 곱셈표를 출력하는 프로그램입니다. 외부 for()문의 i값으로는 2단, 3단, 4단,..., 9단까지의 '단' 수를 만들어내고, 5행에서 각 단의 제목을 출력합니다. 내부 for()문의 j값으로는 각 단에 곱해지는 수 1부터 9까지를 만들어 내고, 7행에서는 각 단에 1부터 9까지 곱해지는 곱셈표를 출력합니다.
(3단계) 예제1 : 별 사각형 출력
출력 결과
코드
#include <stdio.h>
int main(){
int i, j;
for(i=1;i<=5;i++){ //별의 출력 행을 결정(외부 for()문)
for(j=1;j<=5;j++){ //별의 출력 갯수를 결정(내부 for()문)
printf("*");
}
printf("\n");
}
return 0;
}
i의 값이 1일 때 내부 for()문이 5회 반복되며 별('*')이 5개 출력됩니다. 내부 for()문 종료 후 9행에서 new line(\n)을 출력하여 줄바꿈을 한 뒤 i의 값이 1증가 하고 두 번째 줄의 별('*')이 5개 출력됩니다. 외부 for()문이 모두 수행되면 다섯줄에 별('*')이 각각 5개씩 출력되어 사격형의 모양을 이루게 됩니다.
(3단계) 예제2 : 별 직각삼각형 출력
출력 결과
코드
#include <stdio.h>
int main(){
int i, j;
for(i=1;i<=5;i++){ //별의 출력 행을 결정(외부 for()문)
for(j=1;j<=i;j++){ //별의 출력 갯수를 결정(내부 for()문)
printf("*");
}
printf("\n");
}
return 0;
}
별 사각형과는 다르게 각 행에 출력되는 별의 갯수가 변화하여 출력됩니다. 첫 번째 줄에는 1개, 두 번째 줄에는 2개, 세 번째 줄에는 3개, 네 번째 줄에는 4개, 다섯 번째 줄에는 5개의 별이 출력되어 있습니다. i의 값이 1일 때 즉, 첫 번째 줄 출력 시 j에 대한 내부 for()문이 한 번만 반복된다면 별을 1개 출력할 것입니다. i의 값이 2일 때 즉, 두 번째 줄 출력 시 j에 대한 내부 for()문이 두 번 반복된다면 별을 2개 출력할 것입니다. 이렇게 내부 for()문의 반복 횟수가 1, 2, 3, 4, 5로 변화 된다면 별의 갯수를 1개부터 5개까지 증가시키며 출력할 수 있습니다. 위의 코드에서는 6행 내부 for()문의 종결 조건에서 1부터 5까지 변화되는 i의 값을 넣어줌으로써 요구하는 조건을 만족시키고 있습니다.
(3단계) 예제3 : 별 직각역삼각형 출력
출력 결과
코드
#include <stdio.h>
int main(){
int i, j;
for(i=1;i<=5;i++){ //별의 출력 행을 결정(외부 for()문)
for(j=5;j>=i;j--){ //별의 출력 갯수를 결정(내부 for()문)
printf("*");
}
printf("\n");
}
return 0;
}
별 직각삼각형과 대칭이 되는 형태로 별의 갯수가 5개, 4개, 3개, 2개, 1개로 줄어드는 모양입니다. 앞서 설명한 바와 같이 별의 갯수는 j에 대한 내부 for문과 상관관계가 있으므로 j의 조건을 변화시켜 반복 횟수를 조절한다면 직각 역삼각형의 모양으로 출력할 수 있을 것입니다. j의 값을 5부터 변수 i의 값까지 1씩 감소하는 형태로 반복 횟수를 설정하여 5번, 4번, 3번, 2번, 1번 씩 별('*')을 출력하므로 역삼격형 모양이 출력되었습니다. 이 방법 외에도 반복 횟수를 조절하는 방법은 여러가지가 있습니다.
그 외 방법1
#include <stdio.h>
int main(){
int i, j;
for(i=5;i>=1;i--){
for(j=1;j<=i;j++){
printf("*");
}
printf("\n");
}
return 0;
}
그 외 방법2
#include <stdio.h>
int main(){
int i, j;
for(i=1;i<=5;i++){
for(j=i;j<=5;j++){
printf("*");
}
printf("\n");
}
return 0;
}
(4단계) 예제 : 별 피라미드(삼각형) 출력
출력 결과
코드
#include <stdio.h>
int main(){
int i, j;
for(i=1;i<=5;i++){ //행 지정
for(j=4;j>=i;j--){ //공백 출력
printf(" ");
}
for(j=1;j<=i*2-1;j++){ //별 출력
printf("*");
}
printf("\n");
}
return 0;
}
앞서 나온 3단계 예제에서 추가로 고려해야 할 부분이 생겼습니다. 바로 공백입니다. 첫 번째 행을 자세히 살펴보면 별 하나를 출력하기 전에 공백을 먼저 출력합니다. 두 번째 행도 마찬가지 입니다. 공백은 4칸, 3칸, 2칸, 1칸으로 1칸씩 감소하여 출력되며, 별('*')은 1개, 3개, 5개, 7개, 9개로 2개씩 증가하여 출력됩니다. 공백 출력 후 별을 출력하고 그 뒤 new line(\n)을 출력하는 것이 반복됩니다. 따라서, {공백, 별, \n}의 구문이 하나의 세트로 5번 반복(외부 for()문)됩니다. 공백을 출력하는 j의 값은 4, 3, 2, 1회로, 별을 출력하는 j의 값은 1, 3, 5, 7, 9로 반복 횟수를 설정하면 출력 결과와 같은 피라미드 모양의 별('*')이 출력됩니다.
'C 언어 프로그래밍 > 흐름제어 - 반복문' 카테고리의 다른 글
while()문 (0) | 2020.06.16 |
---|---|
for()문 (4) | 2020.06.16 |
댓글