Блок задач

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

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

Задача «Простая бухгалтерия»

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

На вход программы поступает файл в формате:

Дата  Счёт1  Счёт2  Сумма  Примечание

Поля разделены пробелами или символами табуляции. Дата имеет формат YYYY-MM-DD или DD.MM.YYYY (2014-09-22, 22.09.2014). Счёт1 и Счёт2 – строки без пробелов. Сумма — число. Примечание – любой текст, он игнорируется.

Каждая строка отражает перевод суммы с одного счёта на другой (транзакция).

Пример файла:

01.01.2014 Старт Кошелёк 990     Изначально в кошельке было 990 руб
01.01.2014 Старт Карта 7000      А на карте 7000
20.09.2014 Кошелёк Проезд 70     Заплатил за проезд
20.09.2014 Кошелёк Базар 500     Купил фруктов на базаре
2014-09-21 Карта Книги 770.31    Купил книжку по карточке
21.02.2014 Карта Кошелёк 1000    Снял тысячу в банкомате

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

Задача

Программа должна поддерживать два режима:

  1. Вывести для всех счетов состояние на текущий момент (после обработки всех транзакций). Например, в кошельке должно остаться 990-70-500+1000 = 1420.
  2. Для произвольного счёта и заданного периода времени (две даты) вычислить входящий остаток (сумму на счёте до начала периода), приход (все поступления на счёт в периоде), расход (все списания со счёта в периоде) и исходящий остаток (входящий + приход - расход).

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

Для всех разработанных модулей должны быть созданы наборы unit тестов. Функций ввода/вывода нужно тестировать с помощью std::stringstream.