Corrigé 18. Enoncé
1. Expression arithmétique sous forme d'un arbre binaire
Exemple
Algorithme récursif d'évaluation
Nous utilisons le prédicat Operande(T), égal à VRAI si Info(T) est un opérande, égal
à FAUX sinon.
Remarque :
- Opérande(T) peut être implémenté comme un champ additionnel.
- le champ Info est donc sous forme canonique.
Soit A un arbre représentant une expression arithmétique. L'algorithme d'évaluation est
le suivant :
Eval(A) :
SI Operande(A) :
Eval := Info(A)
SINON
Eval := Oper(Info(A), Eval(Fg(A), Eval(Fd(A))
FSI
Avec Oper une fonction qui effectue l'opération mentionnée par Info(A) entre deux
valeurs Eval(fg(A)) et Eval(fd(A)).
2. Expression arithmétique sous forme polonaise postfixée
Exemple
(a + b) * (c - d) est représentée comme : a b + c d - *
Algorithme
Nous supposons que chaque caractère est soit un identificateur d'une variable, soit un
opérateur, soit un caractère quelconque.
Nous utilisons les prédicats suivants :
Operande(C) : égal à VRAI si C est un opérande, FAUX sinon.
Binaire(C) : égal à VRAI si C est un opérateur binaire, FAUX sinon.
Unaire(C) : égal à VRAI si C est un opérateur unaire, FAUX
sinon
et les fonctions :
Val(C) : attribue la valeur associée à C (nous supposons par exemple qu'il existe une
table de correspondante variable <---> valeur ).
Oper1 : effectue l'opération binaire mentionnée par C entre deux
valeurs V1 et V2.
Oper : effectue l'opération unaire mentionnée par C sur la variable
V1.
Nous supposons que l'expression est sous forme de chaîne de caractères terminée par le
caractère ".", lue caractère par caractère.
L'algorithme utilise une pile.
Créerpile(Pile)
Lire(C)
Erreur := FAUX
TANTQUE C # '.' ET NON Erreur :
SI Opérande(C) : Empiler(Pile, Val(C))
SINON
SI Binaire(C) :
SI NON Pilevide(Pile) :
Dépiler(Pile, V1)
SI NON Pilevide(Pile) :
Dépiler(Pile, V2)
Empiler(Pile,Oper1(V1,V2,C)
SINON Erreur := VRAI FSI
SINON Erreur := VRAI FSI
SINON
SI Unaire(C):
SI NON Pilevide(Pile):
Dépiler(Pile,V1)
Empiler(Pile, Oper2(V1,C)
SINON Erreur := VRAI FSI
SINON Erreur := VRAI FSI
FSI
FSI
FINTANTQUE
3. Chaînage interne externe
Le fichier est un tableau en mémoire secondaire o� chaque élément a la structure
suivante :
TYPE Typebloc = STRUCTURE
Tab : Tableau[1..B] DE Typeclé
Nb : ENTIER
Lien : ENTIER
FIN
Typeclé peut être tout ensemble muni d'une relation d'ordre.
Module d'initialisation
La varible R est globale et est utilisée pour la recherche des emplacements libres.
POUR I =1, M
Bloc.Nb := 0
Bloc.Lien := -1
Ecrirebloc(F, I, Bloc)
FINPOUR
R := M
Module de Recherche/insertion
{ Recherche }
I := H(Clé) + 1
Lirebloc(F, I, Bloc)
Continue := VRAI
TANTQUE Continue :
Trouv := FAUX ; J := 1;
TANTQUE NON Trouv ET J <= Bloc.Nb
SI Bloc.Tab(J) = Clé
Trouv := VRAI
SINON J := J + 1 FSI
FINTANTQUE
SI Trouv : Continue := FAUX
SINON
SI Bloc.Lien # -1 :
I := Bloc.Lien
Lirebloc(F, I, Bloc)
SINON Continue := FAUX
FSI
FSI
FINTANTQUE
{ Insertion }
SI Trouv : " Succès"
SINON
SI Bloc.Nb < B {Il y a de la place dans le
bloc}
Bloc.Nb := Bloc.Nb + 1
Bloc.Tab(Bloc.Nb) :=
Clé
Ecrirebloc(F, I, Bloc)
SINON
{Recherche d'un bloc
libre à partir de R }
Arrêt := FAUX
TANTQUE R # 0 ET NON
Arrêt :
Lirebloc(F, R, Bloc1) { Utilisation d'un autre buffer }
SI Bloc.Nb < B :
Arrêt := VRAI
SINON R := R -1 FSI
FINTANTQUE
SI R = 0 : "
Débordement "
SINON
Bloc.Lien := R
Ecrirebloc(F, I, Bloc)
Bloc1.Nb := Bloc1.Nb + 1
Bloc1.Tab(Bloc1.Nb) := Clé
Ecrirebloc(F, R, Bloc1)
FSI
FSI
FSI