c-반복문
C 언어 반복문

지난 시간에는 C언어 조건문을 알아보았습니다. 이번 시간에는 C 언어의 반복문(iterative statements)을 알아보겠습니다. C언어의 반복문에는 for문, while문, do while문, 이중 반복문이 있습니다.

for문은 반복 횟수를 명확히 알거나 배열을 순회할 때 사용하면 좋습니다. while문은 무한루프나 특정 조건을 만족하는지의 여부가 중요할 때 사용하면 좋습니다. do while문은 실행문과 조건식을 분리해서 코드를 깔끔하게 정리하는 데 사용하면 좋습니다. 이중 반복문은 어떤 그룹이 다른 그룹의 반복에 의존하고 있을 때 사용합니다. 이를 정리해보면 다음과 같습니다.

  • for문: 반복 횟수를 명확히 알 때, 배열의 각 원소에 접근하고 싶을 때
  • while문: 무한반복, 특정 조건 만족 여부가 중요할 때
  • do while문: 조건식과 실행문을 깔끔하게 분리하고 싶을 때
  • 이중 반복문: 상위 그룹과 하위 그룹의 관계로 나누어질 때

그럼 지금부터는 각 반복문을 실생활 예제를 통해 살펴보겠습니다.

for문

for문은 반복 횟수를 알고 있거나 배열을 이루는 원소에 접근하고 싶을 때 사용하기 편리합니다. for문의 기본 구조는 다음과 같습니다.

c
for (초기식; 조건식; 변화식)
{
실행문;
}

초기식에서는 변수를 선언합니다. 변수를 선언할 때는 변수의 자료형도 함께 선언합니다.

c
int i = 0;

변수에는 보통 0 또는 1을 할당합니다. 반복 횟수를 계산하기 편리해서 보통 이 두 정수를 사용합니다.

조건식에서는 부등호를 이용해 실행문이 반복될 조건을 정의합니다. 예를 들어 다음과 같이 정의하는 것이죠.

c
i < 100;

변화식에서는 증가 또는 감소 방향을 나타냅니다. 증감은 증감 연산자(increment and decrement operators)를 이용해 표현합니다. 증감연산자는 증가연산자(increment operators) ++와 감소연산자(decrement operators) --를 의미합니다. ++는 변수에 할당된 값을 1씩 증가시킵니다. --는 변수에 할당된 값을 1씩 감소시키는 역할을 합니다.

증감연산자는 위치에 따라 이름과 역할이 달라집니다. 만약 다음과 같이 증감 표현이 변수 뒤에 사용되면 후위 연산자(postfix operators)입니다.

c
i++;
i--;

후위 증감연산자는 변수(i)의 값을 증가나 감소된 수를 해당 구문이 아닌 다음 구문에서 사용합니다. 즉, 코드가 실행된 이후에 변수 값에 증감을 반영하죠.

반면 연산 기호가 변수 앞에 있다면 전위 연산자(prefix operators)입니다. 전위 증감연산자는 연산자가 포함된 구문에서 이미 증감된 연산을 반영해서 연산이 진행됩니다.

c
++i
--i

보통 조건식이 실행된 다음 값에 증감을 반영하는 후위 증감연산자를 사용합니다. 변수에 할당된 값은 변화식에서 표현된 증감연산자의 증감 방향에 따라 1씩 증가하거나 감소합니다. 이러한 작업은 조건식의 결과가 참일 때까지 반복되다가 결과가 거짓이 되면 for문을 벗어납니다. 예제를 통해 알아보겠습니다.

포켓볼 번호 출력하기 1

다음과 같이 포켓볼(pool) 번호를 출력하려고 합니다.

c-언어-반복문-예제-포켓볼
C언어 반복문 예제: 포켓볼 공 번호 부여하기 | Snug Archive

포켓볼에는 총 15개의 공이 있고 각 공에는 1부터 15까지의 정수가 적혀있습니다. 우리는 이 숫자에 "번공"을 붙여서 출력하려고 합니다. 이를 C언어의 for문을 이용해 표현하면 다음과 같습니다.

c
#include <stdio.h>
int main(void)
{
for (int i = 1; i <= 15; i++) {
printf("%d번공\n", i);
}
return 0;
}

while문

while문은 특정 조건을 만족하는지 아닌지가 중요할 때 사용하면 좋습니다. while문에서는 지정한 조건이 거짓이 될 때 while문을 탈출하기 때문입니다. 반복 횟수를 명확히 알 때는 for문을, 조건 만족 여부가 중요할 때는 while문을 사용하면 편리합니다.

while문의 기본 구조는 다음과 같습니다.

c
변수 선언;
while (조건식) { // 조건식의 결과가 참일 때만 명령문 실행
실행문;
}

예제로 알아보겠습니다.

포켓볼 번호 출력하기 2

위에서 for문을 이용해 포켓볼 번호를 출력하는 코드를 while문으로 바꾸면 다음과 같습니다.

c
#include <stdio.h>
int main(void)
{
int i = 1;
while (i <= 15) // 1 ~ 15까지 번호
{
printf("%d번공\n", i++);
}
return 0;
}

이번에는 원하는 값이 나올 때까지 주사위를 굴리는 예제를 while문으로 표현하는 법을 살펴보겠습니다.

주사위 굴리기

우리는 주사위의 숫자가 6이 나올 때까지 주사위를 반복해서 굴리려고 합니다. 다음과 같이 6이 나오지 않으면 "주사위의 수가 n입니다."를 출력하고, 6이 나오면 "주사위의 수가 6입니다! 주사위 던지기를 종료합니다."를 출력하고 싶습니다.

c-언어-반복문-예제-주사위
C언어 반복문 예제: 주사위 굴리기 | Snug Archive

이를 C 언어로 표현하면 다음과 같습니다.

c
#include <stdio.h>
#include <time.h>
int main(void)
{
srand(time(NULL));
int dice = rand() % 6; // dice의 값은 0부터 5사이의 숫자
while (dice != 0)
{
printf("주사위의 수가 %d 입니다.\n", dice);
dice = rand() % 6;
}
printf("주사위의 수가 6입니다! 주사위 던지기를 종료합니다.\n");
return 0;
}

do while문

C 언어의 do while문은 실행할 코드와 조건식을 분리하고 싶을 때, 그리고 조건과 관계없이 한 번은 코드를 실행하고 싶을 때 사용할 수 있습니다. do while문의 기본 코드 구조는 아래와 같습니다.

c
변수 선언;
do {
실행문;
} while (조건식);

do while문에서 사용하는 while 뒤에는 꼭 세미콜론을 붙여야 합니다. 그럼 do while문도 예제를 통해 알아보겠습니다.

포켓볼 번호 출력하기 3

위에서 for문과 while문으로 표현한 포켓볼 번호를 출력하는 코드를 do while문으로 작성하면 다음과 같습니다.

c
#include <stdio.h>
int main(void)
{
int i = 1;
do {
printf("%d번공\n", i++);
} while (i <= 15);
return 0;
}

지금까지 C 언어의 반복문으로 for문, while문, do while문을 예제와 함께 살펴보았습니다. 이번에는 이중 반복문을 살펴보겠습니다.

이중 반복문

이중 반복문(nested iteration statements)은 반복문 안에 반복문이 있는 구조입니다. 이중 반복문을 중첩 반목문, 반복문이 2개인 다중 반복문이라고도 합니다. 이중 반복문의 기본 구조는 다음과 같습니다.

c
#include <stdio.h>
int main(void)
{
for (초기식; 조건식; 변화식;)
{
실행문;
for (초기식; 조건식; 변화식;)
{
실행문;
}
}
}

이중 반복문은 예제로 먼저 살펴보겠습니다. 이중 반복문은 다음과 같이 그룹별로 모든 하위 그룹이 반복되는 구조라고 생각하면 됩니다.

c-언어-반복문-예제-이중반복문-구조
이중 반복문 구조 | Snug Archive

이를 코드로 표현하면 다음과 같습니다.

c
#include <stdio.h>
int main(void)
{
for (int i = 1; i <= 3; i++)
{
printf("그룹 %d:\n", i);
for (int j = 1; j <= 4; j++)
{
printf(" 하위 그룹 %d\n", j);
}
}
}

예제를 통해 살펴보겠습니다.

구구단 만들기

이중 반복문의 대표적인 예제로는 구구단 만들기가 있습니다. 우리는 다음과 같이 구구단을 출력하고자 합니다.

c-언어-for문-예제-이중반복문-구구단
C언어 이중 반복문 예제: 구구단 표현하기 | Snug Archive

2단부터 9단까지 구구단을 출력하는 코드는 다음과 같습니다.

c
#include <stdio.h>
int main(void)
{
for (int i = 2; i <= 9; i++)
{
printf("\n");
printf("%d단\n", i);
for (int j = 1; j <= 9; j++)
{
printf("%d x %d = %d\n", i, j, i * j);
}
}
}

등차수열

이번에는 C언어로 등차수열을 만들어보겠습니다. 등차수열은 수가 증가하는 등차수열과 수가 감소하는 등차수열로 나누어 그려보겠습니다. 등차수열은 별표(*)로 표현했습니다. 먼저 증가하는 등차수열부터 살펴보겠습니다. 우리가 만들려는 수가 증가하는 등차수열의 모양은 다음과 같습니다.

c-언어-이중반복문-등차수열-증가
C언어 이중 반복문 예제: 증가하는 등차수열 | Snug Archive

증가 등차수열1

증가 등차수열1은 가장 기본적인 등차수열 모양입니다. 증가 등차수열1을 만드는 코드는 다음과 같습니다.

c
#include <stdio.h>
int main(void)
{
int layer;
printf("몇 단으로 쌓으시겠습니까?");
scanf_s("%d", &layer);
for (int i = 0; i < layer; i++)
{
for (int j = 0; j <= i; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}

증가 등차수열2

증가 등차수열2는 증가 등차수열1을 좌우 대칭한 모양입니다. 이를 코드로 표현하면 다음과 같습니다.

c
#include <stdio.h>
int main(void)
{
int layer;
printf("몇 단으로 쌓으시겠습니까?");
scanf_s("%d", &layer);
for (int i = 0; i < layer; i++)
{
for (int j = i; j < layer - 1; j++)
{
printf(" ");
}
for (int j = 0; j <= i; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}

증가 등차수열3

증가 등차수열3은 피라미드, 삼각형, 산 모양입니다. 코드는 다음과 같습니다.

c
#include <stdio.h>
int main(void)
{
int layer;
printf("몇 단으로 쌓으시겠습니까?");
scanf_s("%d", &layer);
for (int i = 0; i < layer; i++)
{
for (int j = i; j < layer - 1; j++)
{
printf(" ");
}
for (int k = 0; k < i * 2 + 1; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}

이번에는 반대로 감소하는 등차수열을 만들어보겠습니다. 우리가 만들려는 감소하는 등차수열의 모양은 다음과 같습니다.

c-언어-이중반복문-등차수열-감소
C언어 이중 반복문 예제: 감소하는 등차수열 | Snug Archive

감소 등차수열 1

감소 등차수열1을 만드는 방법은 2가지로 나누어집니다. 하나는 이중 반복문의 내부 반복문에서 ++을 사용하는 것이고, 다른 하나는 --를 사용하는 것입니다. ++를 이용한 코드는 다음과 같습니다.

c
#include <stdio.h>
int main(void)
{
int layer;
printf("몇 단으로 쌓으시겠습니까?");
scanf_s("%d", &layer);
for (int i = 0; i < layer; i++)
{
for (int j = i; j < layer; j++) // ++ 이용
{
printf("*");
}
printf("\n");
}
return 0;
}

--를 이용한 코드는 아래와 같습니다.

c
#include <stdio.h>
int main(void)
{
int layer;
printf("몇 단으로 쌓으시겠습니까?");
scanf_s("%d", &layer);
for (int i = 0; i < layer; i++)
{
for (int j = layer; j > i; j--) // -- 이용
{
printf("*");
}
printf("\n");
}
return 0;
}

감소 등차수열 2

감소 등차수열2 모양을 만드는 코드 예제는 다음과 같습니다.

c
#include <stdio.h>
int main(void)
{
int layer;
printf("몇 단으로 쌓으시겠습니까?");
scanf_s("%d", &layer);
for (int i = 0; i < layer; i++)
{
for (int j = 0; j < i; j++)
{
printf(" ");
}
for (int k = i; k < layer; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}

감소 등차수열 3

감소 등차수열3은 거꾸로 된 삼각형 모양입니다. 거꾸로 된 삼각형 모양의 등차수열을 만들려면 다음 코드를 이용하면 됩니다.

c
#include <stdio.h>
int main(void)
{
int layer;
printf("몇 단으로 쌓으시겠습니까?");
scanf_s("%d", &layer);
for (int i = 0; i < layer; i++)
{
for (int j = 0; j < i; j++)
{
printf(" ");
}
for (int k = i + 1; k < layer * 2 - i; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}

마름모 만들기

이번에는 위에서 배운 등차수열 코드를 이용해 마름모를 만들어보겠습니다. 만들려는 마름모 모양은 다음과 같습니다.

c-언어-이중반복문-마름모
C언어 이중 반복문 예제: 마름모 만들기 | Snug Archive

C언어의 이중 반복문으로 마름모를 만드는 코드는 다음과 같습니다.

c
#include <stdio.h>
int main(void)
{
int layer;
printf("몇 단으로 쌓으시겠습니까?");
scanf_s("%d", &layer);
for (int i = 0; i < layer; i++)
{
for (int j = i; j < layer - 1; j++)
{
printf(" ");
}
for (int k = 0; k < i * 2 + 1; k++)
{
printf("*");
}
printf("\n");
}
for (int i = 0; i < layer; i++)
{
for (int j = 0; j < i + 1; j++)
{
printf(" ");
}
for (int k = i + 1; k < layer * 2 - i - 2; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}

크리스마스트리 만들기

다음 그림과 같이 크리스마스트리를 만들려고 합니다.

c-언어-이중반복문-예제-크리스마스트리
C언어 이중 반복문 예제: 크리스마스 트리 만들기 | Snug Archive

크리스마스트리의 나뭇잎은 * 기호로 표현하겠습니다. 트리의 가장 꼭대기는 별 모양(★)으로 장식하려고 합니다. 장식 기호는 o를 사용하고, 장식은 랜덤으로 달겠습니다. 이를 C 언어로 표현하면 다음과 같습니다.

c
#include <stdio.h>
#include <time.h>
int main(void)
{
srand(time(NULL));
int layer;
printf("크리스마스 트리는 몇 단으로 만들고 싶은가요?");
scanf_s("%d", &layer);
for (int i = 0; i < layer - 1; i++) {
printf(" ");
}
printf("★\n");
for (int i = 1; i < layer; i++)
{
for (int j = i; j < layer - 1; j++)
{
printf(" ");
}
for (int k = 0; k < i * 2 + 1; k++)
{
int decoration = rand() % 2; // 0, 1 정수 반환
switch (decoration)
{
case 0: printf("*"); break;
case 1: printf("o"); break;
default: printf("?"); break;
}
}
printf("\n");
}
return 0;
}

지금까지 C언어의 반복문으로 for문, while문, do while문, 이중 반복문을 살펴보았습니다. 모두 수고 많으셨습니다.

참고 문헌

...

©2022 Snug Archive. All rights reserved.

Contact me at snugarchive@gmail.com.