UE MAREP Cours 10 : Projet Patricia Renault UPMC 2005/2006
2/28 Plan Introduction Objectifs Complexité Présentation
3/28 Plan Introduction Durée Méthodologie Objectifs Complexité Présentation
4/28 Durée 4 semaines 2 cours - C 10, C 11 2 TD - TD 9, TD 10 4 TME - TME 9, TME 10, TME 11, TME 12 Evaluation durant la dernière séance de TME grâce à des démos
5/28 Méthodologie Décomposition du projet en 9 étapes de plus en plus complexes Comment procéder ? Pour chaque étape Ecriture du code d’une étape Test exhaustif de l’étape Si test = ok passage à l’étape suivante Sinon, correction de l’étape La note n’est pas proportionnelle à la quantité de ligne assembleur mais aux étapes validées !!!
6/28 Plan Introduction Objectifs Complexité Présentation
7/28 Objectifs Récapituler et approfondir les notions abordées : Représentation des nombres Représentation d'une expression arithmétique Interface avec l'utilisateur : saisie et affichage, traduction depuis et vers les structures utilisées pour le calcul Découpage d’un problème en traitements élémentaires, structurations en fonctions Mise en correspondance d'une fonction C avec une de ses traductions possibles en langage d'assemblage
8/28 Plan Introduction Objectifs Complexité Présentation
9/28 Complexité etape1etape2etape3etape4etape5etape7etape8 etape6etape Préparé en TD 9 et 10 12/20
10/28 Plan Introduction Objectifs Complexité Présentation Expressions arithmétiques Description globale Décomposition en étapes
11/28 Expressions arithmétiques Trois types d’expression arithmétiques Infixe : l’opérateur est placé entre les opérandes Exemple : Préfixe : l’opérateur est placé avant les 2 opérandes Exemple : Postfixe : l’opérateur est placé après les 2 opérandes Exemple : Quel que soit le type d’expression, on peut représenter une expression par un arbre où Les nœuds sont les opérateurs Les feuilles sont les opérandes
12/28 Expressions arithmétiques + * * /
13/28 Expression infixée ( *(13+8)+14*9)/20= 9 + * * /
14/28 Expression préfixée / * * * * /
15/28 Expression post-fixée * * + 20 / = 9 + * * / Utilisé dans le projet
16/28 Expression post-fixée Parcours (Arbre){ Si Arbre = Feuille retourner valeur(Feuille). Si Arbre = Nœud_unaire retourner Applique_op(nœud_unaire(Parcours(Sous_arbre_nœud_unaire))) Si Arbre = nœud_binaire Sous_expr_1 = Parcours(nœud_binaire.Sous_arbre_gauche) Sous_expr_2 = Parcours(nœud_binaire.Sous_arbre_droit) Retourner(Applique_op(nœud_binaire.op, sous_expr_1, sous_expr_2)) } + * * /
17/28 Réalisation saisir_chaine structurer_expr evaluer_expr convertir_entier Afficher résultat expr. valide? oui non Débu t
18/28 Réalisation int main(){ char e_ch[64]; Expr_struct_elem e_str[32]; int ok = 0, nb; while (ok == 0){ saisir_chaine(e_ch); if (structurer_expr(e_ch, e_str) == 1) ok = 1; printf("Expr KO\n"); } nb = evaluer_expr(e_str); printf("expression %s=%d\n",e_ch,nb); return 0; }
19/28 Réalisation - expression structurée typedef struct expr_struct_elem { char type; char operat; unsigned short int operand;/* 2 octets */ }Expr_struct_elem; Octet 0Octet 1Octet 2 et octet 3 TypeOpérateurOpérande Attention opérande = o3o2 Opérateur unaire 0# Opérateur binaire * 3/# Type 0Fin d’expression 1opérande 2Opérateur binaire 3Opérateur unaire
20/28 Réalisation - étape 5 void saisir_chaine(char *expr_chaine) Demande la saisie d’une expression postfixée Effectue la saisie Vérifie que la chaîne saisie ne contient que des caractères valides Répète ces opérations jusqu’à obtenir une chaîne syntaxiquement correcte. Exemples : est valide z % r est invalide
21/28 Réalisation - étape 4 int structurer_expr(char *expr_chaine, Expr_struct_elem *expr_struct) Converti la chaîne saisie en une expression structurée Exemple chaîne saisie : 2 3 +, l’expression structurée sera 0x (pour 2) 0x (pour 3) 0x (pour +) 0x (pour fin d’expression structurée) Exemple : 4 1 * /
22/28 long evaluer_expr(Expr_struct_elem *e_str) Evalue l’expression structurée passée en argument en appliquant l’algorithme de parcours Nécessite l’utilisation de la pile pour évaluer cette expression structurée et des fonctions empile et dépile Réalisation - étape 4
23/28 long evaluer_expr(Expr_struct_elem *e_str) { Pile P ;/* un tableau de 32 entiers et deux fonctions d’accès : empiler(P,e) et dépiler(P)*/ Indice i ; i = indice du premier élément de e_str while (e_str[i].type != fin_expr) { if (e_str[i].type == OP) /* operande */ empiler(P, Expr[i].operande); Réalisation - étape 4
24/28 else /*op unaire*/if (e_str[i].type = OPERUN) { V1 = dépiler(P); V2 = appliquer_op( e_str[i].operateur, V1); empiler(P,V2); } else { /* opérateur binaire */ V1 = dépiler(P); V2 = dépiler(P); Réalisation - étape 4
25/28 V3 = appliquer_op( e_str[i].operateur, V1, V2); empiler(P,V3); } /* fin si interne */ }/* fin si externe */ i = indice elem suivant e_str } /* Fin while */ return (dépiler(P)); } Réalisation - étape 4
26/28 Réalisation - étape 4 Fonctionnement de l’algorithme précédent sur 4 1 * / 4 est un opérande => empile (P, 4) 1 est un opérande => empile (P, 1) * est un opérateur => dépile (P, op2), dépile (P, o1), applique op1 * op2 puis empile (P, op1*op2) 5 est un opérande => empile (P, 5) 2 est un opérande => empile (P, 2) - est un opérateur => dépile (P, op2), dépile (P, o1), applique op1 - op2 puis empile (P, op1-op2) / est un opérateur => dépile (P, op2), dépile (P, o1), applique op1 / op2 puis empile (P, op1/op2) Fin d’expression => dépile (P, résultat)
27/28 Réalisation - étape 4 Une expression postfixée est valide si elle est réductible par l’algorithme d’évaluation à un nombre. Ce nombre est l’unique élément de la pile à la fin de l’algorithme d’évaluation. Règles de validité : en parcourant l’expression post-fixée de gauche à droite, Il y a toujours plus d’opérandes que d’opérateurs binaires. A la fin, la différence entre le nombre d’opérandes et d’opérateurs binaires est de 1 exactement.
28/28 Réalisation Etape 1 : Evaluation d’une expression structurée valide ne contenant qu’un seul opérateur binaire Etape 2 : Evaluation d’une expression avec table d’indirection pour déterminer l’adresse du saut Etape 3 : Evaluer d’une expression structurée valide avec plusieurs opérateurs binaire Etape 4 : Structuration d’une expression à partir d’une chaîne de caractère mise en mémoire composée de nombre à un chiffre sans séparateur Etape 5 : Saisie d’une chaîne de caractère et vérification de la validité des caractères saisis