[POO] Modélisation d'une bascule.

Modélisation d'une bascule. [POO] - Divers - Programmation

Marsh Posté le 11-01-2013 à 22:37:36    

Bonjour,
Comment modéliser une bascule orienté objet ?
A votre bon coeur. Merci.  :jap:

Reply

Marsh Posté le 11-01-2013 à 22:37:36   

Reply

Marsh Posté le 11-01-2013 à 23:47:56    

Je suis parti sur un modèle je vais voir à l'usure.
 
edit : pour des raison d'éuilibre j'ai modifié mon code initial
 
Spécification.
 

Code :
  1. package My_Lib.Bascules is
  2.  
  3.  
  4.   type Adjustement_Type is (Left, Right, Adjust);
  5.  
  6.   subtype Board_Adjustement_Type is Adjustement_Type range Left..Right;
  7.  
  8.  
  9.   type Bascule_Type is tagged private;
  10.  
  11.   ----------------------------------------------------------
  12.   -- Adjuster les plateaux d'une bascule par pondération. --
  13.   ----------------------------------------------------------
  14.   procedure Ponderation(Bascule : in out Bascule_Type'Class;
  15.              Board       : in Adjustement_Type;
  16.              Ponderation : in Float);
  17.  
  18.  
  19.   Board_Overflow : exception;
  20.   -- Levée si la pondération excède la capacité machine.
  21.  
  22.   -----------------------------------------
  23.   -- Obtenir l'ajustement d'une bascule. --
  24.   -----------------------------------------
  25.   function Adjustement(Bascule : in Bascule_Type'Class;Adjustement : in Adjustement_type) return Float;
  26.  
  27.   ---------------------------------
  28.   -- Mettre les plateaux à  zéro. --
  29.   ---------------------------------
  30.   procedure Reset(Bascule : in out Bascule_Type'Class);
  31.  
  32.  
  33.   -------------------------------------------------
  34.   -- Obtenir le l'ajustement maximum et minimum. --
  35.   -------------------------------------------------
  36.   function Max(Bascule : in Bascule_Type'Class) return Adjustement_Type;
  37.   function Min(Bascule : in Bascule_Type'Class) return Adjustement_Type;
  38.  
  39.  
  40. private
  41.  
  42.  
  43.   type Ponderations_Type is array (Adjustement_Type) of Float;
  44.    
  45.   type Bascule_Type is tagged
  46.      record
  47.      Ponderations : Ponderations_Type := (others => 0.0);
  48.      end record;
  49.  
  50.  
  51.  
  52. end My_Lib.bascules;


 
 
Implémentation
 

Code :
  1. package body My_Lib.Bascules is
  2.  
  3.  
  4.  
  5.   -------------------------------------------------
  6.   -- Obtenir le l'ajustement maximum et minimum. --
  7.   -------------------------------------------------
  8.   function Max(Bascule : in Bascule_Type'Class) return Adjustement_Type is
  9.   begin
  10.      
  11.      if Bascule.Ponderations(Right) >  Bascule.Ponderations(Left) then
  12.      return Right;
  13.      elsif Bascule.Ponderations(Left) >  Bascule.Ponderations(Right) then
  14.      return Left;
  15.      else
  16.      return Adjust;
  17.      end if;
  18.   end Max;
  19.   function Min(Bascule : in Bascule_Type'Class) return Adjustement_Type is
  20.   begin
  21.      
  22.      if Bascule.Ponderations(Right) <  Bascule.Ponderations(Left) then
  23.      return Right;
  24.      elsif Bascule.Ponderations(Left) <  Bascule.Ponderations(Right) then
  25.     return Left;
  26.      else
  27.      return Adjust;
  28.      end if;
  29.   end Min;
  30.  
  31.  
  32.  
  33.  
  34.   ----------------------------------------------------------
  35.   -- Adjuster les plateaux d'une bascule par pondération. --
  36.   ----------------------------------------------------------
  37.   procedure Ponderation(Bascule : in out Bascule_Type'Class;
  38.              Board       : in Adjustement_Type;
  39.              Ponderation : in Float) is
  40.   begin
  41.      
  42.      Bascule.Ponderations(Board) := Bascule.Ponderations(Board) + Ponderation;
  43.      case Board is
  44.      when Left =>
  45.         Bascule.Ponderations(Right) := Bascule.Ponderations(Right) - Ponderation;
  46.         Bascule.Ponderations(Left) := Bascule.Ponderations(Left) + Ponderation;        
  47.      when Right =>
  48.         Bascule.Ponderations(Left) := Bascule.Ponderations(Left) - Ponderation;
  49.         Bascule.Ponderations(Right) := Bascule.Ponderations(Right) + Ponderation;        
  50.         
  51.      when Adjust =>
  52.         if Bascule.Ponderations(Adjust) > Ponderation then
  53.            Bascule.Ponderations(Left) := Bascule.Ponderations(Left) - Ponderation;        
  54.         elsif Ponderation > Bascule.Ponderations(Adjust) then
  55.            Bascule.Ponderations(Right) := Bascule.Ponderations(Right) + Ponderation;        
  56.         else          
  57.            return;
  58.         end if;
  59.         
  60.      end case;
  61.      if Max(Bascule) /= Adjust then
  62.      Bascule.Ponderations(Adjust) := abs(Bascule.Ponderations(Bascule.Max) -
  63.                            Bascule.Ponderations(Bascule.Min));
  64.      end if;
  65.   exception
  66.      when Constraint_Error =>
  67.      raise Board_Overflow;
  68.   end Ponderation;
  69.      
  70.   ----------------------------------------
  71.   -- Obtenir l'ajustement d'une bascule --
  72.   ----------------------------------------
  73.   function Adjustement(Bascule : in Bascule_Type'Class;Adjustement : in Adjustement_type) return Float is
  74.   begin  
  75.      
  76.      return Bascule.Ponderations(Adjustement);
  77.   end Adjustement;
  78.      ---------------------------------
  79.   -- Mettre les plateaux à  zero. --
  80.   ---------------------------------
  81.   procedure Reset(Bascule : in out Bascule_Type'Class) is
  82.   begin
  83.      
  84.      Bascule.Ponderations := (others => 0.0);
  85.   end Reset;
  86. end My_Lib.bascules;


 
 
Et j'ai écrit une procédure principale à la recherche de l'équilibre.
 

Code :
  1. with My_Lib.Bascules;
  2. use My_Lib.Bascules;
  3.  
  4. with Ada.Text_Io, Ada.Float_Text_Io;
  5. use Ada.Text_Io, Ada.Float_Text_Io;
  6.  
  7. with Ada.Numerics.Float_Random;
  8. use Ada.Numerics.Float_Random;
  9.  
  10. procedure Main is
  11.  
  12.  
  13.   Bascule : Bascule_Type;
  14.  
  15.   Ponderation_Left,
  16.   Ponderation_Right,
  17.   Ponderation_Adjust : Float := 1.0;
  18.  
  19.  
  20.   Float_Gen : Generator;
  21.  
  22. begin
  23.  
  24.   Reset(Float_Gen);
  25.   Ada.Text_Io.Put("Enter initial ponderation : " );
  26.   Ada.Float_Text_Io.Get(Ponderation_Left);
  27.   Ponderation(Bascule, Left, Ponderation_Left);
  28.   Ada.Text_Io.Put("Initial ponderation set to : " );
  29.   Ada.Float_Text_Io.put(Adjustement(Bascule, Left));
  30.   New_Line;
  31.   loop      
  32.      Ponderation_Adjust := Adjustement(Bascule, Adjust);            
  33.      Put("Adjustement Ponderation := " );
  34.      Ada.Float_Text_Io.Put(Ponderation_Adjust);                        
  35.      
  36.      exit when Ponderation_Adjust = 0.0;
  37.      Ponderation_Adjust := Random(Float_Gen);
  38.      Put("Adjustement min : " & Adjustement_Type'Image(Bascule.Min));
  39.      Ponderation(Bascule, Bascule.Min, Ponderation_Adjust);
  40.      New_Line;
  41.   end loop;
  42. end Main;


 
C'est rigolo.  :lol:  :D  :hello:


Message édité par Profil supprimé le 12-01-2013 à 01:23:19
Reply

Marsh Posté le 12-01-2013 à 01:48:23    

Moins rigolo mais plus fonctionnel :
 
Avec ça comme ça :
 

Code :
  1. ----------------------------------------------------------                                                                              
  2.   -- Adjuster les plateaux d'une bascule par pondération. --                                                                              
  3.   ----------------------------------------------------------                                                                              
  4.   procedure Ponderation(Bascule : in out Bascule_Type'Class;
  5.                         Board       : in Adjustement_Type;
  6.                         Ponderation : in Float) is
  7.   begin
  8.  
  9.      Bascule.Ponderations(Board) := Bascule.Ponderations(Board) + Ponderation;
  10.      case Board is
  11.         when Left =>
  12.            Bascule.Ponderations(Right) := Bascule.Ponderations(Right) - Ponderation;
  13.            Bascule.Ponderations(Left) := Bascule.Ponderations(Left) + Ponderation;
  14.         when Right =>
  15.            Bascule.Ponderations(Left) := Bascule.Ponderations(Left) - Ponderation;
  16.            Bascule.Ponderations(Right) := Bascule.Ponderations(Right) + Ponderation;
  17.  
  18.         when Adjust =>
  19.            Bascule.Reset;
  20.      end case;
  21.      if Max(Bascule) /= Adjust then
  22.         Bascule.Ponderations(Adjust) := abs(Bascule.Ponderations(Bascule.Max) -
  23.                                               Bascule.Ponderations(Bascule.Min));
  24.      end if;
  25.   exception
  26.      when Constraint_Error =>
  27.         raise Board_Overflow;
  28.   end Ponderation;


 
On termine quand l'adjust de la bascule égale la ponderation.

Reply

Marsh Posté le 12-01-2013 à 17:52:15    

J'ai écris ce prototype de bascule, pour peser les mots.
 
Oui mais faut pas oublier que c'est dans une architecture hiérarchisé.
 
Schema
 


                              -------------------------------------------------------------------------
                              -- Nous sommes tous logé à la même enseigne. --
                              -------------------------------------------------------------------------
                                                      Maître mot
 
                              Mot gauche                               Mot droit.
                             
 
               Mot gauche                         Mot droit/Mot Gauche           Mot droit


 
Une arbre binaire, typiquement (devoir, apprécier, déprécier), ... etc


Message édité par Profil supprimé le 12-01-2013 à 18:06:20
Reply

Sujets relatifs:

Leave a Replay

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