Блок задач

4. Структуры данных

Темы
Сложность 2

Задача «Кредитный калькулятор»

Написать программу, рассчитывающую график платежей по кредиту.

Входные данные

Текстовый файл:

<процентная ставка> <сумма кредита> <срок кредита_в_месяцах> <дата выдачи кредита> 

Файл может содержать пустые и невалидные строки. Программа должна корректно это обрабатывать.

Передачу имени входного файла, реализовать через аргументы командной строки.

Постановка задачи

При заданной годовой процентной ставке P, сумме кредита S, сроке кредита в N месяцев и дате выдачи кредита D программа должна вывести таблицу расчёта погашения кредита:

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

Вычисление суммы аннуитетного платежа производится по формуле:

Где p – это нормализованная месячная процентная ставка (p = P / 100 / 12).

Для S = 1200000, P = 17 и N = 36 сумма аннуитетного платежа равна 42783.27.

Для вычисления процентной составляющей в платеже можно воспользоваться следующей формулой: Percent = p * Rem, где Rem – остаток задолженности по кредиту. Тогда сумма, идущая в погашение основного долга, равна Principal = Payment - Percent.

Кроме показа таблицы программа должна вычислить и отобразить общую сумму переплаты (суммарное количество выплаченных процентов).

Выходные данные

Текстовый файл

Дата         Сумма к оплате       Проценты       Основной долг
...
15.09.2014       42783.27         2340.90        40442.37
15.10.2014       42783.27         1767.96        41015.31
...

Примечания

  1. Все расчёты должны вестись в рублях и копейках. Это будет приводить к округлению суммы аннуитетного платежа. Остатки по округлению нужно добавить к сумме последнего платежа (его размер может отличаться). Проверьте, что сумма всех погашений основного долга равна сумме займа!
  2. Платежи происходят ежемесячно в одно и то же число. Если этого числа не существует (30 февраля), то дата переходит на 1-е число следующего месяца. Если день выпадает на субботу или воскресенье, то дата платежа переходит на следующий понедельник.

Тестирование

Необходимо написать полноценный набор тестов, охватывающий различные варианты кредитов, все варианты перехода платежей на другой день и т.п.

Функции ввода/вывода нужно тестировать с помощью std::stringstream.