Вычисление чистой приведенной стоимости (NPV) на C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном практикуме вы научитесь вычислять чистую приведенную стоимость (NPV) на языке C. Практикум проведет вас через процесс чтения последовательности денежных потоков и ставки дисконтирования, дисконтирования каждого денежного потока и затем суммирования их для расчета NPV. Вы создадите программу на языке C, которая позволит пользователям ввести необходимые данные и затем отобразит рассчитанное значение NPV. Этот практикум охватывает основные понятия финансовой математики и расчетов процентов с использованием программирования на языке C.

Чтение Последовательности Денежных Потоков и Ставки

В этом шаге вы узнаете, как читать последовательность денежных потоков и ставку дисконтирования для расчета чистой приведенной стоимости (NPV) на языке C. Мы создадим программу, которая позволит пользователям ввести несколько денежных потоков и ставку дисконтирования.

Сначала создадим новый файл C для расчета NPV:

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("Enter the number of cash flows (max %d): ", MAX_CASH_FLOWS);
    scanf("%d", &num_cash_flows);

    // Валидация количества денежных потоков
    if (num_cash_flows <= 0 || num_cash_flows > MAX_CASH_FLOWS) {
        printf("Invalid number of cash flows.\n");
        return 1;
    }

    // Ввод денежных потоков
    for (int i = 0; i < num_cash_flows; i++) {
        printf("Enter cash flow %d: ", i);
        scanf("%lf", &cash_flows[i]);
    }

    // Ввод ставки дисконтирования
    printf("Enter the discount rate (as a decimal): ");
    scanf("%lf", &discount_rate);

    // Вывод введенных данных для проверки
    printf("\nInput Summary:\n");
    printf("Number of Cash Flows: %d\n", num_cash_flows);
    printf("Discount Rate: %.2f%%\n", discount_rate * 100);

    printf("\nCash Flows:\n");
    for (int i = 0; i < num_cash_flows; i++) {
        printf("Cash Flow %d: $%.2f\n", i, cash_flows[i]);
    }

    return 0;
}

Компилируем программу:

gcc -o npv_calculator npv_calculator.c

Запускаем программу для тестирования ввода:

./npv_calculator

Пример вывода:

Enter the number of cash flows (max 10): 3
Enter cash flow 0: -1000
Enter cash flow 1: 500
Enter cash flow 2: 600
Enter the discount rate (as a decimal): 0.1

Input Summary:
Number of Cash Flows: 3
Discount Rate: 10.00%

Cash Flows:
Cash Flow 0: $-1000.00
Cash Flow 1: $500.00
Cash Flow 2: $600.00

Этот код демонстрирует, как:

  1. Определить максимальное количество денежных потоков
  2. Считать количество денежных потоков из пользовательского ввода
  3. Ввести значения отдельных денежных потоков
  4. Ввести ставку дисконтирования
  5. Проверить и отобразить введенные данные для проверки

Программа подготавливает основу для расчета NPV, захватывая основные входные параметры.

Дисконтирование каждого денежного потока и суммирование

В этом шаге вы узнаете, как дисконтировать каждый денежный поток и рассчитать чистую приведенную стоимость (NPV) путем суммирования дисконтированных денежных потоков на языке C.

Давайте изменим предыдущий файл 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++) {
        // Дисконтирование каждого денежного потока: ДП / (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("Enter the number of cash flows (max %d): ", MAX_CASH_FLOWS);
    scanf("%d", &num_cash_flows);

    // Валидация количества денежных потоков
    if (num_cash_flows <= 0 || num_cash_flows > MAX_CASH_FLOWS) {
        printf("Invalid number of cash flows.\n");
        return 1;
    }

    // Ввод денежных потоков
    for (int i = 0; i < num_cash_flows; i++) {
        printf("Enter cash flow %d: ", i);
        scanf("%lf", &cash_flows[i]);
    }

    // Ввод ставки дисконтирования
    printf("Enter the discount rate (as a decimal): ");
    scanf("%lf", &discount_rate);

    // Расчет NPV
    double npv = calculate_npv(cash_flows, num_cash_flows, discount_rate);

    // Вывод результатов
    printf("\nInput Summary:\n");
    printf("Number of Cash Flows: %d\n", num_cash_flows);
    printf("Discount Rate: %.2f%%\n", discount_rate * 100);

    printf("\nCash Flows:\n");
    for (int i = 0; i < num_cash_flows; i++) {
        double discounted_cf = cash_flows[i] / pow(1 + discount_rate, i);
        printf("Cash Flow %d: $%.2f (Discounted: $%.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

Пример вывода:

Enter the number of cash flows (max 10): 3
Enter cash flow 0: -1000
Enter cash flow 1: 500
Enter cash flow 2: 600
Enter the discount rate (as a decimal): 0.1

Input Summary:
Number of Cash Flows: 3
Discount Rate: 10.00%

Cash Flows:
Cash Flow 0: $-1000.00 (Discounted: $-1000.00)
Cash Flow 1: $500.00 (Discounted: $454.55)
Cash Flow 2: $600.00 (Discounted: $495.87)

Чистая приведенная стоимость (NPV): $-49.58

Ключевые моменты этой реализации:

  1. Добавлена функция calculate_npv() для вычисления 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. Улуччен пользовательский интерфейс с ясными заголовками

Резюме

В этом лабораторном практикуме вы изучили, как читать последовательность денежных потоков и ставку процента для расчета чистой приведенной стоимости (NPV) на языке C. Вы создали программу, которая позволяет пользователям вводить несколько денежных потоков и ставку дисконтирования, а затем программа выводит введенные данные для проверки.

Далее вы узнаете, как дисконтировать каждый денежный поток и суммировать их для расчета NPV, а затем вывести окончательный результат.