Changes between Version 1 and Version 2 of 2011CaoTme6
- Timestamp:
- Mar 18, 2012, 4:49:10 PM (13 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
2011CaoTme6
v1 v2 3 3 4 4 = Représentation d'une Structure Booléenne Multi-niveaux (EBM) = 5 6 Les fichiers nécessaires à la réalisation de ce TME sont disponibles7 directement sur le réseau enseignement, dans le répertoire:8 {{{~jpc/M1-CAO/TME/3.public}}}9 5 10 6 … … 27 23 class Ebm { 28 24 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: 29 30 unsigned int litterals (); 30 31 std::set<EbmVar*> support (); 32 BoolValue eval (); 31 33 void support ( std::ostream& ); 32 34 void display ( std::ostream& ); 33 ValueType eval ();34 static Ebm* parse ( std::string expression );35 35 }; 36 36 }}} … … 47 47 notation ''préfixée''. 48 48 * {{{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}}}). 51 51 * {{{parse()}}} : Une fonction statique transformant une chaîne de caractères en une 52 52 {{{EBM}}}. … … 57 57 {{{ 58 58 class 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 (); 59 71 private: 60 72 static unsigned int _maxIndex; 61 static std::map<std::string ,EbmVar*> _byName; // All variables storage.62 73 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) 78 79 }; 79 80 }}} 80 81 81 82 82 __Attributs de la classe {{{EbmVar}}}:__ 83 83 * {{{_name}}} : Le nom de la variable (par ex. {{{"a"}}}) 84 84 * {{{_value}}} : La valeur actuellement affectée à la variable 85 ({{{ Low}}}, {{{High}}} ou {{{Unknown}}}).85 ({{{Zero}}}, {{{One}}} ou {{{Undefined}}}). 86 86 * {{{_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}}}. 89 88 90 89 __Attributs ''statiques'' de la classe {{{EbmVar}}}:__ … … 131 130 }}} 132 131 133 134 132 __Attributs de la classe {{{EbmExpr}}}:__ 135 133 * {{{_operator}}} : le type de l'opérateur (dans {{{CaoTypes.h}}}, parmis 136 134 {{{Not}}}, {{{And}}}, {{{Or}}} ou {{{Xor}}}). 137 135 * {{{_operands}}} : une liste de pointeurs vers les opérandes. 138 139 136 140 137 __Principales méthodes de la classe {{{EbmVar}}}:__ … … 152 149 == Présentation des méthodes récursives == 153 150 154 155 151 Les méthodes {{{litterals()}}}, {{{support()}}}, {{{display()}}} et {{{parse()}}} de la 156 152 classe {{{Ebm}}} sont récursives. On définit le niveau de profondeur de l'arbre d'une … … 212 208 == Fonctionnement de la fonction {{{getType()}}} == 213 209 214 215 210 Dans la présentation de la récursion, nous avons vu qu'il était nécessaire, 216 211 pour choisir entre la récursion et l'arrêt, de savoir distinguer une variable … … 231 226 232 227 [[Image(Ebm-5.png,align=center)]] 228 229 230 == Travail a Effectuer == 231 232 === Question 1 === 233 234 Implanter {{{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 244 Implanter {{{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 251 Implanter {{{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 262 Tester l'ensemble avec le programme suivant: [attachement:Main.cpp Main.cpp]. 263 264 265 === Question 5 (facultative) === 266 267 Il existe une autre façon d'implanter le mécanisme de récursivité 268 ne nécessitant pas de fonction {{{getType()}}}, suggérez une approche 269 alternative (utilisant plus intensivement l'héritage).