본문 바로가기

Studying/Computer Programs

C언어 프로그래밍 기초 : 반복문 (for, while)

여기서는 C언어나 C++ 프로그램을 작성할 때 특정한 구문들을 반복해서 실행하는 반복문 (loop)에 대해서 알아봅시다. 반복문의 종류와 더불어 반복을 위한 조건을 설정하는 방법에 대해서도 살펴보겠습니다. 반복문은 복잡한 기능을 구현하기 위한 필수요소인 만큼, 프로그래밍에서의 반복문은 매우 중요한 개념입니다.

 

반응형

 

특정 구문을 계속해서 반복실행할지, 중지시킬지 여부를 결정하기 위해 조건문과 관계연산자가 사용됩니다. 만약 이들이 생소하게 느껴지시는 분들은 시작하기에 앞서서 다음 포스팅을 읽어보시면 큰 도움이 되리라 생각합니다.

 

 

C언어 프로그래밍 기초 : 조건문과 관계 연산자

여기서는 C언어 또는 C++ 프로그램의 특정 연산문을 실행하기 위한 조건을 설정하는 방법과, 이를 위해 필요한 관계 연산자 (relational operator)에 대해서 알아봅시다. 특정한 조건이 만족되면 실행

swstar.tistory.com

 

맨 먼저 for문을 이용한 반복 실행에 대해 알아봅시다. for문은 일반적으로 다음과 같이 사용할 수 있습니다.

 

for ([초기화]; [반복조건]; [연산문]) {
    [실행문1]
    [실행문2]
    ...
}

 

for 뒤에 괄호를 열고 세미콜론 (;)으로 구분된 세 개의 항목을 입력해야 하는데요. 첫번째는 초기화를 위한 실행문, 두번째는 반복문이 실행되는 조건이 필요햡니다. 마지막 세번째는 반복문의 끝에 도달할때마다 실행되는 연산문을 넣어주면 됩니다. 그 다음에 중괄호 ({ })를 열고, 그 안에 반복적으로 실행시키고자 하는 구문들을 순차적으로 입력해주면 되겠습니다.

 

거듭제곱을 계산하는 예시를 통해 이를 좀 더 구체적으로 살펴봅시다.

 

C언어 소스 코드입니다.

 

#include<stdio.h>

int main(int argc, char *argv[]) {
    int n_exponent;  // 거듭제곱의 지수
    double a_base;   // 거듭제곱의 밑

    // 밑 입력
    printf("Give me a base : ");
    scanf("%lf", &a_base);

    // 지수 입력
    printf("Give me a exponent : ");
    scanf("%d", &n_exponent);

    /* 지수가 음수인 경우를 고려하기 위해
     * 지수의 절대값을 n_abs에 먼저 저장 */
    int n_abs;
    if (n_exponent >= 0) {
        n_abs = n_exponent;
    } else {
        n_abs = -n_exponent;
    }

    /* a_pow를 선언하고 그 값을
     * 1로 초기화 */
    double a_pow = 1.;
    
    /* a_base의 n_abs제곱을 먼저 계산
     * 제어변수 i의 값을 0으로 초기화하고,
     * i의 값이 n_abs보다 작으면 반복실행 */
    for (int i = 0; i < n_abs; i += 1) {
        /* a_pow의 기존값에
         * 거듭제곱의 밑을 곱하고
         * 새로운 값을 a_pow에 저장 */
        a_pow *= a_base;

        /* 제어변수 i의 기존값에 1을 더하고,
         * 새로운 값을 저장 */
    }

    /* 거듭제곱의 지수가 음수인 경우,
     * 지수의 절대값만큼 거듭제곱한 것을
     * 1에서 나눠줍시다. */
    if (n_exponent < 0) {
        a_pow = 1. / a_pow;
    }

    // 계산결과 출력
    printf("(%e)^(%d) = %e\n",
           a_base, n_exponent, a_pow);
}

 

거듭제곱의 밑과 지수를 a_basen_exponent라는 변수들에 각각 저장합니다. 지수의 절대값을 n_abs라는 정수형 변수에 별도로 저장하는데요. 이는 지수가 음수로 주어지는 경우를 고려하기 위한 것입니다. 다시 말해서 n_abs만큼 밑을 거듭제곱한 다음, 지수가 음수인 경우 1에서 이를 나눠주는 것이죠. 그리고 거듭제곱한 값을 저장하기 위한 변수인 a_pow를 선언하고, 그 값을 1로 초기화했습니다.

 

거듭제곱을 하기 위해서 for 반복문이 사용되고 있습니다. 맨 먼저 정수형 제어변수 i를 선언한 뒤 그 값을 0으로 초기화하죠. 제어변수 i의 값이 n_abs보다 작은 경우, a_pow의 기존값에 a_base의 값을 곱한 뒤 저장하는 연산을 반복합니다. 반복문이 한 번 실행될때마다 i의 값을 1 증가시키는 연산이 있는것도 볼 수 있습니다.

 

반복문을 이용해 거듭제곱을 계산한 뒤에는, 지수가 음수인 경우 값을 바꾸는 조건문이 있습니다. 마지막으로 계산된 거듭제곱의 값을 출력합니다.

 

소스 코드를 컴파일하고 프로그램을 실행시켜보면 다음과 같은 결과를 얻을 수 있습니다.

 

screenshot of terminal console&#44; showing the result of an example program to compute power using for loop

 

53제곱은 125, 5-3제곱은 0.008이라는 계산결과를 얻을 수 있죠.

 

반복 연산을 위해 사용할 수 있는 또 다른 방법은 while문이 있습니다. 특정 조건이 참이 되는 동안은 계속해서 반복을 하는 것인데요. 다음과 같은 형식을 통해 사용할 수 있습니다.

 

while ([반복조건]) {
    [실행문1]
    [실행문2]
    ...
}

 

while 다음에 반복을 위한 조건을 괄호 안에 넣습니다. 그리고 반복적으로 실행하고자 하는 구문들을 중괄호 안의 코드블록 안에 넣어주면 됩니다. 여기서 주의할 점은 반복을 위한 조건이 거짓이 되는 상황이 발생할 수 있도록 코드를 구성해야 한다는 점입니다. 그렇지 않으면 반복문이 계속 실행되는 무한루프 (infinite loop)에 빠지게 되겠죠. 만약 반복을 위한 조건이 처음부터 거짓이라면, while문이 아예 실행되지 않습니다.

 

앞에서 언급된 거듭제곱의 예시를 while 반복문을 사용해서 재구성해볼 수 있습니다.

 

#include<stdio.h>

int main(int argc, char *argv[]) {
    int n_exponent;
    double a_base;

    printf("Give me a base : ");
    scanf("%lf", &a_base);

    printf("Give me a exponent : ");
    scanf("%d", &n_exponent);

    int n_remain;
    if (n_exponent >= 0) {
        n_remain = n_exponent;
    } else {
        n_remain = -n_exponent;
    }

    double a_pow = 1.;
    while (n_remain > 0) {
        a_pow *= a_base;

        n_remain -= 1;
    }

    if (n_exponent < 0) {
        a_pow = 1. / a_pow;
    }

    printf("(%e)^(%d) = %e\n",
           a_base, n_exponent, a_pow);
}

 

남아있는 거듭제곱의 횟수를 n_remain이라는 정수형 변수에 저장하고 있습니다. 이 변수가 반복을 계속할지 여부를 결정하는 조건문에 사용되고, 그 값이 while문 내에서 바뀌는 것을 볼 수 있는데요. 처음에는 지수의 절대값이 n_remain에 저장되어 있지만, 거듭제곱을 할 때마다 그 값이 1만큼 감소합니다. 사용자에 의해 주어진 횟수만큼 거듭제곱을 하고나면 n_remain의 값이 0이 되고, while문에 붙은 조건이 거짓이 되어 반복문의 실행이 중단되는 것입니다.

 

프로그램을 컴파일해서 실행해보면, for문을 이용한 예제 프로그램과 동일한 결과를 얻을 수 있습니다.

 

마지막으로 살펴볼 반복문의 유형으로는 do-while문이 있습니다. 앞에서 언급한 while문과 비슷하지만, 반복을 위한 조건을 체크하는 시점이 다르다는 차이가 있는데요. do-while문은 다음과 같은 형식을 가지고 있습니다.

 

do {
    [실행문1]
    [실행문2]
    ...
} while ([반복조건]);

 

반복적으로 실행하고자 하는 구문들을 먼저 실행한 다음, 계속해서 반복을 할지의 여부를 결정하게 되죠. 따라서 중괄호 안에 있는 코드블록이 최소 한번은 실행됩니다.

 


 

반복문을 제어하는데 있어서 continuebreak문을 사용하면 프로그램의 효율성을 높이는데 큰 도움이 됩니다. 이들을 사용하는 방법에 대해서는 다음 포스팅에 더 자세한 내용이 소개되어 있습니다.

 

 

C/C++ 반복문을 제어하는 continue와 break

이번 포스팅에서는 C언어나 C++ 프로그램에 등장하는 반복문을 제어하기 위한 continue 및 break 명령어들에 대해서 알아봅시다. 이들을 활용하면 반복문 내에서 필요하지 않은 연산문들을 생략할

swstar.tistory.com

 

C언어나 C++ 소스 코드를 가지고 실행가능한 프로그램을 만드는 과정에 대한 더 자세한 내용은 다음 포스팅에 소개되어 있습니다.

 

 

C/C++ 코드가 프로그램이 되는 과정

여기서는 C언어 또는 C++로 작성된 소스 파일, 헤더 파일의 개념과 이들을 빌드하여 하나의 프로그램을 만드는 과정에 대해 간략하게 짚어보겠습니다. 여러 개의 소스, 헤더 파일들로 이루어진

swstar.tistory.com