Введение
В этом лабораторном практикуме вы научитесь вычислять чистую приведенную стоимость (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
Этот код демонстрирует, как:
- Определить максимальное количество денежных потоков
- Считать количество денежных потоков из пользовательского ввода
- Ввести значения отдельных денежных потоков
- Ввести ставку дисконтирования
- Проверить и отобразить введенные данные для проверки
Программа подготавливает основу для расчета 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
Ключевые моменты этой реализации:
- Добавлена функция
calculate_npv()для вычисления NPV - Используется функция
pow()для дисконтирования денежных потоков - Отображаются как исходные, так и дисконтированные денежные потоки
- Рассчитывается и отображается окончательное значение 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
Рекомендация по инвестициям: ОТКАЗАТЬСЯ
Ожидается, что проект уничтожит ценность.
Основные улучшения в этой версии:
- Добавлена функция
print_npv_analysis() - Улучшено форматирование вывода
- Добавлена рекомендация по инвестициям на основе NPV
- Улуччен пользовательский интерфейс с ясными заголовками
Резюме
В этом лабораторном практикуме вы изучили, как читать последовательность денежных потоков и ставку процента для расчета чистой приведенной стоимости (NPV) на языке C. Вы создали программу, которая позволяет пользователям вводить несколько денежных потоков и ставку дисконтирования, а затем программа выводит введенные данные для проверки.
Далее вы узнаете, как дисконтировать каждый денежный поток и суммировать их для расчета NPV, а затем вывести окончательный результат.



