Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите реализовать алгоритм.  (Прочитано 8567 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« : 19-04-2006 09:43 » 

Иметтся прибор ведущий архив, в доках к нему при веден алгоритм вычисления адреса записи по дате.

Adr = StartAdr+ ((AbsDay*24+H) mod ArhSize)*RecSize
AbsDay = (Y-1)*365*((Y-1) div 4)+ DayInYear
DayInYear = Days[M-1]+D+(M>2)LeapYear
LeapYear =(Y mod 4==0)(Y mod 100!=0) + (Y mod 400 ==0)
Days[]={0,31,59,90,120,151,181,212,243,273,304,334};

ArhSize - размер архива
RecSize - длина записи
StartAdr - базовый адрес
H,D,M,Y -час день месяц и год
 
Может быть это какйто стандартный алгоритм для оргнизации циклического архива и ктонибудь сталкивался с подобным, меня смущают места выделеный жирным не понимаю как их итерпритировать и какое значение года брать YY - 06  или YYYY- 2006 .

Еще не понятно как адаптировать эти данные к месячным и суточным архивам

Записан

Да да нет нет все остальное от лукавого.
REM
Гость
« Ответ #1 : 19-04-2006 09:58 » 

меня смущают места выделеный жирным не понимаю как их итерпритировать и какое значение года брать YY - 06  или YYYY- 2006
Очевидно, это поправка на високосный год. Написано вроде бы без ошибок.
По всей видимости надо брать значение YYYY, иначе никак не объяснить этот оператор (Y mod 400 ==0)
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 19-04-2006 10:00 » 

Хм  тогда почему (Y mod 100!=0)  у нас что вековой год не может быть високосным?
Записан

Да да нет нет все остальное от лукавого.
REM
Гость
« Ответ #3 : 19-04-2006 10:10 » new

Разумеется.

Цитата
Год високосный, если он делится на четыре без остатка, но если он делится на 100 без остатка, это не високосный год. Однако если он делится без остатка на 400 — это високосный год. Таким образом, 2000 г. является особым високосным годом, который бывает лишь раз в 400 лет.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 19-04-2006 15:48 » 

Это коренное различие между Григорианским и Юлианским календарем.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 25-04-2006 11:13 » 

Реализовал алгоритм

Код:
                     D=atol(&m_Date[2]);

M=atol(&m_Date[5]);
Y=atol(&m_Date[8]);
H=atoi(&m_Date[13]);

div_t a= div(Y,4);
div_t b= div(Y,100);
div_t c= div(Y,400);
__int8 LY = (( a.rem ==0)&&(b.rem !=0))||(c.rem ==0);
__int16 DIY = Days[M-1]+D+(M>2)*LY;
div_t d=div(Y-1,4);
b=div(Y-1,100);
c=div(Y-1,400);
__int16 AbsDay=(Y-1)*365+d.quot +DIY;
div_t e=div(AbsDay*24+H ,ArhSize[m_Date[0]-'0']);
m_Adr.Adr=BaseAdr[m_Date[0]-'0']+e.rem *RecSize[m_Date[0]-'0'] ;

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

Лично меня смущает срочка,  тут вроди как считают каждый четвертый год высоксным: 
__int16 AbsDay=(Y-1)*365+d.quot +DIY;

Пробовал модифицировать с учетом 4х сот летних циклов
__int16 AbsDay=(Y-1)*365+d.quot-b.quot+c.quot +DIY;
Получается 7 суток не долет.

« Последнее редактирование: 19-12-2007 21:38 от Алексей1153++ » Записан

Да да нет нет все остальное от лукавого.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 25-04-2006 12:05 » 

Спасибо разобрался сам .... старас как сам С ошибка
__int16 AbsDay
нужно было определить как
__int32 AbsDay

ибо дней с рождества христого прошло несколько больше чем 65000....
Записан

Да да нет нет все остальное от лукавого.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines