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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите реализовать алгоритм.  (Прочитано 7740 раз)
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 » 

Разумеется.

Цитата
Год високосный, если он делится на четыре без остатка, но если он делится на 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