Changes between Version 1 and Version 2 of 2011CaoTme6


Ignore:
Timestamp:
Mar 18, 2012, 4:49:10 PM (13 years ago)
Author:
jpc
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • 2011CaoTme6

    v1 v2  
    33
    44= Représentation d'une Structure Booléenne Multi-niveaux (EBM) =
    5 
    6 Les fichiers nécessaires à la réalisation de ce TME sont disponibles
    7 directement sur le réseau enseignement, dans le répertoire:
    8 {{{~jpc/M1-CAO/TME/3.public}}}
    95
    106
     
    2723class Ebm {
    2824  public:
     25    enum Type         { Variable=1, Expression=2 };
     26    enum OperatorType { Not=1, And, Or, Xor, UndefinedOperator };
     27  public:
     28    static  Ebm*               parse     ( std::string );
     29  public:
    2930            unsigned int       litterals ();
    3031            std::set<EbmVar*>  support   ();
     32            BoolValue          eval      ();
    3133            void               support   ( std::ostream& );
    3234            void               display   ( std::ostream& );
    33             ValueType          eval      ();
    34     static  Ebm*               parse     ( std::string expression );
    3535};
    3636}}}
     
    4747   notation ''préfixée''.
    4848 * {{{eval()}}} : Calcule la valeur de l'expression booléenne. Le type de retour est un
    49    {{{ValueType}}}, c'est à dire une variable pouvant prendre trois valeurs:
    50    {{{Low}}}, {{{High}}} et {{{Unknown}}} (cf. {{{CaoTypes.h}}}).
     49   {{{BoolValue}}}, c'est à dire une variable pouvant prendre trois valeurs:
     50   {{{Zero}}}, {{{One}}} et {{{Undefined}}} (cf. {{{TME 2}}}).
    5151 * {{{parse()}}} : Une fonction statique transformant une chaîne de caractères en une
    5252   {{{EBM}}}.
     
    5757{{{
    5858class EbmVar: public Ebm {
     59  public:
     60  // Operations sur les dictionnaires.
     61    static   EbmVar*       get      ( unsigned int index );
     62    static   EbmVar*       get      ( std::string name );
     63  public:
     64    inline   std::string   getName  ();
     65    inline   BoolValue     getValue ();
     66    inline   unsigned int  getIndex ();
     67    inline   void          setValue ( BoolValue value );
     68  private:
     69                           EbmVar   ( std::string name, BoolValue value=Low );
     70    virtual               ~EbmVar   ();
    5971  private:
    6072    static unsigned int                    _maxIndex;
    61     static std::map<std::string ,EbmVar*>  _byName;   // All variables storage.
    6273    static std::map<unsigned int,EbmVar*>  _byIndex;
    63   private :   
    64              std::string   _name;       // Variable name.
    65              ValueType     _value;      // Logical value.
    66              unsigned int  _index;      // Unique index (for ROBDD)
    67   public:
    68                            EbmVar   ( std::string name, ValueType value=Low );
    69     virtual               ~EbmVar   ();
    70   public:
    71     inline   std::string   getName  ();
    72     inline   ValueType     getValue ();
    73     inline   unsigned int  getIndex ();
    74     inline   void          setValue ( ValueType value );
    75   // Operations sur le dictionnaire
    76     static   EbmVar*       get      ( unsigned int index );
    77     static   EbmVar*       get      ( std::string name );
     74  // Completer ici...
     75  private:   
     76           std::string                     _name;     // Variable name.
     77           BoolValue                       _value;    // Logical value.
     78           unsigned int                    _index;    // Unique index (for ROBDD)
    7879};
    7980}}}
    80 
    8181
    8282__Attributs de la classe {{{EbmVar}}}:__
    8383 * {{{_name}}}  : Le nom de la variable (par ex. {{{"a"}}})
    8484 * {{{_value}}} : La valeur actuellement affectée à la variable
    85    ({{{Low}}}, {{{High}}} ou {{{Unknown}}}).
     85   ({{{Zero}}}, {{{One}}} ou {{{Undefined}}}).
    8686 * {{{_index}}} : Un index permettant d'identifier de façon unique la
    87    variable. Cet index trouvera sont utilité dans le TME suivant, présentant les {{{ROBDD}}}.
    88 
     87   variable. Cet index trouvera son utilité dans le TME suivant, présentant les {{{ROBDD}}}.
    8988
    9089__Attributs ''statiques'' de la classe {{{EbmVar}}}:__
     
    131130}}}
    132131
    133 
    134132__Attributs de la classe {{{EbmExpr}}}:__
    135133 * {{{_operator}}} : le type de l'opérateur (dans {{{CaoTypes.h}}}, parmis
    136134   {{{Not}}}, {{{And}}}, {{{Or}}} ou {{{Xor}}}).
    137135 * {{{_operands}}} : une liste de pointeurs vers les opérandes.
    138 
    139136
    140137__Principales méthodes de la classe {{{EbmVar}}}:__
     
    152149== Présentation des méthodes récursives ==
    153150
    154 
    155151Les méthodes {{{litterals()}}}, {{{support()}}}, {{{display()}}} et {{{parse()}}} de la
    156152classe {{{Ebm}}} sont récursives. On définit le niveau de profondeur de l'arbre d'une
     
    212208== Fonctionnement de la fonction {{{getType()}}} ==
    213209
    214 
    215210Dans la présentation de la récursion, nous avons vu qu'il était nécessaire,
    216211pour choisir entre la récursion et l'arrêt, de savoir distinguer une variable
     
    231226
    232227[[Image(Ebm-5.png,align=center)]]
     228
     229
     230== Travail a Effectuer ==
     231
     232=== Question 1 ===
     233
     234Implanter {{{EbmVar}}}:
     235* Ajouter le dictionnaire manquant.
     236* Ajouter la fonction de création statique.
     237* Implanter les méthodes ''ordinaires''.
     238* Les constructeurs & destructeurs ne sont pas vides: que doivent-il
     239  contenir?
     240
     241
     242=== Question 2 ===
     243
     244Implanter {{{EbmExpr}}}:
     245* Penser à une façon simple pour les opérateurs logiques d'appeler le
     246  constructeur générique.
     247
     248
     249=== Question 3 ===
     250
     251Implanter {{{Ebm}}:
     252* Le squelette du fichier vous est fourni: [attachment:Ebm.cpp Ebm.cpp].
     253  Il contient le code de la fonction {{{Ebm::parse()}}}
     254* Implanter la déclaration (dans {{{Ebm}}}) et les deux sur-définitions
     255  de la fonction {{{getType()}}} (dans {{{EbmVar}}} & {{{EbmExpr}}}).
     256* Implanter les fonctions {{{Ebm::litterals()}}}, {{{Ebm::support()}}},
     257  {{{Ebm::eval()}}} et {{{Ebm::display()}}}.
     258 
     259
     260=== Question 4  ===
     261
     262Tester l'ensemble avec le programme suivant: [attachement:Main.cpp Main.cpp].
     263
     264
     265=== Question 5 (facultative) ===
     266
     267Il existe une autre façon d'implanter le mécanisme de récursivité
     268ne nécessitant pas de fonction {{{getType()}}}, suggérez une approche
     269alternative (utilisant plus intensivement l'héritage).