function dates=day_array(dd,mm,yyyy,prev,next)
%% By L_DelOff
% функция формирует массив, состоящий из дат, по которым тербуется провести
% анализ
% Вход: день x, месяц x, год x, скольно тербуется дней до, скольно тербуется дней
% после дня x
% Выход: структура
% номер     день месяц год
% 1         dd   mm    yyyy
% 2         dd   mm    yyyy
% ...
%% Для отладки (потом закомментировать)
% dd=15;
% mm=12;
% yyyy=2019;
% prev=400;
% next=400;
%% Начало
dates=[];
count=0;
for i=-prev:next
    count=count+1;
    dates(count).N=count;
    dates(count).N2=i;
    [d, m, y]=offset_date(dd,mm,yyyy,i);
    dates(count).day=d;
    dates(count).month=m;
    dates(count).year=y;
end
end

function [d, m, y]=offset_date(dd,mm,yyyy,N)
%% By L_DelOff
% учет перехода через месяц при переходе с dd.mm.yyyy на N дней
% 1.  январь   31
% 2.  февраль  28(29)
% 3.  март     31
% 4.  апрель   30
% 5.  май      31
% 6.  июнь     30
% 7.  июль     31
% 8.  август   31
% 9.  сентябрь 30
% 10. октябрь  31
% 11. ноябрь   30
% 12. декабрь  31
%% Начало
d=dd+N;
m=mm;
y=yyyy;
while d<=0  % на месяц назад
    m=m-1; % отнимаем месяц
    while m<=0
        y=y-1;
        m=m+12;
    end
    
    if sum(m==[1 3 5 7 8 10 12])==1 % если предыдущий месяц имеет 31 день
        d=d+31;
    else
        if (m==2)
            d=d+28;
            if mod(y,4)==0
                d=d+1;
            end
        else
            d=d+30;
        end
    end
end
% определить конец текущего месяца
if sum(m==[1 3 5 7 8 10 12])==1
    endday=31;
else
    if (m==2)
        endday=28;
        if mod(y,4)==0
            endday=29;
        end
    else
        endday=30;
    end
end

while d>endday
    if sum(m==[1 3 5 7 8 10 12])==1
        d=d-31;        
    else
        if (m==2)
            d=d-28;            
            if mod(y,4)==0
                d=d-1;                
            end
        else
            d=d-30;            
        end
    end
    m=m+1; % прибавляем месяц
    while m>12
        y=y+1;
        m=m-12;
    end
    if sum(m==[1 3 5 7 8 10 12])==1
        endday=31;
    else
        if (m==2)
            endday=28;
            if mod(y,4)==0
                endday=29;
            end
        else
            endday=30;
        end
    end
end
end