Paques 1.0.0

Soyez le premier à donner votre avis sur cette source.

Vue 5 700 fois - Téléchargée 636 fois

Description

En cette semaine Sainte, je propose un petit programme qui calcule la date de Pâques jusqu'en 9999 selon l'algorithme de Oudin.

Référence : http://www.fil.univ-lille1.fr/~wegrzyno/portail/InitProg/Doc/TP/TP6/tp6.pdf

Source / Exemple :


{===============================================================================
Code Source : BEAUMONT Christophe
Version     : 1.0.0
Date        : 02 Avril 2010

Micro-projet 08 - Calcul de la date de Pâques selon l'algorithme de OUDIN, son
avantage est d'être parmi ceux qui demandent le moins d'opérations. Il est présenté
sous sa forme non simplifiée donc utilisable pour toute année postérieure à 1583
(après l'apparition du calendrier grégorien).
Retrouvez ce source et bien d'autres sur mon site : "www.delphinautes.fr"
===============================================================================}
unit f_main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ShellAPI;

type
  TForm1 = class(TForm)
    Annee: TEdit;
    LabAnnee: TLabel;
    Box: TPanel;
    Url: TLabel;
    procedure AnneeKeyPress(Sender: TObject; var Key: Char);
    procedure UrlClick(Sender: TObject);
    procedure UrlMouseEnter(Sender: TObject);
    procedure UrlMouseLeave(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Paques(Annee : Integer) : TDateTime;
var Y,G,C,C_4,E,H,K,P,Q,I,B,J1,J2,R,M : Integer;
begin
// Y = l'année définie
  Y := Annee;
// Diviser l'année par 19 et garder le reste
// 2010/19=105 or 105*19=1995 donc l'écart avec 2010 vaut G=15
  G := Trunc(Y mod 19);
// C et C_4 permettent le suivi des années bissextiles
  C := Trunc(Y DIV 100);
// On divise l'année par 100 puis par 4
// C=2010/100=20 et C_4=20/4=5
C_4 := Trunc(C DIV 4);
// Diviser (8*C+13) par 25 , E=8*20+13=173/25=6
  E := Trunc((8 * C + 13) DIV 25);
// H dépend de l'épacte, H=309/30=10 on garde l'écart donc H=9
  H := Trunc(19 * G + C - C_4 - E + 15) mod 30;
// K = 9/28 = -0
  K := Trunc(H DIV 28);
// P = 29/10 = 2
  P := Trunc(29 DIV (H + 1));
// Q = 21-15 = 6 / 11 = 0
  Q := Trunc((21 - G) DIV 11);
// I représente le nombre de jours entre la pleine lune pascale et le 21 Mars
  I := Trunc((K * P * Q - 1) * K + H);
// B = 2010 /4 = 502 + 2010 = 2512
  B := Trunc((Y DIV 4) + Y);
// J1 = 2508
 J1 := Trunc((B + I + 2 + C_4)- C);
// Calcule le jour de la lune pascale
// J2 = 2508/7 = 358 or 358*7 = 2506 donc on garde le reste J = 2
 J2 := Trunc(J1 mod 7);
// R représente la date du mois de Mars  (R = 35)
  R := Trunc(28 + I - J2);
// s'il dépasse 31 alors
 if R > 31 then
  begin
// On déborde sur Avril
    M := 4;
// Retrancher 31 pour obtenir la date d'Avril (R = 4)
    R := R - 31;
  end
// s'il ne dépasse pas 31 alors on est en Mars
 else M := 3;
// renvoie une valeur de type TDateTime à partir des paramètres Annee, Mois et Jour
  Result := EncodeDate(Annee, M, R);
end;

procedure TForm1.AnneeKeyPress(Sender: TObject; var Key: Char);
var DatePaques : TDateTime;
begin
// Teste si on a appuyé sur la touche "Entrée"
 if Key = #13 then
  begin
// On vérifie que la date est comprise entre 1583 et 9999 sinon on affiche un message
   if (StrToInt(Annee.Text) < 1583) or (StrToInt(Annee.Text) > 9999) then ShowMessage('Entrez une date entre 1583 et 9999')
   else
// On calcule la date de Pâques de l'année spécifiée dans une structure TDateTime
    DatePaques := Paques(StrToInt(Annee.Text));
// Affiche la date de Pâques
    Box.Caption := 'Pâques aura lieu le '+FormatDateTime('dddddd',DatePaques);
  end;
end;

procedure TForm1.UrlClick(Sender: TObject);
begin
// Lance le navigateur par défaut sur mon site
 ShellExecute(Handle,'Open','http://www.delphinautes.fr',nil,nil,SW_SHOWDEFAULT);
end;

procedure TForm1.UrlMouseEnter(Sender: TObject);
begin
// Souligne l'adresse lorsque le pointeur de souris passe dessus
 Url.Font.Style := [fsUnderline];
// Et change le pointeur de souris
 Cursor := crHandPoint;
end;

procedure TForm1.UrlMouseLeave(Sender: TObject);
begin
// Retire le soulignement lorsque le pointeur n'est plus dessus
 Url.Font.Style := [];
// Et remet le curseur par défaut
 Cursor := crDefault;
end;

end.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
80
Date d'inscription
lundi 2 juin 2003
Statut
Membre
Dernière intervention
15 juin 2012

J'oubliais, en Alsace-Moselle (régime du Concordat) le Vendredi Saint ainsi que le 26 Décembre sont aussi fériés.
2 jours en plus de repos !
Messages postés
80
Date d'inscription
lundi 2 juin 2003
Statut
Membre
Dernière intervention
15 juin 2012

Bonjour Dubois77,

Cette méthode fonctionne aussi mais apparemment que jusqu'en 4099 d'après le commentaire du source (mais çà doit suffire pour nos vies d'hommes ;).
L'avantage de l'algorithme de Oudin est qu'il nécessite moins de calcul aussi.

Cordialement.

Christophe
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10
Bonjour Christophe
pour compléter ce dossier, une variante de pâques et les autres jours qui vont avec !

function Paques(Annee : Integer) : TDateTime;
var
Y,G,C,X,Z,D,E,N,P,J,M : Integer;
begin
{Algorithme valable pour les dates comprises entre 1583 et 4099}
Y := Annee;
G := (Y mod 19) + 1;
C := Trunc((Y/100)) + 1;
X := Trunc(3 * C / 4) - 12;
Z := Trunc(((8 * C) + 5) / 25) - 5;
D := Trunc(((5 * Y) / 4) - X - 10);
E := ((11 * G)+ 20 + Z - X) mod 30; if ((E 25) and (G > 11)) or (E 24) then
E := E + 1;
N := 44 - E;
if N < 21 then
N := N + 30;
P := N + 7 - ((D + N) mod 7);
if P > 31 then
J := P - 31
else
J := P;
if J = P then
M := 3
else
M := 4;
Result := EncodeDate(Annee, M, J);
end;

function LundiPaques(Annee : Integer) : TDateTime;
begin
result := Paques(annee)+1;
end;

function Ascension(Annee : Integer) : TDateTime;
begin
result := Paques(annee)+39;
end;

function Pentecote(Annee : Integer) : TDateTime;
begin
result := Paques(annee)+49;
end;

function LundiPentecote(Annee : Integer) : TDateTime;
begin
result := Paques(annee)+50;
end;
Messages postés
80
Date d'inscription
lundi 2 juin 2003
Statut
Membre
Dernière intervention
15 juin 2012

Pour proposer de l'innovant, j'ai vérifié que cet algorithme n'était pas présent sur ce site.
L'année est limitée à 9999 à cause de la structure TDateTime qui n'accepte les dates que jusque là.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.