Блок задач

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

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

Задача «Календарь»

Написать программу, которая выводит календарь (аналог утилиты ncal в UNIX).

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

Входной текстовый файл формата:

<период> | <формат вывода>
...

Возможные периоды:

month <номер_месяца>
year <год>
range <номер_месяца_1> <номер_года_1> <номер_месяца_2> <номер_года_2>

Возможные форматы вывода (некоторые могут быть указаны совместно):

vert
horiz
year_for_every_month
year_once

Пример входного файла:

range 1 1990 2 1991 | vert year_once
year 1991 | vert year_for_every_month

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

Написать программу, которая выводит календарь. Предусмотреть следующие режимы:

  1. month- вывод календаря для заданного месяца (год, месяц).
  2. year - вывод календаря для заданного года (год).
  3. range - вывод календаря для заданного диапазона месяцев

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

  1. Выбор между вертикальным (vert) и горизонтальным(horiz) расположением дней недели (см. примеры ниже).
  2. Печатать число года для каждого месяца (year_for_every_month) или один раз для всех месяцев, принадлежащих году (year_once) (см. примеры).

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

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

Записать результат работы программы в текстовый файл

Расположение дней недели

Горизонтальное
   Сентябрь 2014      
Пн Вт Ср Чт Пт Сб Вс  
 1  2  3  4  5  6  7  
 8  9 10 11 12 13 14  
15 16 17 18 19 20 21  
22 23 24 25 26 27 28  
29 30           
Вертикальное
    Сентябрь 2014     
Пн  1  8 15 22 29   
Вт  2  9 16 23 30   
Ср  3 10 17 24      
Чт  4 11 18 25      
Пт  5 12 19 26      
Сб  6 13 20 27      
Вс  7 14 21 28      

Число года

Один раз
                                  2014
    Сентябрь          Октябрь           Ноябрь            Декабрь           
Пн  1  8 15 22 29        6 13 20 27        3 10 17 24     1  8 15 22 29   
Вт  2  9 16 23 30        7 14 21 28        4 11 18 25     2  9 16 23 30   
Ср  3 10 17 24        1  8 15 22 29        5 12 19 26     3 10 17 24 31   
Чт  4 11 18 25        2  9 16 23 30        6 13 20 27     4 11 18 25      
Пт  5 12 19 26        3 10 17 24 31        7 14 21 28     5 12 19 26      
Сб  6 13 20 27        4 11 18 25        1  8 15 22 29     6 13 20 27      
Вс  7 14 21 28        5 12 19 26        2  9 16 23 30     7 14 21 28      

                                  2015
    Январь            
Пн     5 12 19 26   
Вт     6 13 20 27   
Ср     7 14 21 28   
Чт  1  8 15 22 29   
Пт  2  9 16 23 30   
Сб  3 10 17 24 31   
Вс  4 11 18 25      
Много раз
    Август 2014       Сентябрь 2014     Октябрь 2014      
Пн     4 11 18 25     1  8 15 22 29        6 13 20 27   
Вт     5 12 19 26     2  9 16 23 30        7 14 21 28   
Ср     6 13 20 27     3 10 17 24        1  8 15 22 29   
Чт     7 14 21 28     4 11 18 25        2  9 16 23 30   
Пт  1  8 15 22 29     5 12 19 26        3 10 17 24 31   
Сб  2  9 16 23 30     6 13 20 27        4 11 18 25      
Вс  3 10 17 24 31     7 14 21 28        5 12 19 26      

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

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