Re: Come ti calcolo la pasqua
MessaggioInviato:13 nov 2017, 21:10
Dovremo avere la versione definitiva con le ultime correzioni, adesso possiamo dire che ci siamo, prossimamente vedrò di applicare una maggiore ottimizzazione del codice:
MIKROBASIC CODE:
MIKROC CODE:
MIKROBASIC CODE:
Codice: Seleziona tutto
'-----------------------------------------------------------------
PROGRAM EasterDayCalc ' MikroBasic
'-----------------------------------------------------------------
CONST GREGORIAN AS BYTE = 0
CONST JULIAN AS BYTE = 1
SUB FUNCTION EasterDay(DIM Year AS WORD, CT AS BYTE) AS WORD
DIM m AS WORD
DIM n AS WORD
DIM Y AS WORD
DIM a AS WORD
DIM b AS WORD
DIM c AS WORD
DIM d AS WORD
DIM e AS WORD
DIM ED AS WORD
Y = Year
IF CT = GREGORIAN THEN
m = 24
n = 5
ELSE
m = 15
n = 6
ENF IF
a = Y MOD 19
b = Y MOD 4
c = Y MOD 7
d = (19 * a + m) MOD 30
e = (2 * b + 4 * c + 6 * d + n) MOD 7
ED = 22 + d + e
IF ED <= 31 THEN
ED = ED * $100 + 3 ' Marzo
ELSE
ED = (d + e - 9) * $100 + 4 ' Aprile
END IF
IF CT = GREGORIAN THEN
IF ED = $1A04 THEN ED = $1304 ' Il 26 Aprile diventa il 19 Aprile
IF (ED = $1904) AND (d = 28) AND (e = 6) AND (a > 10) THEN ED = $1204 ' Il 25 Aprile è sempre il 18 Aprile se...
END IF
result = ED ' ritorna il giorno insieme al mese
' sotto forma di una WORD (max. 7'940)
' 31 * $100 + 4 - 2 BYTE GIORNO + 2 BYTE MESE
' MSB |G|G|M|M| LSB
END SUB
main:
DIM Pasqua AS WORD
DIM GiornoDiPasqua AS BYTE
DIM MeseDiPasqua AS BYTE
Pasqua = EasterDay(2017, JULIAN)
GiornoDiPasqua = byte((Pasqua / $100) MOD $100)
MeseDiPasqua = byte(Pasqua MOD $100)
END.
MIKROC CODE:
Codice: Seleziona tutto
//-----------------------------------------------------------------
// PROGRAM EasterDayCalc - MikroC
//-----------------------------------------------------------------
enum CalendarType {
GREGORIAN,
JULIAN
};
unsigned EasterDay(unsigned Year, CalendarType CT) {
unsigned m;
unsigned n;
unsigned Y;
unsigned a;
unsigned b;
unsigned c;
unsigned d;
unsigned e;
unsigned ED;
Y = Year;
m = (CT == GREGORIAN ? 24 : 15);
n = (CT == GREGORIAN ? 5 : 6);
a = Y % 19;
b = Y % 4;
c = Y % 7;
d = (19 * a + m) % 30;
e = (2 * b + 4 * c + 6 * d + n) % 7;
ED = 22 + d + e;
if (ED <= 31) {
ED = ED * 0x100 + 3; // Marzo
} else {
ED = (d + e - 9) * 0x100 + 4; // Aprile
}
if (CT == GREGORIAN) {
if (ED == 0x1A04) ED = 0x1304; // Il 26 Aprile diventa il 19 Aprile
if ((ED == 0x1904) && (d == 28) && (e == 6) && (a > 10)) ED = 0x1204; // Il 25 Aprile è sempre il 18 Aprile se...
}
return ED; // ritorna il giorno insieme al mese
// sotto forma di una UNSIGNED (max. 7'940)
// 31 * 0x100 + 4 - 2 BYTE GIORNO + 2 BYTE MESE
// MSB |G|G|M|M| LSB
}
void main() {
unsigned Pasqua;
unsigned short GiornoDiPasqua;
unsigned short MeseDiPasqua;
Pasqua = EasterDay(2017, GREGORIAN);
GiornoDiPasqua = (unsigned short)((Pasqua / 0x100) % 0x100);
MeseDiPasqua = (unsigned short)(Pasqua % 0x100);
}