[C언어] 반복 실행을 명령하는 반복문

김민정·2024년 7월 25일
0
post-thumbnail

Chapter 07. 반복실행을 명령하는 반복문

이번 Chapter에서는 C언어에서 제공하는 3개의 반복문을 배운다. (while문, do~while문, for문)
세 개가 유사하기 때문에 가장 단순한 구조인 while문을 시작으로 반복문의 기본 원리를 이해하는 것이 중요하다.

07-1 "while문에 의한 문장의 반복"

반복문이란? 같은 명령을 여러번 내릴 때 사용하는 것이다.

while문의 기본구성

while문은 특정조건을 주고 그 조건을 만족하는 동안, 특정영역을 계속해서 반복하는 구조다.

while(num<3)	// 반복 조건
{
	printf("Hello world! \n");	// 반복할 내용
    num++;
}

위의 간단한 예시가 바로 while문이다.
while문의 소괄호 안에는 반복의 조건을 명시하고, 중괄호 안에는 반복 실행되는 코드를 넣으면 된다.
num++;문은 num의 값에 +1을 한다는 의미다.
이런식으로 반복하다보면 num 값이 3이 되면 while문 조건을 충족하지 않게 되어 반복문에서 벗어나게 된다.
글로 설명한 것을 예제를 통해 확인해보자.

#include <stdio.h>

int main()
{
	int Num = 0;

	while (Num < 5)
	{
		printf("Hello world! %d \n", Num);
		Num++;
	}
	return 0;
}

num이 0부터 시작됐으므로 총 문장 5번이 출력이 된다.
여기서, Num++;문장이 없다면 while문 반복이 멈추지 않는 무한루프에 빠지게 된다.
(이 상황에서 탈출하려면 Ctrl+c를 누르면 된다.)
따라서, 반복문의 구성에 있어 중요한 것 중 하나는 '반복의 조건을 무너뜨리기 위한 최소한의 연산'이다.

반복문 안에서도 들여쓰기는 해야한다. 기본적으로 main 함수의 안(중괄호 안)에서 들여쓰기를 했는데 while문도 중괄호 안이 들여쓰기 된다.
(사실상 문장의 끝에 ;가 없으면 다음 줄에서 들여쓰기 된다 라고 이해하면 편하다!)

그리고 아래와 같이 반복할 문장이 한 문장일 경우 중괄호 생략이 가능하다! (들여쓰기는 그대로)
그렇다고 중괄호의 생략을 위해 무리하게 한줄로 코드를 줄일 필요는 없다.

while (Num < 5)
	printf("Hello world! %d \n", Num), num++;

while문의 실행흐름

while문의 실행 순서를 세세하게 봐보자!

이번에는 구구단 예제를 통해 한번 더 이해해보자.

#include <stdio.h>

int main()
{
	int dan = 0, num = 1;
	printf("몇 단? ");
	scanf_s("%d", &dan);

	while (num < 10)
	{
		printf("%d x %d = %d \n", dan, num, dan * num);
		num++;
	}
	return 0;
}

while문을 도식적으로 표현하면 다음과 같다.
이러한 형태의 그림을 가리켜 순서도(flow chart)라 한다.
순서도란? 시간의 흐름을 중심으로 프로그램의 구성을 디자인할 때 사용하는 약속된 기호다.

무한루프의 구성

위 예제와 같이 숫자 1은 '참'을 의미하므로 반복문의 조건은 계속해서 '참'이 된다.
반복문의 탈출조건이 성립하지 않는 경우 무한루프를 형성한다.
이러한 무한루프는 실수로 만들어지는 경우도 있지만, break문과 함께 유용하게 사용되기도 한다.

while문의 중첩

while문 안에 while문을 넣어(중첩) 구구단을 2단부터 10단까지 알아서 출력하게 할 수 있다.

#include <stdio.h>

int main()
{
	int gugudan = 2, newdan = 0;

	while (gugudan < 10)	// 2단 부터 9단까지 반복
	{
		newdan = 1;	// 새로운 단 시작을 위함.
		while (newdan < 10)
		{
			printf("%d X %d = %d \n", gugudan, newdan, gugudan * newdan);
			newdan++;
		}
		gugudan++;	// 다음 단을 넘어가기 위한 증가
	}	// 구구단 반복 예시 (While문의 중첩)
	return 0;
}


07-2 "do ~ while문에 의한 문장의 반복"

do ~ while문은 while문과 마찬가질로 반복문이지만, '반복의 조건을 검사하는 시점'에서 차이가 있다.

do~while문의 기본구성

do~while문은 while문과 달리 '반복조건'을 뒷부분에서 검사한다.
whiler문은 처음부터 '반복조건'을 만족하지 못하면 '반복영역'을 한번도 실행하지 않았다.
반면에, do~while문은 반복조건을 뒷부분에서 검사하기 때문에 반복영역을 최소한 한번은 실행하는 구조다.

do~while문의 실행흐름

do~while문의 실행 순서를 살펴보자!

반복문끼리의 변환

앞서 소개한 구구단 예제를 while문에서 do~while문으로 바꿀 수 있다.

#include <stdio.h>

int main(void)
{
	int dan=0, num=1;
	printf("몇 단? ");
	scanf("%d", &dan);
	
	do 
	{
		printf("%d×%d=%d \n", dan, num, dan*num);
		num++;
	}while(num<10);
	return 0;
}

do~while문을 사용하는 경우가 '반복영역이 무조건 한 번 이상 실행되어야할 때'다.

예시로 사용자가 정수를 입력하면 계속 더해가다 0을 입력하는 순간 종료되는 것이다.
최소 한번은 사용자가 입력되어야한다.

#include <stdio.h>

int main()
{	
	int Total = 0, Num = 0;

	do
	{
		printf("정수 입력(0입력시 종료): ");
		scanf_s("%d", &Num);
		Total += Num;
	} while (Num != 0);
	printf("합계: %d \n", Total);
	return 0;
}

do~while문의 순서도는 다음과 같다.


07-3 "for문에 의한 문장의 반복"

for문은 while문이나 do~while문과 달리 반복을 구성하기 위해 필요한 모든 것을 한데 묶을 수 있도록 만들어진 반복문이다.
따라서, 특정상황에서 while문이나 do~while문보다 편하게 반복문을 구성할 수 있도록 설계되었다.

for문의 기본구성

while문을 보면 반복을 하기위해 필수요소가 3가지 존재한다.

  • 필수요소 1. 반복을 위한 변수의 선언 ex) int num=0;
  • 필수요소 2. 반복의 조건검사 ex) (num<3)
  • 필수요소 3. 반복의 조건을 '거짓'으로 만들기 위한 연산 ex) num++;

for문은 이 세가지 요소를 한 곳에 모아둔 것이다.

  • 필수요소1 → 초기식 : 반복을 위한 변수의 선언 및 초기화에 사용
  • 필수요소2 → 조건식 : 반복의 조건을 검사하는 목적으로 선언됨
  • 필수요소3 → 증감식 : 반복의 조건을 '거짓'으로 만드는 증가 및 감소연산

따라서 while문으로 나타냈던 문장으로 for문으로 나타내면 아래와 같다.

하지만 최근 초기식에서 변수 선언을 허용하지 않으므로 아래와 같이 작성할 수 있다.

그리고 for문도 반복영역이 한 줄이면 중괄호 생략이 가능하다.

for문의 실행흐름

for문은 다음과 같은 실행 특성을 가지고 있다.

  • 초기식(1) : 본격적으로 반복을 시작하기에 앞서 딱 한번 실행된다.
  • 조건식(2) : 매 반복의 시작에 앞서 실행되고, 그 결과를 기반으로 반복유무를 결정한다.
  • 증감식(4) : 매 반복실행 후 마지막 연산으로 이루어진다.

그렇다면 for문이 while문 보다 간결하므로 더 좋은걸까?
for문은 '반복의 횟수가 정해진 경우 좋다.' 다만, 사용자가 임의의 값을 입력하여 반복문이 실행된다면 while문이 더 자연스럽다.

for문의 예제로 0이상, 프로그램 사용자가 입력한 정수 이하의 값을 모두 더해 출력하는 예제다.

#include <stdio.h>

int main()
{	
	int Total = 0;
	int i, Num;
	printf("0부터 Num까지의 덧셈, Num 입력: ");
	scanf_s("%d", &Num);

	for (i = 0; i < Num + 1; i++)
	{
		Total += i;
	}	// 중괄호 생략 가능.

	printf("0부부터 Num까지의 덧셈 결과: %d\n", Total);
    return 0;
}

다음 예제는 사용자가 입력하는 실수의 평균값을 출력한다. 음의 실수 값이 입력될 때까지 계속되며 음의 실수가 입력되었을 땐 입력이 마무리되고 평균 값에서는 제외된다.

#include <stdio.h>

int main()
{	
	double TOTAL = 0.0, input = 0.0;
	int NUM = 0;

	for (; input >= 0.0;)
	{
		TOTAL += input;
		printf("실수 입력 ('-' to quit): ");
		scanf_s("%lf", &input);
		NUM++;
	}
	printf("평균: %f \n", (double)TOTAL / (NUM-1));
    return 0;
}

이번 예제에서는 for문에서 초기식과 증감식이 없다는 것을 알 수 있다.
필요하지 않으면 채우지 않아도 된다!

그리고 조건식이 비워지면 어떻게 될까?
for문의 조건식이 비워지면 무조건 '참'으로 인식이 되어 무한루프를 형성하게 된다.

for문의 중첩

while문의 중첩과 동일하게 for문의 중첩도 가능하다.
while문에서 사용했던 예제를 for문으로 변환해보자.

#include <stdio.h>

int main()
{
	for (gugudan = 2; gugudan < 10; gugudan++)
	{
		printf("<%d단>\n", gugudan);
		for (newdan = 1; newdan < 10; newdan++)
			printf("%d X %d = %d \n", gugudan, newdan, gugudan * newdan);
		printf("\n");
	}
	return 0;
}


<Review>

이전 chapter까지는 C언어의 기본적인 자료형, 연산자 그리고 입력과 출력에 대한 것을 배웠다.
이번 chapter부터는 이해하고 활용해야하는 내용들로 진행이 된다. 생각을 요구할 수록 이전 개념들에 대한 이해가 더 필요할 것이다.
이렇게 응용되고 심화되는 순간에 난 배움이란 걸 느낄 수 있어서 재밌다!
게임에서 레벨업해서 새로운 스킬을 하나씩 배우는 느낌이랄까😉

while문과 for문은 python에서 사용해서 알고 있었지만 do~while문의 존재는 완전히 까먹고 있었다. 다시 공부해보길 잘했다는 생각이 든다.(●'◡'●)

profile
백엔드 코린이😁

0개의 댓글

관련 채용 정보