C Programming Ch7 : 반복문

1. 반복의 개념

반복(iteration)

  • 같은 내용의 처리 과정을 여러 번 되풀이하는 것을 의미한다.

  • 프로그램에서의 반복적인 작업은 반드시 필요하다.

반복 구조

  • 어떤 조건이 만족될 때까지 루프 형태로 반복하여 도는 구조이다.

반복문의 종류

  • while 루프

    • 주어진 조건이 만족되면 반복을 계속 진행하는 구조이다.

    • 반복 횟수를 알 수 없고 조건에 따라서 반복을 제어하여야 할 때에 사용된다.

  • for 루프

    • 정해진 횟수만큼 반복을 제어하여야 할 때에 사용된다.


2. while 문

while 문

  • 주어진 조건이 만족되는 동안 문장들을 반복하여 실행하는 구조이다.

while 문을 사용한 예제

while 문의 실행 과정

  1. while 문의 조건식을 확인한다.

  2. 조건식이 참인 경우에 while 문 내부의 문장들을 실행한다. 이때, 문장들이 실행되는 도중에 조건식의 값을 변형시키는 방법이 가장 일반적으로 사용된다.

  3. 문장 실행이 모두 완료되면 조건식을 다시 확인한다.

  4. 3에서 확인 결과가 거짓일 때까지 1~3을 반복한다.

  5. 3에서 결과가 거짓인 경우에는 while 문에서 빠져나온다.

예제 : while 문을 활용한 구구단 출력 프로그램

// gugu.c
/* while 문을 이용한 구구단 출력 프로그램 */
#include <stdio.h>

int main(void)
{
	int n;
	int i = 1;

	printf("출력하고 싶은 단: ");
	scanf("%d", &n);

	while (i <= 9) {
        printf("%d x %d = %d \n", n, i, n * i);
		i++;
	}

	return 0;
}

출력하고 싶은 단: 9
9 x 1 = 9
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81

예제 : while 문을 활용한 합계 프로그램

// sum1.c
/* while 문을 이용한 합계 프로그램 */
#include <stdio.h>

int main(void)
{
	int i, n, sum;

	i = 0;				// 변수 초기화
	sum = 0;			// 변수 초기화
	while (i < 5)
	{
		printf("값을 입력하시오: ");
		scanf("%d", &n);
		sum = sum + n;	// sum += n;과 같다.
		i++;
	}
	printf("합계는 %d입니다.\n", sum);

	return 0;
}

값을 입력하시오: 10
값을 입력하시오: 20
값을 입력하시오: 30
값을 입력하시오: 40
값을 입력하시오: 50
합계는 150입니다.

while 문에서 주의할 점

  • 반복 루프를 생성하기 위해서 중괄호를 반드시 작성해야 한다.
int i=0;
while(i < 3) // 중괄호 존재 x
    printf("반복중입니다.\n"); 
    i++;
  • 조건 뒤에 세미클론 ';'이 있으면 반복문이 실행되지 않는다.
int i = 0;
while(i < 3); // 하나의 문장으로 취급되므로 해당 문장만 반복
{
    printf("반복중입니다.\n");
    i++;
}
  • 조건식의 변수를 제어하는 문장이 while문에 존재하지 않으면, 반복이 무한히 지속되는 무한 루프(infinite loop) 현상이 이루어진다.
int i = 0;
while(i < 3) 
{
    printf("반복중입니다.\n");
}

예제 : while 문의 조건식에서 참과 거짓의 처리

  • while 문의 조건식에서는 0이 아닌 값들을 전부 참이고, 0을 거짓으로 처리한다.
#include <stdio.h>

int main(void)
{
	int i = 3;
	while (i) // while(i != 0) 과 같은 의미
	{
		printf("%d는 참입니다.\n", i);
		i--;
	}
	printf("%d은 거짓입니다.\n", i);

	return 0;
}

3는 참입니다.
2는 참입니다.
1는 참입니다.
0은 거짓입니다.

if 문과 while 문의 비교

3. 센티널(보초값)의 이용

센티널(sentinel)

  • 입력되는 데이터의 끝을 알리는 특수한 값을 의미한다.

  • 일반적으로 센티널의 값은 음수(-1)를 사용한다.

예제 : 센티널 값을 활용한 성적의 평균 구하기

// average.c
/* while 문을 이용한 성적의 평균 구하기 프로그램 */
#include <stdio.h>

int main(void)
{
	int grade, n;
	float sum, average;

	// 필요한 변수들을 초기화한다.
	n = 0;
	sum = 0;
	grade = 0;

	printf("성적 입력을 종료하려면 음수를 입력하시오\n");

	// 성적을 입력받아서 합계를 구하고 학생 수를 센다.
	while (grade >= 0)
	{
		printf("성적을 입력하시오: ");
		scanf("%d", &grade);

		sum += grade;
		n++;
	}

	sum = sum - grade; 	// 마지막 데이터를 제거한다. 
	n--;			// 마지막 데이터를 제거한다. 
	// 평균을 계산하고 화면에 출력한다.
	average = sum / n;
	printf("성적의 평균은 %f입니다.\n", average);

	return 0;
}

성적 입력을 종료하려면 음수를 입력하시오
성적을 입력하시오: 10
성적을 입력하시오: 20
성적을 입력하시오: 30
성적을 입력하시오: 40
성적을 입력하시오: 50
성적을 입력하시오: -1
성적의 평균은 30.000000입니다.

예제 : 최대 공약수 구하기

// gcd.c
/* while 문을 이용한 최대 공약수 구하기 프로그램 */
#include <stdio.h>

int main(void)
{
	int x, y, r;

	printf("두개의 정수를 입력하시오(큰수, 작은수): ");
	scanf("%d%d", &x, &y);

	while (y != 0)
	{
		r = x % y;
		x = y;
		y = r;
	}
	printf("최대 공약수는 %d입니다.\n", x);

	return 0;
}

두개의 정수를 입력하시오(큰수, 작은수): 6 2
최대 공약수는 2입니다.

4. do-while 문

do-while 문

  • while 문에서 반복 조건을 루프의 처음이 아니라 루프의 끝에서 검사하여 실행하는 구조이다.

  • 적어도 한 번은 반복문장(do 루프)를 실행한다는 특징을 지니고 있다.

예제 : 숫자 추측 게임

// game.c
/* do-while 문을 활용하여 숫자 알아맞히기 게임을 구현한 프로그램*/
#include <stdio.h>

int main(void)
{
    int answer = 59;     // 정답
    int guess;
    int tries = 0;

    // 반복 구조
    do {
        printf("정답을 추측하여 보시오: ");
        scanf("%d", &guess);
        tries++;

        if (guess > answer)  // 사용자가 입력한 정수가 정답보다 높으면
            printf("제시한 정수가 높습니다.\n");
        if (guess < answer)  // 사용자가 입력한 정수가 정답보다 낮으면
            printf("제시한 정수가 낮습니다.\n");
    } while (guess != answer);

    printf("축하합니다. 시도횟수=%d\n", tries);
    return 0;
}

정답을 추측하여 보시오: 50
제시한 정수가 낮습니다.
정답을 추측하여 보시오: 30
제시한 정수가 낮습니다.
정답을 추측하여 보시오: 57
제시한 정수가 낮습니다.
정답을 추측하여 보시오: 60
제시한 정수가 높습니다.
정답을 추측하여 보시오: 59
축하합니다. 시도횟수=5

5. for 문

for 문

  • 정해진 횟수만큼 반복하여 실행하는 구조이다.

  • for 문은 초기식(initialization), 조건식(expression), 증감식(increment)의 3부분으로 이루어져 있다.

for 문을 사용한 예제

for 문의 실행 과정

  1. for 문에서 초기식이 한 번만 실행된다.

  2. 조건식이 검사되고, 만약 조건식이 참이면 루프(문장)이 실행된다.

  3. 루프의 실행이 끝나면 증감식이 실행된다.

  4. 조건식을 다시 확인한다.

  5. 4에서 확인 결과가 거짓일 때까지 1~3을 반복한다.

  6. 4에서 결과가 거짓인 경우에는 for 문에서 빠져나온다.

예제 : 1~10의 정수합 출력하기

// sum_for.c
/* 반복을 이용한 정수합 프로그램 */
#include <stdio.h>

int main(void)
{
	int sum;

	sum = 0;
	for (int i = 1; i <= 10; i++)		// i는 1부터 10까지 증가
		sum += i;			// sum = sum + i;와 같음

	printf("1부터 10까지의 정수의 합= %d\n", sum);

	return 0;
}

1부터 10까지의 정수의 합= 55

while 루프와 for 루프의 관계

증감수식의 형태 사용

  • for 문에서의 증감식은 주로 증가식이 사용되지만, 때에 따라서는 감소식도 사용 가능하다.

  • for 문에서의 증감식의 증감 범위 역시 조절 가능하다.

  • for 문에서 증감식 부분은 증감 이외에도 다른 연산자(곱셈, 나눗셈, 복합대입 등) 사용이 가능하다.

  • 경우에 따라서 필요한 경우, 증감식 부분에 어떤 수식이라도 사용 가능하다.

  • for 문의 3 부분을 생략하고 세미클론만 작성한 경우에는 무한 반복 루프가 실행되게 된다.

중첩 반복문(nested loop)

  • 반복문 안에 다른 반복문이 위치된 구조를 의미한다.

예제 : 중첩 for 문을 사용하여 x를 사각형 모양으로 출력하기

//nested_loop1.c
/* 중첩 for 문을 이용하여 'x'를 사각형 모양으로 출력하는 프로그램 */
#include <stdio.h>

int main(void)
{

	for (int y = 0; y < 5; y++)		// 바깥 반복문
	{
		for (int x = 0; x < 10; x++)	// 안쪽 반복문
			printf("*");

		printf("\n");			// 안쪽 반복문이 종료될때마다 실행
	}

	return 0;
}

xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx

break 문

  • 반복 루프안에서 빠져 나오는 데 사용한다.

  • 일반적으로 반복문 실행 도중에 특수하게 중단이 필요한 경우에 사용된다.

    예제 : break 문을 사용하여 실수의 제곱근을 출력하기

// square_root.c
/* break를 이용하여 무한루프를 탈출하는 프로그램  */
#include <stdio.h>
#include <math.h>

int main(void)
{
	double v;

	while (1)
	{
		printf("실수값을 입력하시오: ");
		scanf("%lf", &v);

		if (v < 0.0)
			break;

		printf("%f의 제곱근은 %f입니다.\n", v, sqrt(v));
	}

	return 0;
}

실수값을 입력하시오: 9
9.000000의 제곱근은 3.000000입니다.
실수값을 입력하시오: 25.0
25.000000의 제곱근은 5.000000입니다.
실수값을 입력하시오: -1

continue 문

  • 현재 반복을 중단하고 다음 반복을 시작하게 해야 할 때에 사용한다.

예제 : 소문자를 대문자로 변경하는 프로그램

// to_upper.c
/* 소문자를 대문자로 변경하는 프로그램 */
#include <stdio.h>

int main(void)
{
	char letter;

	while (1)
	{
		printf("소문자를 입력하시오: ");
		scanf(" %c", &letter);	// 공백 문자 제외

		if (letter == 'Q')
			break;
		if (letter < 'a' || letter > 'z')
			continue;

		letter -= 32;			// 소문자 -> 대문자
		printf("변환된 대문자는 %c입니다.\n", letter);
	}

	return 0;
}

소문자를 입력하시오: a
변환된 대문자는 A입니다.
소문자를 입력하시오: b
변환된 대문자는 B입니다.
소문자를 입력하시오: c
변환된 대문자는 C입니다.
소문자를 입력하시오: q
변환된 대문자는 Q입니다.
소문자를 입력하시오: Q

좋은 웹페이지 즐겨찾기