problème de date...

problème de date... - Ada - Programmation

Marsh Posté le 07-11-2005 à 20:43:46    

Bonjour,
je dois écrire un programme qui calcule le nombre de jours entre deux dates, avec deux sousprogrammes,
– le premier qui retourne le nombre de jours d’un mois donné et
– le second qui indique si une année est bissextile ou non en sachant qu’une année est
bissextile si elle est divisible par 400, ou alors par 4 mais pas par 100.
Lors de l’appel, utiliser la notation par position.
 
Voici ce que j'ai fait :

with Ada.Integer_Text_Io, Ada.Text_Io;
procedure Nbr_Jours is    
   procedure Jour_Mois is
   mois:character;
   begin
      Ada.Text_Io.Put("quel est le mois?" );
      Ada.Text_Io.Get_line(Mois);
   
   end Jour_Mois;
   procedure Bissextile is
      Annee:Integer;
   begin
      Ada.Text_Io.Put("quelle est l'annee? " );
      Ada.integer_Text_Io.Get(Annee);
      if Annee rem 4 =0 then
         Ada.Integer_Text_Io.Put(Annee);
         Ada.Text_Io.Put(" est une annee bissextile" );
      else
         Ada.integer_Text_Io.Put(Annee);
         Ada.Text_Io.Put(" n'est pas une annee bissextile" );
         End if;
   end Bissextile;
begin
   
end Nbr_Jours;


Ce n'est pas fini, et pas tres juste non plus.
je ne vois pas comment faire le premier sous-programme, ni comment à partir de ces deux sous-programme arriver à faire un seul programme.
Pouvez vous m'aider svp?
Merci


Message édité par Profil supprimé le 07-11-2005 à 20:48:16
Reply

Marsh Posté le 07-11-2005 à 20:43:46   

Reply

Marsh Posté le 02-01-2006 à 13:06:54    

Pour faire un copier-coller double clic sur le code supprime la numérotation
D'un côté, ça peut t'aidé, d'un autre, je suis pas trés fort.
Si tu as des précisions, n'esite pas à les communiquer
J'ai fait des fonctions, c'est pas bien dificile à transformer en procédure !
Je ne fait aucun contrôle, je ne traite pas les exceptions.
-- manque le code, j'y travaille  :)  
 

Code :
  1. with Text_Io, Ada.Integer_Text_Io;
  2. use Text_Io, Ada.Integer_Text_Io;
  3. procedure Main is
  4.   Année_min : constant := -500_000_000;
  5.   Année_Max : constant :=  500_000_000;
  6.   subtype T_Jour is Integer range 1..31;
  7.   subtype T_Mois is Integer range 1..12;
  8.   subtype T_Année is Integer range Année_Min..Année_Max;
  9.   type T_Date is
  10.      record
  11.         Jour : T_Jour;
  12.         Mois : T_Mois;
  13.         Année: T_Année;
  14.      end record;
  15.   function Nombre_De_Jour(Borne_Inf : T_Date;
  16.                          Borne_Sup : T_date) return Integer is
  17.      Total_Nombre_De_Jour : Natural := 0; -- si les dates sont les mêmes;
  18.                                                                    -- 0 jour sépare les dates
  19.      function Nombre_De_Jour_Dans(Le_Mois : T_Mois;
  20.                                   De_L_Année : T_Année) return T_Jour Is
  21.         function Est_Bissextile(Année : T_Année) return Boolean is
  22.            Bissextile : Boolean;
  23.         begin
  24.            -- manque le code, j'y travaille.
  25.            return Bissextile;
  26.         end Est_Bissextile;
  27.         Nombre_De_Jour_Dans_Le_Mois : T_Jour;
  28.      begin
  29.         -- manque le code, j'y travaille.
  30.         return Nombre_De_Jour_Dans_Le_Mois;
  31.      end Nombre_De_Jour_Dans;
  32.   begin
  33. -- manque le code, j'y travaille.
  34.      return Total_Nombre_De_Jour;
  35.   end Nombre_De_Jour;
  36.   Date_Inf, Date_Sup : T_Date;
  37. begin
  38.   Text_Io.Put_line("Date borne inferieure" );
  39.   Text_Io.Put("Entrez le jour et tappez entrée : " );
  40.   Get(Date_Inf.Jour);
  41.   Text_Io.Put("Entrez le mois et tappez entrée : " );
  42.   Get(Date_Inf.mois);
  43.   Text_Io.Put("Entrez l'année et tappez entrée : " );
  44.   Get(Date_Inf.année);
  45.   Text_Io.Put_line("Date borne superieure" );
  46.   Text_Io.Put("Entrez le jour et tappez entrée : " );
  47.   Get(Date_sup.Jour);
  48.   Text_Io.Put("Entrez le mois et tappez entrée: " );
  49.   Get(Date_sup.mois);
  50.   Text_Io.Put("Entrez l'année et tappez entrée : " );
  51.   Get(Date_sup.année);
  52.   Text_Io.Put("Nombre De Jour : " );
  53.   Put(Nombre_De_Jour(Borne_Inf => Date_Inf,
  54.                      Borne_Sup => Date_Sup)
  55.       );
  56. end Main;

Reply

Marsh Posté le 02-01-2006 à 13:10:07    

Fait gaffe, il y à un petit bug au double-cilc  :pfff: , tu vas etre obligé de supprimer les numéro à la main   [:dawa_neowen]

Reply

Marsh Posté le 02-01-2006 à 14:18:51    

Une implémentation de Nombre de jour dans le mois de () pour l'année ()
 

Code :
  1. function Nombre_De_Jour_Dans(Le_Mois : T_Mois;
  2.                                   De_L_Année : T_Année) return T_Jour Is
  3.         function Est_Bissextile(Année : T_Année) return Boolean is
  4.            Bissextile : Boolean;
  5.         begin
  6.            if Année rem 4 = 0 and then
  7.              Année rem 100 /= 0 then
  8.               Bissextile := True;
  9.            else
  10.               Bissextile := False;
  11.            end if;
  12.            return Bissextile;
  13.         end Est_Bissextile;
  14.         Nombre_De_Jour_Dans_Le_Mois : T_Jour;
  15.         Fevrier : T_Jour := 28;
  16.      begin
  17.         if Est_Bissextile(De_L_Année) then
  18.            Fevrier := 29;
  19.         end if;
  20.         case Le_Mois is
  21.            when 2 => Nombre_De_Jour_Dans_Le_Mois := Fevrier;
  22.            when 4|6|8|10|12 => Nombre_De_Jour_Dans_Le_Mois := 30;
  23.            when 1|3|5|7|9|11 => Nombre_De_Jour_Dans_Le_Mois := 31;
  24.         end case;
  25.               return Nombre_De_Jour_Dans_Le_Mois;
  26.      end Nombre_De_Jour_Dans;


 
Maintenant il faut faire le reste avec, si j'ai bien compris ??  :whistle: ; peut-etre un peut compliqué pour moi, j'y travaille

Reply

Marsh Posté le 02-01-2006 à 16:10:00    

:hello:  J'ai fait ça aussi, c'est pas tout a fait pareil, selon l'utilisation, patati patata  [:dawa_neowen]  
mais je doit etre hors sujet, je l'ai fait par esprit de contradiction, et puis par-ce que ça a été vite fait, contrarement au programme que tu as à faire .... sur lequel je cale un peut  :cry:  
 

Code :
  1. with Ada.Integer_Text_Io;
  2. use Ada.Integer_Text_Io;
  3. with Text_Io;
  4. use Text_Io;
  5. with Ada.Calendar;
  6. use Ada.Calendar;
  7. procedure Main2 is
  8.   subtype T_Nombre_De_Jour is Integer range 0..Integer'Last;
  9.   Date_Courante, Date_sup : Time;
  10.   I : T_Nombre_De_Jour:= 0;
  11.   Year_c    : Year_Number;
  12.   Month_c   : Month_Number;
  13.   Day_c     : Day_Number;
  14.   Year_s    : Year_Number;
  15.   Month_s   : Month_Number;
  16.   Day_s     : Day_Number;
  17. begin
  18.   Text_Io.Put_line("Date borne inferieure" );
  19.   Text_Io.Put("Entrez le jour et tapez entrée : " );
  20.   Get(Day_c);
  21.   Text_Io.Put("Entrez le mois et tapez entrée : " );
  22.   Get(Month_c);
  23.   Text_Io.Put("Entrez l'année et tapez entrée : " );
  24.   Get(Year_c);
  25.   Text_Io.Put_line("Date borne superieure" );
  26.   Text_Io.Put("Entrez le jour et tapez entrée : " );
  27.   Get(Day_s);
  28.   Text_Io.Put("Entrez le mois et tapez entrée: " );
  29.   Get(Month_s);
  30.   Text_Io.Put("Entrez l'année et tapez entrée : " );
  31.   Get(Year_s);
  32.   Date_Courante := Time_Of(Year_C,Month_C,Day_C);
  33.   Date_Sup      := Time_Of(Year_S,Month_S,Day_S);
  34.   while Date_Courante < Date_Sup loop
  35.      Date_Courante := Date_Courante + 86_401.42;
  36.      I := i+1;
  37.   end loop;
  38.   Put("Nombre de jour : " );
  39.   Put(I);
  40. end Main2;


Message édité par Profil supprimé le 02-01-2006 à 16:10:20
Reply

Marsh Posté le 02-01-2006 à 17:11:28    

Pour poursuivre le premier code, j'ai fait ça :
 

Code :
  1. with Text_Io, Ada.Integer_Text_Io;
  2. use Text_Io, Ada.Integer_Text_Io;
  3. procedure Main is
  4.   Année_min : constant := -500_000;
  5.   Année_Max : constant :=  500_000;
  6.   subtype T_Jour is Integer range 1..31;
  7.   subtype T_Mois is Integer range 1..12;
  8.   subtype T_Année is Integer range Année_Min..Année_Max;
  9.   type T_Date is
  10.      record
  11.         Jour : T_Jour;
  12.         Mois : T_Mois;
  13.         Année: T_Année;
  14.      end record;
  15.   function Nombre_De_Jour(Borne_Inf : T_Date;
  16.                           Borne_Sup : T_date) return Integer is
  17.      Total_Nombre_De_Jour : Natural := 0; -- si les dates sont les mêmes;
  18.                                           -- 0 jour separe les dates.
  19.      function Est_Bissextile(Année : T_Année) return Boolean is
  20.         Bissextile : Boolean;
  21.      begin
  22.         if Année rem 4 = 0 and then
  23.           Année rem 100 /= 0 then
  24.            Bissextile := True;
  25.         else
  26.            Bissextile := False;
  27.         end if;
  28.         return Bissextile;
  29.      end Est_Bissextile;
  30.      function Nombre_De_Jour_Dans(Le_Mois : T_Mois;
  31.                                   De_L_Année : T_Année) return T_Jour Is
  32.         Nombre_De_Jour_Dans_Le_Mois : T_Jour;
  33.         Fevrier : T_Jour := 28;
  34.      begin
  35.         if Est_Bissextile(De_L_Année) then
  36.            Fevrier := 29;
  37.         end if;
  38.         case Le_Mois is
  39.            when 2 => Nombre_De_Jour_Dans_Le_Mois := Fevrier;
  40.            when 4|6|8|10|12 => Nombre_De_Jour_Dans_Le_Mois := 30;
  41.            when 1|3|5|7|9|11 => Nombre_De_Jour_Dans_Le_Mois := 31;
  42.         end case;
  43.         return Nombre_De_Jour_Dans_Le_Mois;
  44.      end Nombre_De_Jour_Dans;
  45.      begin
  46.         for I in borne_Inf.Année+1 .. borne_Sup.Année-1 loop
  47.            if Est_Bissextile(I) then
  48.              Total_Nombre_De_Jour := Total_Nombre_De_Jour + 366;
  49.            else
  50.               Total_Nombre_De_Jour := Total_Nombre_De_Jour + 365;
  51.            end if;
  52.         end loop;
  53.         if Borne_Inf.Année /= Borne_Sup.Année then
  54.            for I in Borne_Inf.Mois .. 12 loop
  55.               Total_Nombre_De_Jour := Total_Nombre_De_Jour +
  56.                 Nombre_De_Jour_Dans(Le_Mois => I,
  57.                                     De_L_Année => Borne_Inf.Année);
  58.            end loop;
  59.            for I in 1..Borne_sup.Mois loop
  60.               Total_Nombre_De_Jour := Total_Nombre_De_Jour +
  61.                 Nombre_De_Jour_Dans(Le_Mois => I,
  62.                                     De_L_Année => Borne_Inf.Année);
  63.            end loop;
  64.            --          Rest A Deduire Les Jour Passé Et restant
  65.         elsif
  66.           Borne_Inf.Mois /= Borne_Sup.Mois then
  67.            for I in Borne_Inf.mois..Borne_sup.Mois loop
  68.               Total_Nombre_De_Jour := Total_Nombre_De_Jour +
  69.                 Nombre_De_Jour_Dans(Le_Mois => I,
  70.                                     De_L_Année => Borne_Inf.Année);
  71.            end loop;
  72.            --          Rest A Deduire Les Jour Passé Et restant
  73.         else
  74.            Total_Nombre_De_Jour
  75.              := Nombre_De_Jour_Dans(Le_Mois => Borne_Inf.mois,
  76.                                     De_L_Année => Borne_Inf.Année) -
  77.              Borne_Inf.Jour;
  78.         end if;
  79.      return Total_Nombre_De_Jour;
  80.   end Nombre_De_Jour;
  81.   Date_Inf, Date_Sup : T_Date;
  82. begin
  83.   Text_Io.Put_line("Date borne inferieure" );
  84.   Text_Io.Put("Entrez le jour et tapez entrée : " );
  85.   Get(Date_Inf.Jour);
  86.   Text_Io.Put("Entrez le mois et tapez entrée : " );
  87.   Get(Date_Inf.mois);
  88.   Text_Io.Put("Entrez l'année et tapez entrée : " );
  89.   Get(Date_Inf.année);
  90.   Text_Io.Put_line("Date borne superieure" );
  91.   Text_Io.Put("Entrez le jour et tapez entrée : " );
  92.   Get(Date_sup.Jour);
  93.   Text_Io.Put("Entrez le mois et tapez entrée: " );
  94.   Get(Date_sup.mois);
  95.   Text_Io.Put("Entrez l'année et tapez entrée : " );
  96.   Get(Date_sup.année);
  97.   Text_Io.Put("Nombre De Jour : " );
  98.   Put(Nombre_De_Jour(Borne_Inf => Date_Inf,
  99.                      Borne_Sup => Date_Sup)
  100.       );
  101. end Main;


 
Il reste à remplcer les lignes "--          Rest A Deduire Les Jour Passé Et restant" par le code aproprié", c'est à dire déduire les jour passé du mois de départ et jour restant du mois d'arrivé.
 
Je suis vraiment pas sur de ce code, encore une fois, je suis pas trés fort. [:dawa_neowen]  
 

Reply

Marsh Posté le 02-01-2006 à 19:30:38    

Aprés coup, je doit t'informer que le code est pas bon du tout. désolé, j'y travaille  :cry:

Reply

Marsh Posté le 02-01-2006 à 19:47:59    

En faisant les verifications à la main, j'ai oublié une retenue, ce qui m'a fait croire  que le code était faut, mais en fait il est a peut pré bon ... La confusion ...  :bounce:  
Voila, je peut pas mieu faire pour le moment ...
Bonne continuation
 

Code :
  1. with Text_Io, Ada.Integer_Text_Io;
  2. use Text_Io, Ada.Integer_Text_Io;
  3. procedure Main is
  4.   Année_min : constant := -500_000;
  5.   Année_Max : constant :=  500_000;
  6.   subtype T_Jour is Integer range 1..31;
  7.   subtype T_Mois is Integer range 1..12;
  8.   subtype T_Année is Integer range Année_Min..Année_Max;
  9.   type T_Date is
  10.      record
  11.         Jour : T_Jour;
  12.         Mois : T_Mois;
  13.         Année: T_Année;
  14.      end record;
  15.   function Nombre_De_Jour(Borne_Inf : T_Date;
  16.                           Borne_Sup : T_date) return Integer is
  17.      Total_Nombre_De_Jour : Natural := 0; -- si les dates sont les mêmes;
  18.                                           -- 0 jour separe les dates.
  19.      function Est_Bissextile(Année : T_Année) return Boolean is
  20.         Bissextile : Boolean;
  21.      begin
  22.         if Année rem 4 = 0 and then
  23.           Année rem 100 /= 0 then
  24.            Bissextile := True;
  25.         else
  26.            Bissextile := False;
  27.         end if;
  28.         return Bissextile;
  29.      end Est_Bissextile;
  30.      function Nombre_De_Jour_Dans(Le_Mois : T_Mois;
  31.                                   De_L_Année : T_Année) return T_Jour Is
  32.         Nombre_De_Jour_Dans_Le_Mois : T_Jour;
  33.         Fevrier : T_Jour := 28;
  34.      begin
  35.         if Est_Bissextile(De_L_Année) then
  36.            Fevrier := 29;
  37.         end if;
  38.         case Le_Mois is
  39.            when 2 => Nombre_De_Jour_Dans_Le_Mois := Fevrier;
  40.            when 4|6|8|10|12 => Nombre_De_Jour_Dans_Le_Mois := 30;
  41.            when 1|3|5|7|9|11 => Nombre_De_Jour_Dans_Le_Mois := 31;
  42.         end case;
  43.         return Nombre_De_Jour_Dans_Le_Mois;
  44.      end Nombre_De_Jour_Dans;
  45.      begin
  46.         for I in borne_Inf.Année+1 .. borne_Sup.Année-1 loop
  47.            if Est_Bissextile(I) then
  48.               Total_Nombre_De_Jour := Total_Nombre_De_Jour + 366;
  49.            else
  50.               Total_Nombre_De_Jour := Total_Nombre_De_Jour + 365;
  51.            end if;
  52.         end loop;
  53.         if Borne_Inf.Année /= Borne_Sup.Année then
  54.            for I in Borne_Inf.Mois .. 12 loop
  55.               Total_Nombre_De_Jour := Total_Nombre_De_Jour +
  56.                 Nombre_De_Jour_Dans(Le_Mois => I,
  57.                                     De_L_Année => Borne_Inf.Année);
  58.            end loop;
  59.            for I in 1..Borne_sup.Mois-1 loop
  60.               Total_Nombre_De_Jour := Total_Nombre_De_Jour +
  61.                 Nombre_De_Jour_Dans(Le_Mois => I,
  62.                                     De_L_Année => Borne_Inf.Année);
  63.            end loop;
  64.            Total_Nombre_De_Jour := Total_Nombre_De_Jour -
  65.              Borne_Inf.Jour;
  66.            Total_Nombre_De_Jour := Total_Nombre_De_Jour +
  67.              Borne_sup.Jour-1;
  68.  
  69.         elsif
  70.           Borne_Inf.Mois /= Borne_Sup.Mois then
  71.            for I in Borne_Inf.mois..Borne_sup.Mois-1 loop
  72.               Total_Nombre_De_Jour := Total_Nombre_De_Jour +
  73.                 Nombre_De_Jour_Dans(Le_Mois => I,
  74.                                     De_L_Année => Borne_Inf.Année);
  75.            end loop;
  76.            Total_Nombre_De_Jour := Total_Nombre_De_Jour -
  77.              Borne_Inf.Jour;
  78.            Total_Nombre_De_Jour := Total_Nombre_De_Jour +
  79.              Borne_sup.Jour-1;
  80.         else
  81.              Total_Nombre_De_Jour := Borne_sup.Jour - Borne_Inf.jour;
  82.         end if;
  83.      return Total_Nombre_De_Jour;
  84.   end Nombre_De_Jour;
  85.   Date_Inf, Date_Sup : T_Date;
  86. begin
  87.   Text_Io.Put_line("Date borne inferieure" );
  88.   Text_Io.Put("Entrez le jour et tapez entrée : " );
  89.   Get(Date_Inf.Jour);
  90.   Text_Io.Put("Entrez le mois et tapez entrée : " );
  91.   Get(Date_Inf.mois);
  92.   Text_Io.Put("Entrez l'année et tapez entrée : " );
  93.   Get(Date_Inf.année);
  94.   Text_Io.Put_line("Date borne superieure" );
  95.   Text_Io.Put("Entrez le jour et tapez entrée : " );
  96.   Get(Date_sup.Jour);
  97.   Text_Io.Put("Entrez le mois et tapez entrée: " );
  98.   Get(Date_sup.mois);
  99.   Text_Io.Put("Entrez l'année et tapez entrée : " );
  100.   Get(Date_sup.année);
  101.   Text_Io.Put("Nombre De Jour : " );
  102.   Put(Nombre_De_Jour(Borne_Inf => Date_Inf,
  103.                      Borne_Sup => Date_Sup)
  104.       );
  105. end Main;


 :jap:

Reply

Marsh Posté le 03-01-2006 à 13:37:18    

Petit détail, pour que visuellement ça doit plus clair,
 
Si tu met en en tête de ton programme:
use ada.text_io;
 
tu n'as pas besoin de mettre text_io.put tout le temps, tu te contente de mettre un put("machinchouette" );

Reply

Marsh Posté le 03-01-2006 à 16:55:52    

delphinounette > le petit programme qui utilise calendar marche mieu si à la ligne 35 on incrément Date_Courante de 86_400.0 tout rond et pas de 86_401.42 qui est un valeur qui sort de mon cerveau ... imagine le cerveau   [:dawa_neowen]
 
edit : :heink:  on peut d'ailleur ecrire : Date_Courante := Date_Courante + Day_Duration'last;


Message édité par Profil supprimé le 03-01-2006 à 17:05:44
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed