--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;