.
..
date1.adb (download) (view)

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

 
Webmaster : pierrefrancois.leon@laposte.net

Valid XHTML 1.0 Strict Valid CSS!