Changes between Version 5 and Version 6 of CaoCourseTme5
- Timestamp:
- Mar 7, 2007, 5:55:46 PM (18 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
CaoCourseTme5
v5 v6 10 10 d'arbres ABL (Abres Binaires Lisp-Like), et à rafraîchir vos connaissances dans le domaine de la programmation 11 11 des fonctions récursives. 12 12 13 Les expressions Booléennes multi-niveaux sont des expressions Booléennes préfixées pouvant comporter 13 14 plusieurs niveaux d’imbrication de parenthèses. On représente une expression Booléenne comme une liste chaînée de bipointeurs. … … 40 41 Dans le cas des arbres ABL, le champs DATA peut contenir soit un pointeur vers un noeud de l’arbre (bip_t *), soit un pointeur vers une variable Booléenne (var_t *), soit un entier définissant le code d’un opérateur Booléen (unsigned int). Par conséquent, un cast est nécessaire chaque fois qu’on veut affecter une valeur ou lire la valeur contenue dans ce champs de la structure. 41 42 42 On suppose qu’ondispose des fonctions suivantes :43 On dispose des fonctions suivantes : 43 44 44 45 {{{ … … 57 58 58 59 Pour utiliser ces structures de données et ces fonctions, vous devez inclure dans votre programmes les fichiers suivants: 59 {{ 60 {{{ 60 61 #include <bip.h> 61 62 #include <var.h> … … 73 74 = C. Fonction d’affichage = 74 75 75 Récupérez l'archive [attachment:tme5.tar.gz TME5]. En la décompressant, vous obtiendrez un répertoire {{{tme5}}} contenant les fichiers dont vous avez besoin pour ce TME, et en particulier un fichier {{{main.c}}} que vous devrez complêter:76 Récupérez l'archive [attachment:tme5.tar.gz TME5]. En la décompressant, vous obtiendrez un répertoire {{{tme5}}} contenant les fichiers dont vous avez besoin pour ce TME, et en particulier un {{{Makefile}}} et un fichier {{{main.c}}} que vous devrez complêter: 76 77 77 78 * '''C.1''': Ecrire en langage C la fonction récursive display_abl() présentée en cours. cette fonction prend en entrée un pointeur p sur un bipointeur représentant la racine d'un arbre ABL, et affiche sur le terminal standard l’expression Booléenne normalisée correspondante. … … 83 84 = D. Calcul du nombre de littéraux = 84 85 85 On cherche maintenant à écrire en langage C la fonction récursive count_abl(). cette fonction prend en entrée un pointeur p sur la racine d’un arbre ABL, et renvoie un entier représentant le nombre de littéraux (c’est và dire le nombre de feuilles de l’arbre ABL correspondant à des variables).86 On cherche maintenant à écrire en langage C la fonction récursive count_abl(). cette fonction prend en entrée un pointeur p sur la racine d’un arbre ABL, et renvoie un entier représentant le nombre de littéraux (c’est và dire le nombre de feuilles de l’arbre ABL). 86 87 {{{ 87 88 int count_abl(bip_t *p) … … 91 92 * '''D.3''': Exécutez le programme pour les expressions Booléennes suivantes : 92 93 {{{ 93 E1 = (a.b) + (a.c) + (b.c)94 E1 = (a.b) + (a.c) + (b.c) 94 95 E2 = (a.b.c) + (a.b.c’) + (a.b’.c) + (a’.b.c) 95 96 }}} … … 98 99 99 100 On appelle support d’une expression Booléenne l’ensemble de toutes les variables qui apparaissent au moins une fois dans cette expression. 100 Pour représenter un ensemble de variables, on utilise également des bipointeurs : Un ensemble est représenté par une liste chaînée de bipointeurs où le champs DATA pointe sur un élément de l’ensemble (ici une variable).101 Attention : même si on utilise la même structure de donnée bip_t, les bipointeurs utilisés pour représenter des ensembles de variables sont totalement indépendants des bipointeurs utiliséspour représenter des arbres ABL.101 Pour représenter un ensemble de variables, on utilise également des bipointeurs : Un ensemble est représenté par une liste chaînée de bipointeurs où le champs DATA pointe sur un élément de l’ensemble (ici une structure var_t). 102 Attention : on utilise la même structure de donnée bip_t pour représenter des ensembles de variables, et pour représenter des arbres ABL. 102 103 103 104 On cherche à écrire la fonction support_abl(), qui prend en entrée un pointeur p sur la racine d’un arbre ABL, et qui renvoie un pointeur sur la liste chaînée des n variables constituant son support. … … 110 111 }}} 111 112 Pour éviter de confondre cet ensemble de noms avec une expression Booléenne, on affichera cette liste entre deux accolades de la façon suivante : { a b c d } 112 Valider cette fonction en construisant explicitement une liste chainée de variables au moyen des fonctions cons_bip() et consvar(), et affichez cette liste.113 Valider cette fonction en construisant explicitement dans la fonction main() une liste chainée de variables au moyen des fonctions cons_bip() et consvar(), et affichez cette liste. 113 114 * '''E.2''': Ecrire la relation de récurrence qui permet d’exprimer le support d’une expression Boléenne, connaissant le support de chacun de ses opérandes. 114 115 * '''E.3''': Ecrire la fonction union_list() qui effectue l’union de deux ensembles. … … 116 117 bip_t *union_list(bip_t *p1, bip_t *p2) 117 118 }}} 118 cette fonction prend en entrée deux pointeurs sur deux listes chainées L1 et L2, et renvoie un pointeur sur la liste chaînée représentant l’union des deux listes. Les deux listes L1 et L2 ne doivent pas être modifiés par la fonction union_list().119 Cette fonction prend en entrée deux pointeurs sur deux listes chainées L1 et L2, et renvoie un pointeur sur la liste chaînée représentant l’union des deux listes. Les deux listes L1 et L2 ne doivent pas être modifiés par la fonction union_list(). 119 120 Attention: l’union est une opération différente de la simple concaténation, car chaque élément ne doit figurer qu’une seule fois dans la liste. On considère que les deux ensembles L1 et L2 qu'on veut réunir respectent cette condition. Valider cette fonction union_list() en construisant explicitement deux listes de variables non disjointes. On affichera les deux listes L1 et L2, ainsi que la liste résultant de l’union de L1 et L2. 120 121 * '''E.4''': Ecrire effectivement la fonction support_abl(), en veillant à éviter les « fuites de mémoire ». On parle de fuite de mémoire chaque fois qu’un programme fait de l’allocation dynamique de mémoire sans libérer la mémoire qui n’est plus utilisée. Soyez attentifs à libérer la mémoire allouée par la fonction cons_bip() ... 121 122 * '''E.5''': Intégrez la fonction support_abl() dans le programme main(), et vérifiez que cette fonction calcule correctement le support des trois expressions E0, E1 et E2. 122 123 123 = E. Fonction d’évaluation =124 = F. Fonction d’évaluation = 124 125 125 126 Pour les plus courageux (ou les plus rapides), on cherche maintenant à écrire une fonction d’évaluation d’une expression Booléenne représentée par un ABL, quand on connaît les valeurs de toutes les variables constituant son support. On ne considère que deux valeurs possibles pour le champs VALUE : 0 et 1. … … 128 129 }}} 129 130 130 * ''' E.1''': Rappeler les relations de récurrence qui relient la valeur d’une expression Booléenne à la valeur de ses opérandes, en analysant successivement le cas des 4 opérateurs NOT, OR, AND et XOR.131 * ''' E.2''': Ecrire en langage C la fonction récursive eval_abl(), et valider cette fonction en l’intégrant dans le programme main().131 * '''F.1''': Rappeler les relations de récurrence qui relient la valeur d’une expression Booléenne à la valeur de ses opérandes, en analysant successivement le cas des 4 opérateurs NOT, OR, AND et XOR. 132 * '''F.2''': Ecrire en langage C la fonction récursive eval_abl(), et valider cette fonction en l’intégrant dans le programme main(). 132 133 133 134 = Compte-rendu =