| Автор | Сообщение |
|
|
| |
Пост N: 8090
Зарегистрирован: 17.05.05
|
|
Отправлено: 19.04.25 13:50. Заголовок: Get Date Пасха :)
Всем привет Ни у кого не завалялся готовый алгоритм (Harbour) определения дня пасхи по номеру года ?
|
 |

|
|
Ответов - 8
[только новые]
|
|
|
|
| moderator
|
Пост N: 2419
Зарегистрирован: 11.02.10
|
|
Отправлено: 19.04.25 18:35. Заголовок: Dima пишет: готовый..
Dima пишет: | цитата: | | готовый алгоритм (Harbour) |
| Есть такой Вот программа с использованием Минигуи. Скрытый текст
#include "minigui.ch" STATIC nX := 50 STATIC nStep := 5 FUNCTION Main() DEFINE WINDOW Form_1 ; AT 0, 0 ; WIDTH 400 ; HEIGHT 200 ; TITLE "Happy Easter 2025" ; MAIN ; BACKCOLOR {245, 245, 245} @ 50, 10 LABEL lblMessage ; VALUE "Wishing you bug-free code and bouncing joy!" ; WIDTH 380 HEIGHT 20 ; FONT "Arial" SIZE 10 CENTERALIGN TRANSPARENT @ 100, nX IMAGE imgEgg ; PICTURE "easter_egg.bmp" ; WIDTH 32 HEIGHT 32 ON CLICK MsgDebug( CalculateEaster( Year(Date()) ) ) DEFINE TIMER oTimer INTERVAL 50 ACTION MoveEgg() END TIMER END WINDOW ACTIVATE WINDOW Form_1 ON INIT This.Center RETURN NIL PROCEDURE MoveEgg() LOCAL oImage := GetControlHandle("imgEgg", "Form_1") // Update position nX += nStep IF nX >= 350 .OR. nX <= 10 nStep := -nStep // Bounce back ENDIF MoveWindow( oImage , nX , 100 , 32 , 32 , .T. ) RETURN PROCEDURE CalculateEaster( nYear ) LOCAL a, b, c, d, e, f, month, day a := nYear % 19 b := nYear % 4 c := nYear % 7 d := (19 * a + 15) % 30 e := (2 * b + 4 * c + 6 * d + 6) % 7 f := d + e IF f <= 9 month := 3 day := 22 + f ELSE month := 4 day := f - 9 ENDIF // Convert to new style (add 13 days) IF month = 3 .AND. day > 18 day := day + 13 ELSEIF month = 4 day := day + 13 IF day > 30 day := day - 30 month := 5 ENDIF ENDIF RETURN { CMonth(stod(str(year(date()),4)+strzero(month,2)+"01")), Int(day) }
|
|
 |

|
|
|
| |
Пост N: 8091
Зарегистрирован: 17.05.05
|
|
Отправлено: 19.04.25 18:50. Заголовок: Да работает :sm36: ..
Да работает Пасиб Начал было переводить алгоритм что в википедии ,сосед позвонил , у него виски...вернулся а тут Григорий все выложил ))
|
 |

|
|
|
| Администратор
|
Пост N: 4194
Зарегистрирован: 23.05.05
|
|
Отправлено: 20.04.25 09:41. Заголовок: Давно сделал расчет ..
Давно сделал расчет по алгоритму из книги Климишина Календарь и хронология. Потом переписал расчет на C: //Function Easter(nGod, lCatholic) /* Расчет пасхи (c) Иван Антонович Климишин Схема расчета даты католической пасхи выглядит так. Разделив сначала число года R на 19, 4 и 7, получаем соответственно остатки a, b и с. Далее находим величину 19а + х делим ее на 30 и остаток обозначаем d. После этого составляем сумму 2b + 4с + 6d + у и делим ее на 7, остаток обозначаем через е. Пасха будет 22 + (d + е) марта н. ст. или, если d + e больше 10, (d + e) - 9 апреля н. ст. Величины x и у равны соответственно с 1582 по 1699 гг 22 и 2 с 1700 по 1799 гг 23 и 3 с 1800 по 1899 гг 23 и 4 с 1900 по 2099 гг 24 и 5 Расчет даты православной пасхи проводятся по той же схеме, но при постоянных значениях х=15 и у=6 Пределы здесь те же, что и в православной пасхалии - с 22 марта по 25 апреля (однако - нового стиля!). При этом формулы предусматривают два исключения: 1) если (d + e) - 9 = 26 апреля, то пасха переносится на 19 апреля (это относится к годам 1609, 1981, 2076 и 2133), и 2) если d = 28 и е = 6, так что (d + e) - 9 = 25, то пасха переносится на 18 апреля (такое случилось в 1954 г. и будет в 2049 и 2106 гг.). */ /* Local nA, nB, nC, nD, nE, nX, nY Local nDay, nMes if lCatholic == nil .or. nGod < 1582 nX := 15 nY := 6 else if nGod >= 1582 .and. nGod <= 1699 nX := 22 nY := 2 elseif nGod >= 1700 .and. nGod <= 1799 nX := 23 nY := 3 elseif nGod >= 1800 .and. nGod <= 1899 nX := 23 nY := 4 elseif nGod >= 1900 .and. nGod <= 2099 nX := 24 nY := 5 else nX := nY := 0 endif endif nA := nGod % 19 nB := nGod % 4 nC := nGod % 7 nD := (19*nA + nX) % 30 nE := (2*nB + 4*nC + 6*nD + nY) % 7 if nD + nE < 10 nMes := 3 nDay := 22 + nD + nE else nMes := 4 nDay := nD + nE - 9 if nDay == 26 nDay := 19 elseif nD == 28 .and. nE == 6 nDay := 18 endif endif Return NTOD(nDay, nMes, nGod) + if(lCatholic == nil .and. nGod >= 1918, 13, 0) */ Function Trinity(nGod, lCatholic) // Расчет троицы Return Easter(nGod, lCatholic) + 49 #pragma BEGINDUMP #include "hbapi.h" #include "hbdate.h" HB_FUNC( EASTER ) { int iGod = hb_parni( 1 ), iDay, iMes; HB_BOOL bCatholic = hb_parl( 2 ); int iA, iB, iC, iD, iE, iX, iY; HB_LONG lDate; if( ! bCatholic || iGod < 1582 ) { iX = 15; iY = 6; } // else if( iGod >= 1582 && iGod <= 1699 ) else if( iGod <= 1699 ) { iX = 22; iY = 2; } // else if( iGod >= 1700 && iGod <= 1799 ) else if( iGod <= 1799 ) { iX = 23; iY = 3; } // else if( iGod >= 1800 && iGod <= 1899 ) else if( iGod <= 1899 ) { iX = 23; iY = 4; } // else if( iGod >= 1900 && iGod <= 2099 ) else if( iGod <= 2099 ) { iX = 24; iY = 5; } else iX = iY = 0; iA = iGod % 19; iB = iGod % 4; iC = iGod % 7; iD = (19*iA + iX) % 30; iE = (2*iB + 4*iC + 6*iD + iY) % 7; if( iD + iE < 10 ) { iMes = 3; iDay = 22 + iD + iE; } else { iMes = 4; iDay = iD + iE - 9; if( iDay == 26 ) iDay = 19; else if( iD == 28 && iE == 6 ) iDay = 18; } lDate = hb_dateEncode( iGod, iMes, iDay ); if( ! bCatholic && iGod >= 1918 ) lDate += 13; hb_retdl( lDate ); } #pragma ENDDUMP
|
 |

|
|
|
| |
Пост N: 8092
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.04.25 12:35. Заголовок: Pasha Работает :sm..
Pasha Работает Pasha пишет: Не нашел такой , заменил на ctod(strzero(nday,2)+"."+strzero(nmes,2)+"."+strzero(ngod,4)) работает
|
 |

|
|
|
| |
Пост N: 8093
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.04.25 12:57. Заголовок: Нашел на просторах и..
Нашел на просторах инета , вроде пашет #pragma BEGINDUMP #include "hbapi.h" #include "hbdate.h" HB_FUNC( NTOD ) { hb_retd( hb_parni( 3 ), hb_parni( 2 ), hb_parni( 1 ) ); } #pragma ENDDUMP
|
 |

|
|
|
| |
Пост N: 8094
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.04.25 13:16. Заголовок: Оказывается была так..
Оказывается была такая функция в contrib/hbclipsm но потом contrib/hbclipsm убрали из Harbour
|
 |

|
|
|
| moderator
|
Пост N: 2420
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.04.25 14:41. Заголовок: Dima пишет: Оказыва..
Dima пишет: | цитата: | | Оказывается была такая функция |
| Эту функцию добавили в ядро Harbour под именем HB_DATE(nD1, nM2, nY3) 
|
 |

|
|
|
| |
Пост N: 8095
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.04.25 17:08. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Эту функцию добавили в ядро Harbour под именем HB_DATE(nD1, nM2, nY3) |
| Упс , я не видел , пасиб В логе пишут про такой формат Added HB_DATE( [<nYear>, <nMonth>, <nDay>] ) -> <dDate> Проверил вместо NTOD , работает 
|
 |

|
|