C 언어로 순현재가치 (NPV) 계산하기

CBeginner
지금 연습하기

소개

이 실습에서는 C 언어로 순현재가치 (NPV) 를 계산하는 방법을 배웁니다. 이 실습은 일련의 현금 흐름과 할인율을 읽고 각 현금 흐름을 할인한 다음 합계하여 NPV 를 계산하는 과정을 안내합니다. 사용자가 필요한 데이터를 입력하고 계산된 NPV 를 표시하는 C 프로그램을 만들 것입니다. 이 실습은 재무 수학의 기본 개념과 C 프로그래밍을 사용한 이자 계산을 다룹니다.

현금 흐름 및 할인율 입력

이 단계에서는 C 언어로 순현재가치 (NPV) 를 계산하기 위해 일련의 현금 흐름과 이자율을 읽는 방법을 배웁니다. 사용자가 여러 현금 흐름과 할인율을 입력할 수 있는 프로그램을 만들 것입니다.

먼저 NPV 계산을 위한 새로운 C 파일을 생성합니다.

cd ~/project
nano npv_calculator.c

이제 다음 코드를 파일에 추가합니다.

#include <stdio.h>

#define MAX_CASH_FLOWS 10

int main() {
    double cash_flows[MAX_CASH_FLOWS];
    double discount_rate;
    int num_cash_flows;

    // 현금 흐름 개수 입력
    printf("현금 흐름 개수를 입력하세요 (최대 %d): ", MAX_CASH_FLOWS);
    scanf("%d", &num_cash_flows);

    // 현금 흐름 개수 유효성 검사
    if (num_cash_flows <= 0 || num_cash_flows > MAX_CASH_FLOWS) {
        printf("잘못된 현금 흐름 개수입니다.\n");
        return 1;
    }

    // 현금 흐름 입력
    for (int i = 0; i < num_cash_flows; i++) {
        printf("현금 흐름 %d를 입력하세요: ", i);
        scanf("%lf", &cash_flows[i]);
    }

    // 할인율 입력
    printf("할인율을 입력하세요 (소수점으로): ");
    scanf("%lf", &discount_rate);

    // 입력 내용 확인을 위한 출력
    printf("\n입력 요약:\n");
    printf("현금 흐름 개수: %d\n", num_cash_flows);
    printf("할인율: %.2f%%\n", discount_rate * 100);

    printf("\n현금 흐름:\n");
    for (int i = 0; i < num_cash_flows; i++) {
        printf("현금 흐름 %d: $%.2f\n", i, cash_flows[i]);
    }

    return 0;
}

프로그램을 컴파일합니다.

gcc -o npv_calculator npv_calculator.c

입력을 테스트하기 위해 프로그램을 실행합니다.

./npv_calculator

예시 출력:

현금 흐름 개수를 입력하세요 (최대 10): 3
현금 흐름 0를 입력하세요: -1000
현금 흐름 1를 입력하세요: 500
현금 흐름 2를 입력하세요: 600
할인율을 입력하세요 (소수점으로): 0.1

입력 요약:
현금 흐름 개수: 3
할인율: 10.00%

현금 흐름:
현금 흐름 0: $-1000.00
현금 흐름 1: $500.00
현금 흐름 2: $600.00

이 코드는 다음을 보여줍니다.

  1. 최대 현금 흐름 개수 정의
  2. 사용자 입력으로부터 현금 흐름 개수 읽기
  3. 개별 현금 흐름 값 입력
  4. 할인율 입력
  5. 입력 내용 유효성 검사 및 확인 출력

이 프로그램은 필수 입력 매개변수를 캡처하여 NPV 계산을 위한 기반을 마련합니다.

각 현금 흐름 할인 및 합계

이 단계에서는 C 언어로 각 현금 흐름을 할인하고 할인된 현금 흐름을 합산하여 순현재가치 (NPV) 를 계산하는 방법을 배웁니다.

이전의 npv_calculator.c 파일을 수정하여 NPV 계산 기능을 추가합니다.

cd ~/project
nano npv_calculator.c

이전 코드를 다음 구현으로 바꿉니다.

#include <stdio.h>
#include <math.h>

#define MAX_CASH_FLOWS 10

double calculate_npv(double cash_flows[], int num_cash_flows, double discount_rate) {
    double npv = 0.0;

    for (int i = 0; i < num_cash_flows; i++) {
        // 각 현금 흐름 할인: CF / (1 + r)^t
        double discounted_cash_flow = cash_flows[i] / pow(1 + discount_rate, i);
        npv += discounted_cash_flow;
    }

    return npv;
}

int main() {
    double cash_flows[MAX_CASH_FLOWS];
    double discount_rate;
    int num_cash_flows;

    // 현금 흐름 개수 입력
    printf("현금 흐름 개수를 입력하세요 (최대 %d): ", MAX_CASH_FLOWS);
    scanf("%d", &num_cash_flows);

    // 현금 흐름 개수 유효성 검사
    if (num_cash_flows <= 0 || num_cash_flows > MAX_CASH_FLOWS) {
        printf("잘못된 현금 흐름 개수입니다.\n");
        return 1;
    }

    // 현금 흐름 입력
    for (int i = 0; i < num_cash_flows; i++) {
        printf("현금 흐름 %d를 입력하세요: ", i);
        scanf("%lf", &cash_flows[i]);
    }

    // 할인율 입력
    printf("할인율을 입력하세요 (소수점으로): ");
    scanf("%lf", &discount_rate);

    // NPV 계산
    double npv = calculate_npv(cash_flows, num_cash_flows, discount_rate);

    // 결과 출력
    printf("\n입력 요약:\n");
    printf("현금 흐름 개수: %d\n", num_cash_flows);
    printf("할인율: %.2f%%\n", discount_rate * 100);

    printf("\n현금 흐름:\n");
    for (int i = 0; i < num_cash_flows; i++) {
        double discounted_cf = cash_flows[i] / pow(1 + discount_rate, i);
        printf("현금 흐름 %d: $%.2f (할인 후: $%.2f)\n",
               i, cash_flows[i], discounted_cf);
    }

    printf("\n순현재가치 (NPV): $%.2f\n", npv);

    return 0;
}

수학 라이브러리와 함께 프로그램을 컴파일합니다.

gcc -o npv_calculator npv_calculator.c -lm

NPV 계산을 테스트하기 위해 프로그램을 실행합니다.

./npv_calculator

예시 출력:

현금 흐름 개수를 입력하세요 (최대 10): 3
현금 흐름 0를 입력하세요: -1000
현금 흐름 1를 입력하세요: 500
현금 흐름 2를 입력하세요: 600
할인율을 입력하세요 (소수점으로): 0.1

입력 요약:
현금 흐름 개수: 3
할인율: 10.00%

현금 흐름:
현금 흐름 0: $-1000.00 (할인 후: $-1000.00)
현금 흐름 1: $500.00 (할인 후: $454.55)
현금 흐름 2: $600.00 (할인 후: $495.87)

순현재가치(NPV): $-49.58

이 구현의 주요 내용:

  1. NPV 를 계산하는 calculate_npv() 함수 추가
  2. pow() 함수를 사용하여 현금 흐름 할인
  3. 원래 현금 흐름과 할인된 현금 흐름 모두 표시
  4. 최종 NPV 계산 및 표시

참고: -lm 플래그는 pow() 함수를 위해 수학 라이브러리를 연결하는 데 사용됩니다.

순현재가치 (NPV) 출력

이 마지막 단계에서는 사용자 친화적인 형식으로 순현재가치 (NPV) 계산 결과를 해석하고 제시하는 방법을 배웁니다.

npv_calculator.c 파일을 수정하여 출력 표현을 개선합니다.

cd ~/project
nano npv_calculator.c

개선된 출력 서식으로 코드를 업데이트합니다.

#include <stdio.h>
#include <math.h>

#define MAX_CASH_FLOWS 10

double calculate_npv(double cash_flows[], int num_cash_flows, double discount_rate) {
    double npv = 0.0;

    for (int i = 0; i < num_cash_flows; i++) {
        double discounted_cash_flow = cash_flows[i] / pow(1 + discount_rate, i);
        npv += discounted_cash_flow;
    }

    return npv;
}

void print_npv_analysis(double cash_flows[], int num_cash_flows, double discount_rate, double npv) {
    printf("\n--- NPV 분석 보고서 ---\n");
    printf("할인율: %.2f%%\n", discount_rate * 100);

    printf("\n현금 흐름 세부내역:\n");
    printf("--------------------\n");
    for (int i = 0; i < num_cash_flows; i++) {
        double discounted_cf = cash_flows[i] / pow(1 + discount_rate, i);
        printf("기간 %d: $%.2f (할인 후: $%.2f)\n",
               i, cash_flows[i], discounted_cf);
    }

    printf("\n순현재가치 (NPV): $%.2f\n", npv);

    // NPV 결과 해석
    if (npv > 0) {
        printf("투자 권고: 수락\n");
        printf("이 프로젝트는 가치를 창출할 것으로 예상됩니다.\n");
    } else if (npv < 0) {
        printf("투자 권고: 거절\n");
        printf("이 프로젝트는 가치를 파괴할 것으로 예상됩니다.\n");
    } else {
        printf("투자 권고: 중립\n");
        printf("이 프로젝트는 주어진 할인율에서 손익분기점에 있습니다.\n");
    }
}

int main() {
    double cash_flows[MAX_CASH_FLOWS];
    double discount_rate;
    int num_cash_flows;

    printf("순현재가치 (NPV) 계산기\n");
    printf("=====================\n");

    // 현금 흐름 개수 입력
    printf("현금 흐름 개수를 입력하세요 (최대 %d): ", MAX_CASH_FLOWS);
    scanf("%d", &num_cash_flows);

    // 현금 흐름 개수 유효성 검사
    if (num_cash_flows <= 0 || num_cash_flows > MAX_CASH_FLOWS) {
        printf("잘못된 현금 흐름 개수입니다.\n");
        return 1;
    }

    // 현금 흐름 입력
    for (int i = 0; i < num_cash_flows; i++) {
        printf("기간 %d의 현금 흐름을 입력하세요: ", i);
        scanf("%lf", &cash_flows[i]);
    }

    // 할인율 입력
    printf("할인율을 입력하세요 (소수점으로): ");
    scanf("%lf", &discount_rate);

    // NPV 계산
    double npv = calculate_npv(cash_flows, num_cash_flows, discount_rate);

    // NPV 분석 출력
    print_npv_analysis(cash_flows, num_cash_flows, discount_rate, npv);

    return 0;
}

프로그램을 컴파일합니다.

gcc -o npv_calculator npv_calculator.c -lm

개선된 NPV 출력을 테스트하기 위해 프로그램을 실행합니다.

./npv_calculator

예시 출력:

순현재가치(NPV) 계산기
=====================
현금 흐름 개수를 입력하세요 (최대 10): 3
기간 0의 현금 흐름을 입력하세요: -1000
기간 1의 현금 흐름을 입력하세요: 500
기간 2의 현금 흐름을 입력하세요: 600
할인율을 입력하세요 (소수점으로): 0.1

--- NPV 분석 보고서 ---
할인율: 10.00%

현금 흐름 세부내역:
--------------------
기간 0: $-1000.00 (할인 후: $-1000.00)
기간 1: $500.00 (할인 후: $454.55)
기간 2: $600.00 (할인 후: $495.87)

순현재가치(NPV): $-49.58
투자 권고: 거절
이 프로젝트는 가치를 파괴할 것으로 예상됩니다.

이 버전의 주요 개선 사항:

  1. 전용 print_npv_analysis() 함수 추가
  2. 출력 서식 개선
  3. NPV 기반 투자 권고 추가
  4. 명확한 제목으로 사용자 인터페이스 개선

요약

이 실습에서는 C 언어로 일련의 현금 흐름과 이자율을 입력받아 순현재가치 (NPV) 를 계산하는 방법을 배웠습니다. 사용자는 여러 개의 현금 흐름과 할인율을 입력하고, 프로그램은 입력 내용을 확인하기 위해 출력합니다.

다음으로, 각 현금 흐름을 할인하고 합산하여 NPV 를 계산한 후 최종 결과를 출력하는 방법을 배울 것입니다.