day_count

Abstract

Le programme day_count établie le nombre de jour écoulé d'une date à une autre en utilisant la procédure Difference de Ada.Calendar.Arithmetic.
Elle affiche en même temps grâce à la procédure position utilisé dans un appel de la procédure Put de Ada Text_Io d'autre information établie selon un modulo dans un ensemble énoncé par la déclaration d'un type discré énuméré.
Le calcul du nombre de jour est évalué selon la date de départ approximatif pourvant être un mardi. Sensiblement c'est le cas ; Ca tombe juste.
La procédure position est founie par la bibliothèque PragmARC.Ansi_TTY_Control de PragmAda.

source

with Ada.Text_Io;
use Ada.Text_Io;
with Ada.Calendar;
with Ada.Calendar.Formatting;
use Ada.Calendar;
with Ada.Calendar.Arithmetic;
with PragmARC.Ansi_Tty_Control;
use PragmARC.Ansi_Tty_Control;
procedure Day_Count is

   type Week_Enum is (None, Monthday, Tusday, Wenesday, Thirday, Friday, Saturday, Sunday);
   type Sem_Enum is (None, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche);
   type Romain_Enum is (None, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche);

   Start_Date : Time := Time_Of(1970, 4, 20, 43200.0);
   Date_Cur : Time := Clock+43200.0;

   Birthday : Time := Time_of(1970, 4, 22, 14580.0);

   Day_Num : Arithmetic.Day_Count := 0;
   sec   : Duration := 0.0;
   Leaps : Arithmetic.Leap_Seconds_Count := 0;

   type Step_Enum is (Chaos, Machine, Program, Result, Manuel);

   type Cmd_Enum is (Logique, Raison, science, Hasard, Libre, Buggy);

   type Name_Enum is (Amour, Classe, Style, BCBG, Bab, Ceel, Admin);

   Step : Positive := Positive(Year(Clock)) - 665;
   Cross : Positive := 1970;
   Line : Positive := 1;
   Col : Positive := 200;
   function System (Cmd : String) return Integer;
   Errno : Integer;
   pragma Import (C, System, "system");

   task Day_Name is
      entry Arrêt;
   end Day_Name;

   task body Day_Name is
   begin
      loop
         select
            accept Arrêt;
            exit;
         or
            delay 1.0;
            Date_Cur := Clock+43200.0;
            --Errno := System ("clear" & Character'Val(0));
            Put(Position(Line, Col) & Formatting.Image(Clock));
            Line := Line + 1;
            Arithmetic.Difference(Date_Cur, Start_Date, Day_Num, Sec, Leaps);
            Put(Position(Line, Col) & "Day count : " & Integer'Image(Integer(Day_Num)) & " : " & Step_Enum'Image(step_Enum'Val(Integer(Day_Num) mod 5)));
            Line := Line + 1;
        
            Put(Position(Line, Col) & "Day  : " & Week_Enum'Image(Week_Enum'Val(((Integer(Day_Num)) mod 7)+1)));
            Line := Line + 1;
            Put(Position(Line, Col) & "Jour : " & Sem_Enum'Image(Sem_Enum'Val(((Integer(Day_Num)) mod 7)+1)));
            Line := Line + 1;
            Put(Position(Line, Col) & "Dio  : " & Romain_Enum'Image(Romain_Enum'Val(((Integer(Day_Num)) mod 7)+1)));
            Line := Line + 1;
        
            Put(Position(Line, Col) & Name_Enum'Image(Name_Enum'Val(Cross mod 6)));
        
            if Day(Clock) = (Day(Birthday) - 1) and Month(Clock) = Month(Birthday) then
               Put(Position(Line, Col+7) & " ; Happy birthday!");
               Line := Line + 1;
            elsif Day(Clock) = (Day(Birthday)) and Month(Clock) = Month(Birthday) then
               Put(Position(Line, Col+7) & " ; It's happy day!");
               Line := Line + 1;
            else
               Put(Position(Line, Col+7) & " ; Have a nice day!");
               Line := Line + 1;
            end if;
            Put(Position(Line, Col) & "Commande : ");
        
            Put(Cmd_Enum'Image(Cmd_Enum'Val(Day(Clock) mod 5)));
            Put(Position(23, 20));
            Line := 1;
         end select;
      end loop;
   end Day_Name;

   Char : Character;
begin
   loop

      Get_Immediate(Char);
      Day_Name.Arrêt;
      exit;
   end loop;
end Day_Count;