[Ada][per cent] calcul du pourcenage

calcul du pourcenage [Ada][per cent] - Ada - Programmation

Marsh Posté le 20-11-2024 à 21:28:16    

Bonjour,
 
Je pensais avoir 0.0 dans la liste des pourcenages alors que j'ai une de valeurs égale à 7.14.
 
J'ai beau relire le code, je vois encore pas ce qui va pas.
 
 
Merci pour votre aide.
 
 

Code :
  1. type Log_Enum is (None, Organizer, Computer, Planning, Makefile,
  2.              Manpage, Project, HOWTO, HISTORY, Test,
  3.              Moneybox, Activity, Stocks, Bank);
  4.  
  5.   type Session_Record is
  6.      record
  7.      Top : Time := Clock;
  8.      Bot : Time := Clock;
  9.      end record;
  10.  
  11.   procedure Open (Session : in out Session_Record);
  12.   procedure Close (Session : in out Session_Record);
  13.  
  14.   type Session_Array is array (Log_Enum) of Session_Record;
  15.  
  16.   type Rate_Type is delta 0.01 digits 5 range 0.0..100.0;
  17.  
  18.   type Log_Record is
  19.      record
  20.      Total : Long_Long_Float := 0.0;
  21.      Rate  : Rate_Type := 0.0;
  22.      end record;
  23.  
  24.   type Log_Array is array (Log_Enum) of Log_Record;
  25.  
  26.   procedure Statistic (Sessions : in Session_Array; Logs : in out Log_Array);


 

Code :
  1. procedure Statistic (Sessions : in Session_Array; Logs : in out Log_Array) is
  2.      Total : Long_Long_Float := 0.0;
  3.   begin
  4.      for Session in Sessions'Range loop
  5.      if Sessions(Session).Bot > Sessions(Session).Top then
  6.         declare
  7.            Elapsed : constant Duration := Sessions(Session).Bot - Sessions(Session).Top;
  8.         begin
  9.            if Elapsed > 1.0 then
  10.           Logs(Session).Total := Logs(Session).Total + Long_Long_Float(Elapsed);
  11.           Total := Total + Logs(Session).Total;
  12.            end if;
  13.         end;
  14.      end if;
  15.      end loop;
  16.           
  17.      for Log in Logs'Range loop
  18.      if Logs(Log).Total /= 0.0 then
  19.         Logs(Log).Rate := Rate_Type((Logs(Log).Total / Total) * 100.0);
  20.      else
  21.         Logs(Log).Rate := 0.0;
  22.      end if;
  23.      end loop;
  24.      
  25.   end Statistic;

Reply

Marsh Posté le 20-11-2024 à 21:28:16   

Reply

Marsh Posté le 20-11-2024 à 22:46:41    

Ca y est j'ai trouvé.
 
J'initialize à 1970 est quand je ferme la sessions j'affecte clock à Bot alors que top est pas à jour.
 
Ce qui fait une sacret difference.
 
 
 

Reply

Marsh Posté le 20-11-2024 à 23:06:13    

[:oh shi-] Du coup ce code provoque une divvision par zéro.

Reply

Marsh Posté le 21-11-2024 à 06:06:50    

Ca y est !

Code :
  1. with Ada.Calendar;
  2. use Ada.Calendar;
  3.  
  4. package Sky.Logs is
  5.  
  6.   type Log_Enum is (None, Organizer, Computer, Planning, Makefile,
  7.              Manpage, Project, HOWTO, HISTORY, Test,
  8.              Moneybox, Activity, Stocks, Bank);
  9.  
  10.   type Session_Record is
  11.      record
  12.      Top : Time := Time_Of(2399, 12, 31, 86399.99);
  13.      Bot : Time := Clock;
  14.      end record;
  15.  
  16.   procedure Open (Session : in out Session_Record);
  17.   procedure Close (Session : in out Session_Record);
  18.  
  19.   type Session_Array is array (Log_Enum) of Session_Record;
  20.  
  21.   type Rate_Type is delta 0.01 digits 5 range 0.0..100.0;
  22.  
  23.   type Log_Record is
  24.      record
  25.      Total : Long_Long_Float := 0.0;
  26.      Rate  : Rate_Type := 0.0;
  27.      end record;
  28.  
  29.   type Log_Array is array (Log_Enum) of Log_Record;
  30.  
  31.   procedure Statistic (Sessions : in out Session_Array; Logs : in out Log_Array);
  32.  
  33.   procedure Save (Logs : in Log_Array; Filename : in String);
  34.   procedure Restore (Logs : out Log_Array; Filename : in String);
  35.  
  36.  
  37.   Log_Filename : constant String := "sky-logs.txt";
  38.  
  39. end Sky.Logs ;


Code :
  1. with Ada.Text_Io;
  2. use Ada.Text_Io;
  3. with Ada.Calendar.Formatting;
  4. package body Sky.Logs is
  5.   procedure Open (Session : in out Session_Record) is
  6.   begin
  7.      Session.Top := Clock;      
  8.   end Open;
  9.    
  10.   procedure Close (Session : in out Session_Record) is
  11.   begin
  12.  
  13.      Session.Bot := Clock;      
  14.   end Close;
  15.  
  16.   Total : Long_Long_Float := 0.0;
  17.  
  18.   procedure Statistic (Sessions : in out Session_Array; Logs : in out Log_Array) is
  19.      
  20.      Sum : Long_Long_Float := 0.0;
  21.   begin
  22.      
  23.     for Session in Sessions'Range loop
  24.       
  25.       if Sessions(Session).Bot > Sessions(Session).Top then
  26.  
  27.         declare
  28.            Elapsed : constant Duration := Sessions(Session).Bot - Sessions(Session).Top;
  29.         begin
  30.           
  31.           
  32.            if Elapsed > 0.0 then
  33.           
  34.           Logs(Session).Total := Logs(Session).Total + Long_Long_Float(Elapsed);
  35.           
  36.           Total := Total + Logs(Session).Total;
  37.           
  38.           Sessions(Session).Top := Time_Of(2399, 12, 31, 86399.99);
  39.           
  40.            end if;
  41.         end;
  42.      end if;
  43.     end loop;
  44.     
  45.     if Total > 0.0 then
  46.       
  47.        for Log in Logs'Range loop
  48.           
  49.           if Logs(Log).Total >= 1.0 then
  50.         
  51.          Sum := Logs(Log).Total / Total;
  52.         
  53.          Logs(Log).Rate := Rate_Type(Sum * 100.0);
  54.         
  55.           else
  56.          Logs(Log).Rate := 0.0;
  57.           end if;
  58.        end loop;      
  59.     end if;
  60.  
  61.   end Statistic;
  62.  
  63.   procedure Save (Logs : in Log_Array; Filename : in String) is
  64.      File : File_Type;
  65.   begin
  66.      begin
  67.      Open(File, Out_File, Filename);
  68.      exception
  69.      when others =>
  70.         Create(File, Out_File, Filename);
  71.      end;
  72.      for log in Logs'Range loop
  73.      Put_Line(File, Long_Long_Float'Image(Logs(Log).Total));
  74.      Put_Line(File, Rate_Type'Image(Logs(Log).Rate));
  75.      end loop;
  76.      Close(File);
  77.   end Save;
  78.      
  79.      
  80.   procedure Restore (Logs : out Log_Array; Filename : in String) is
  81.      File : File_Type;
  82.   begin
  83.      Open(File, In_File, Filename);
  84.      for Log in Logs'Range loop
  85.      if not End_Of_File(File) then
  86.         Logs(Log).Total := Long_Long_Float'Value(Get_Line(File));
  87.         Logs(Log).Rate := Rate_Type'Value(Get_Line(File));
  88.         Total := Total + Logs(Log).Total;
  89.      end if;
  90.      end loop;
  91.      Close(File);
  92.   end Restore;
  93.  
  94. end Sky.Logs ;

Reply

Sujets relatifs:

Leave a Replay

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