Manipulation de dates.

1) Algorithme pour déterminer si l'année A est bissextile.

   Si A n'est pas divisible par 4, l'année n'est pas bissextile.
   Si A est divisible par 4, l'année est bissextile sauf si A est divisible
      par 100 et pas par 400.

entier A
écrire "Introduisez l'année:"
lire A
si NOT (A mod  4=0) alors  écrire "L'année ", A, "n'est pas bissextile."
sinon  si NOT (A mod  100=0) alors  écrire "L'année ", A, "est bissextile."
       sinon  si NOT (A mod  400=0) alors  écrire "L'année ", A, "n'est pas bissextile."
              sinon  écrire "L'année ", A, "est bissextile."
              fsi
      fsi
fsi
PROGRAM Bissextile;
VAR A: WORD;
BEGIN
WRITELN('Année bissextile.');
WRITE('Introduisez l''année:');
READLN(A);
IF A MOD 4>0 THEN WRITELN('L''année ', A, ' n''est pas bissextile.')
ELSE IF A MOD 100>0 THEN WRITELN('L''année ', A, ' est bissextile.')
     ELSE IF A MOD 400>0 THEN WRITELN('L''année ', A, ' n''est pas bissextile.')
          ELSE WRITELN('L''année ', A, ' est bissextile.')
END.

ou
entier A
écrire "Introduisez l'année:"
lire A
si (A mod  4=0) et ((A mod  100>0) ou (A mod  400=0)) alors  écrire "L'année ", A, "est bissextile."
sinon  écrire "L'année ", A, "n'est pas bissextile."
fsi
PROGRAM Bissextile;
VAR A: WORD;
BEGIN
WRITELN('Année bissextile.');
WRITE('Introduisez l''année:');
READLN(A);
IF (A MOD 4=0) AND ((A MOD 100>0) OR (A MOD 400=0)) THEN WRITELN('L''année ', A, ' est bissextile.')
ELSE WRITELN('L''année ', A, ' n''est pas bissextile.')
END.
2) Algorithme pour déterminer le jour de la semaine correspondant à une date (j/m/a).
L'algorithme est valable pour les dates postérieures à 1582.
   Pour janvier et février, il faut augmenter m de 12 et diminuer a de 1.
   Calculer s qui vaut la partie entière de a divisé par 100
            JD = 1720996,5 - s + s \ 4 + [365,25*a] + [30,6001*(M+1)] + j
            JD = JD - [JD/7]*7
            JS = [JD] MOD 7
   si JS =  0, le jour est mardi,
   si JS =  1, le jour est mercredi,
   ....
   si JS =  7, le jour est lundi.
entier j, m, a, s, JD, JS
écrire "Introduisez le jour (1-31)"
lire j
écrire "Introduisez le mois (1-12)"
lire m
écrire "Introduisez l'année (xxxx)"
lire a
si m<3 alors m <-- m + 12
             a <-- a - 1
fsi
s <-- a \ 100
JD <-- 1720996,5 - s + s \ 4 + [365,25*a] + [30,6001*(M+1)] + j
JD <-- JD - [JD/7]*7
JS <-- [JD] mod 7
selon que
  JS = 0 faire Dat <-- "mardi";
  JS = 1 faire Dat <-- "mercredi";
  JS = 2 faire Dat <-- "jeudi";
  JS = 3 faire Dat <-- "vendredi";
  JS = 4 faire Dat <-- "samedi";
  JS = 5 faire Dat <-- "dimanche";
  JS = 6 faire Dat <-- "lundi";
fselon
écrire "Le ", j, "/", m, "/", a, "est un ", Dat
PROGRAM Calendrier_Perpetuel;
VAR a,m,j,s,JS:WORD;
    JD:REAL;
    Dat:STRING;
BEGIN
WRITELN('Calendrier perpétuel.');
WRITE('Introduisez le jour (1-31)');
READLN(j);
WRITE('Introduisez le mois (1-12)');
READLN(m);
WRITE('Introduisez l''année (xxxx)');
READLN(a);
IF m<3 THEN BEGIN
            DEC(a);
            INC(m,12);
            END;
s:=TRUNC(a/100);
JD:=1720996.5 - s + s DIV 4 + TRUNC(365.25*a) + TRUNC(30.6001*(M+1)) + j;
JD:=JD-TRUNC(JD/7)*7;
JS:=TRUNC(JD) MOD 7;
CASE JS OF
    0: Dat:='mardi';
    1: Dat:='mercredi';
    2: Dat:='jeudi';
    3: Dat:='vendredi';
    4: Dat:='samedi';
    5: Dat:='dimanche';
    6: Dat:='lundi';
END;
WRITELN('Le ',j,'/',m,'/',a,' est un ',Dat);
END.
3) Algorithme pour déterminer la date du lundi de Pâques pour l'année X.
   * appelons a le reste de la division de X par 19
   * appelons b le résultat de la division entière de X par 100
   * appelons c le reste de la division de X par 100
   * appelons d le résultat de la division entière de b par 4
   * appelons e le reste de la division de b par 4
   * appelons f le résultat de la division entière de b+8 par 25
   * appelons g le résultat de la division entière de b-f+1 par 3
   * appelons h le reste de la division de 19a+b-d-g+15 par 30
   * appelons i le résultat de la division entière de c par 4
   * appelons k le reste de la division de c par 4
   * appelons l le reste de la division de 32+2e+2i-h-k par 7
   * appelons m le résultat de la division entière de a+11h+22l par 451
   * appelons n le résultat de la division entière de h+l-7m+114 par 31
   * appelons p le reste de la division de h+l-7m+114 par 31
   * n est le numéro du mois et p+1 est le jour de Pâques
entier  X, a, b, c, d, e, f, g, h, i, k, l, m, n, p
écrire  "Introduisez l'année:"
lire  X
a <-- X mod 19
b <-- X \ 100
c <-- X mod 100
d <-- b \ 4
e <-- b mod 4
f <-- (b+8) \ 25
g <-- (b-f+1) \ 3
h <-- (19*a+b-d-g+15) mod 30
i <-- c \ 4
k <-- c mod 4
l <-- (32+2*e+2*i-h-k) mod 7
m <-- (a+11*h+22*l) \ 451
n <-- (h+l-7*m+114) \ 31
p <-- (h+l-7*m+114) mod 31
écrire  "Le jour de Pâques est le", p+1, "-", n, "-", X
PROGRAM Paques;
VAR X, a, b, c, d, e, f, g, h, i, k, l, m, n, p: INTEGER;
BEGIN
WRITELN('Calcul de la date de Pâques.');
WRITE('Introduisez l''année:');
READLN(X);
a := X MOD 19;
b := X DIV 100;
c := X MOD 100;
d := b DIV 4;
e := b MOD 4;
f := (b+8) DIV 25;
g := (b-f+1) DIV 3;
h := (19*a+b-d-g+15) MOD 30;
i := c DIV 4;
k := c MOD 4;
l := (32+2*e+2*i-h-k) MOD 7;
m := (a+11*h+22*l) DIV 451;
n := (h+l-7*m+114) DIV 31;
p := (h+l-7*m+114) MOD 31;
WRITELN('Le jour de Pâques est le', p+1, '-', n, '-', X);
END.
4) Algorithme pour déterminer le jour de la semaine correspondant à une date (j/m/a).
L'algorithme est valable pour les dates postérieures à 1900.
Mémoriser dans A les 2 derniers chiffres de l'année
Mémoriser dans B le résultat de la division entière de A par 4
Mémoriser dans C la valeur associée au mois dans la table ci-dessous
Mémoriser dans D la valeur du jour de la date
Mémoriser dans E le reste de la division entière de A + B + C + D par 7
Déterminer le jour de la semaine correspondant à E grâce à la table des jours

Table des mois

 

Table des jours

 

 

 

Dimanche=1

Janvier=1 (0 si bissextile)

Juillet=0

 

Lundi=2

Février=4 (3 si bissextile)

Août=3

 

Mardi=3

Mars=4

Septembre=6

 

Mercredi=4

Avril=0

Octobre=1

 

Jeudi=5

Mai=2

Novembre=4

 

Vendredi=6

Juin=5

Décembre=6

 

Samedi=0

PROGRAM Calendrier_Perpetuel;

VAR Annee,Mois,Jour,A,B,C,D,E:INTEGER;
    Dat:STRING;

BEGIN
WRITE('Année:');READLN(Annee);
WRITE('Mois:');READLN(Mois);
WRITE('Jour:');READLN(Jour);
A:=Annee MOD 100;
B:=A DIV 4;
IF Mois IN [4,7] THEN C:=0
ELSE IF Mois=10 THEN C:=1
     ELSE IF Mois=5 THEN C:=2
          ELSE IF Mois=8 THEN C:=3
               ELSE IF Mois IN [3,11] THEN C:=4
                    ELSE IF Mois=6 THEN C:=5
                         ELSE IF Mois IN [9,12] THEN C:=6
                              ELSE BEGIN
                                   IF Mois=1 THEN C:=1
                                   ELSE C:=4;
                                   IF (Annee MOD 4=0) AND ((Annee MOD 100>0) OR (Annee MOD 400=0)) THEN C:=C-1
					     END;
D:=Jour;
E:=(A+B+C+D) MOD 7;
CASE E OF
    0: Dat:='samedi';
    1: Dat:='dimanche';
    2: Dat:='lundi';
    3: Dat:='mardi';
    4: Dat:='mercredi';
    5: Dat:='jeudi';
    6: Dat:='vendredi';
END;
WRITELN('Le ',Jour,'/',Mois,'/',Annee,' est un ',Dat);
END.

Page d'accueil.