--programme créé par Abdulmuslimova Madina, Boche Simon & Laporte Pierre
with Ada.Text_Io, Ada.Integer_Text_IO;
use Ada.Text_Io, Ada.Integer_Text_IO;
procedure Date1 is
--type date (composé de jour, mois, année)
type T_Date is record
Jour : Natural;
Mois : Natural;
Annee : Natural;
end record;
--création des tableaux (pour le nombre de jours pour un mois)
type T_Tableau is array(1..12) of Natural;
--fonction bissextile
function Bissextile(Annee : Natural) return Boolean is
begin
return Annee mod 400 = 0 or (Annee mod 4 = 0 and Annee mod 100 /= 0);
end Bissextile;
--porcedure d'initialisation du tableau
Procedure Init(Init_Tableau: out T_Tableau ; Annee : in Natural) is
Fevrier : Natural := 0;
begin
if Bissextile(Annee) then
Fevrier := 29;
else
Fevrier := 28;
end if;
Init_Tableau := (2 => Fevrier, 4|6|9|11 => 30, others => 31);
end Init;
--procedure Get pour l'aquisition d'une date
procedure Get(D: out T_Date) is
begin
Get(D.Jour);
Get(D.Mois);
Get(D.Annee);
end Get;
--fonction valide (détermine si une date est valide ou non)
function Valide(D:T_Date) return Boolean is
Tableau : T_Tableau;
begin
Init(Tableau, D.Annee);
--Init(Tableau,D);
return D.Mois in 1..12 and then D.Jour in 1..Tableau(D.Mois);
end Valide;
--fonction pour connaitre le nombre de jour restant avant la fin du mois
function Reste(D:T_Date) return Natural is
T : T_Tableau;
begin
Init(T, D.Annee);
return T(D.Mois) - D.Jour;
end Reste;
--fonction pour connaitre le nombre de jours passés depuis le début du mois
function Passe(D:T_Date) return Natural is
begin
return D.Jour - 1;
end Passe;
--fonction donnant le nombre de jours séparant les deux dates (même mois et même année)
function Separe(D1:T_Date ; D2:T_Date) return Integer is
begin
if D1.Mois = D2.Mois and D1.Annee = D2.Annee then
if (D2.Jour - D1.Jour) < 0 then
return D1.Jour - D2.Jour;
else
return D2.Jour - D1.Jour;
end if;
else
return -1;
end if;
end Separe;
--fonction donnant le nombre de jours séparant les deux dates (mois et année /=)
function Separe2(D1:T_Date ; D2:T_Date) return Natural is
Jour_d1 : Natural;
Jour_d2 : Natural;
R : Natural := 0;
T1, T2 : T_Tableau;
begin
if D1.Mois = D2.Mois and D1.Annee = D2.Annee then
return Separe(D1, D2);
end if;
Init(T1, D1.Annee);
Init(T2, D2.Annee);
Jour_d1 := Reste(D1);
Jour_d2 := Passe(D2);
if D1.Annee /= D2.Annee then
--compte le nombre de jours jusqu'à la fin de l'année
for i in D1.Mois + 1 .. 12 loop
R := T1(i) + R;
end loop;
--compte le nombre de jours depuis le début de l'année
for i in 1 .. D2.Mois - 1 loop
R := T2(i) + R;
end loop;
for I in D1.Annee + 1 .. D2.Annee - 1 loop
if Bissextile(i) then
R := R + 366;
else
R := R + 365;
end if;
end loop;
else -- d1.annee = d2.annee d1.mois /= d2.mois
for i in D1.Mois + 1 .. D2.Mois - 1 loop
R := T1(i) + R; -- ici t1 = t2
end loop;
end if;
return Jour_d1 + Jour_d2 + R + 1;
end Separe2;
--création de deux variables de type T_Date
Date1 : T_Date;
Date2 : T_Date;
--début de la programme principal
begin
Get(Date1);
Get(Date2);
if Valide(Date1) and Valide(Date2) then
Put("Les dates sont valides");
New_Line;
Put("Il reste ");
Put(Reste(Date1),1);
Put(" jours avant la fin du mois");
New_Line;
Put(Passe(Date1),1);
Put(" jour(s) sont passe(s) depuis le debut du mois");
New_Line;
if Separe(Date1,Date2) /= -1 then
Put(Separe(Date1,Date2),1);
Put(" jour(s) separe les deux dates");
else
Put("Les deux dates n'ont pas la meme annee ou le meme mois");
end if;
New_Line;
Put(Separe2(Date1,Date2),1);
Put(" jour(s) de date 1 a date 2");
New_Line;
else
Put("Une des dates n'est pas valide");
end if;
end Date1;