• Aucun résultat trouvé

Programmation objet

N/A
N/A
Protected

Academic year: 2022

Partager "Programmation objet"

Copied!
15
0
0

Texte intégral

(1)

1 Département Informatique

Département Informatique

Structures de données – partie 3 Arbres binaires de calcul

Programmation objet

Cours n°8

(2)

Département Informatique

Département Informatique Arbre binaire de calcul

Nous avons vu l'utilisation des arbres binaires en tant que structure de données optimisée pour la recherche par valeur sur un critère "binaire".

La même structure peut également être utilisée dans un autre cas : Un calcul d'expression mathématiques

On parle dans ce cas d'arbre binaire de calcul.

La structure est identique, mais son fonctionnement est différent.

(3)

3 Département Informatique

Département Informatique Principe

Lorsqu'on effectue un calcul, on effectue en fait une suite d'opérations Chaque opération utilise deux opérandes

Chaque opération fournit un résultat qui peut être utilisé pour une autre opération.

On remarque donc que l'ensemble de l'expression de calcul peut se modéliser dans un arbre binaire où les feuilles seront les opérandes et les racines les opérations...

(4)

Département Informatique

Département Informatique Exemple

Soit le calcul : 6 * 3 + 4 * 2 - 2

Le calcul peut se modéliser par l'arbre binaire suivant :

4 2

* +

-

2

6 3

*

(5)

5 Département Informatique

Département Informatique Exemple d'implémentation C++

class arbre_calcul {

enum type_operation

{aucun=0,plus='+', moins='-', mult='*', div='/'};

struct feuille {

type_operation Operateur;

double Operande;

feuille* f_gauche;

feuille* f_droite;

double Valeur() const;

};

typedef feuille* pfeuille;

pfeuille racine;

double Valeur() const;

};

(6)

Département Informatique

Département Informatique Effectuer le calcul

En utilisant un algorithme récursif, effectuer le calcul est simple.

En effet, la valeur d'une racine (d'un sous-arbre) se déduit directement :

• De l'opérateur contenu dans la racine

• De la valeur de l'opérande gauche

• De la valeur de l'opérande droite

On voit bien que l'on a besoin d'une méthode Valeur() qui va renvoyer :

• Soit la valeur contenue dans la feuille si c'est un nombre

• Soit le résultat d'un calcul si c'est un opérateur

(7)

7 Département Informatique

Département Informatique

double arbre_calcul::Valeur() const {

double val=0;

if(racine)

val = racine->Valeur();

return val;

}

double feuille::Valeur() const {

double val=0;

switch(Operateur) {

case aucun: val=Operande; break;

case plus: val=gauche->Valeur() + droite->Valeur();break;

//...

return val;

}

La récursivité nous permet le parcours simple

de l'arborescence

(8)

Département Informatique Département Informatique

Le "lancement" du calcul est donc extrêmement simple,

du fait de la structure de l'arbre binaire et de l'utilisation d'un algorithme récursif pour Valeur()

La création de l'arbre est un peu plus complexe, il faut bien évidemment gérer les priorités relatives des 4 opérateurs.

Si l'on souhaite gérer des parenthèses, la création de l'arbre se complexifie d'avantage, mais pas le calcul. En effet, une expression entre parenthèses est un sous-arbre.

(9)

9 Département Informatique

Département Informatique Algorithmes d'ajout (sans parenthèses)

Une expression commence obligatoirement par une opérande.

Se trouve ensuite un enchaînement opérateur-opérande

L'opérateur joue un rôle de "pivot" dans l'analyse de l'expression Suivant celui-ci, sa priorité par rapport au précédent, l'ajout dans l'arbre ne se fera pas de la même manière.

Priorité + - * /

+ = = < <

- = = < <

* > > = =

/ > > = =

(10)

Département Informatique

Département Informatique Cas n°1 : ajout à priorité inférieure 10*3 - 2

10

*

3

On ajoute le nouvel opérateur comme une racine et on prend l'ancien à gauche et l'opérande à droite

10

*

3

2 -

(11)

11 Département Informatique

Département Informatique Cas n°2 : ajout à priorité supérieure

10 + 4*3

10

+

4

On remplace la feuille de droite

par le nouvel opérateur, qui prendra

à gauche l'ancienne opérande et à droite la nouvelle opérande

10

+

* 4 3

(12)

Département Informatique

Département Informatique Cas 3 : ajout à priorité égale

3 + 4 - 2

3

+

4

2 -

3

+

4

La cas est identique au cas n°1

(13)

13 Département Informatique

Département Informatique Gestion des parenthèses

3*(4+2*(1-14*2))

Le principal problème avec les parenthèses est la détection des sous-expressions complètes.

On remarque que l'ouverture d'une parenthèse démarre une expression (donc un sous-arbre) et que la fermeture la termine.

La première parenthèse fermante correspond à la dernière

parenthèse ouvrante : on remarque que l'utilisation d'une pile peut simplifier la gestion des parenthèses pour la construction de l'arbre...

(14)

Département Informatique

Département Informatique 3*(4+2*(1-14*2))

* 3

On empile la suite de l'expression

4

+

* 2

- 1 *

Puis on dépile, et on

relie les feuilles droites.

(15)

15 Département Informatique

Département Informatique

Prochain cours :

Structures de données – partie 4 arbres non binaires

tables de hachage

Bonnes vacances !

Références

Documents relatifs

La déclaration de la classe sera écrite dans un fichier d'en-tête (.h), contenant éventuellement quelques petites fonctions en ligne. Le corps des fonctions membres de cette

Si le programme appelant ne fait rien, le lancement d ’une exception appelle la fonction standard abort qui met fin au programme. Note : sous Borland C++ la fonction

Par exemple : std::string , qui obligatoirement doit faire des allocations de mémoire (pour stocker les caractères) et donc libérer, quoi qu'il arrive, même en cas d'exception

Plusieurs instances de cette classe devront référencer le même objet en mémoire : définition d'une sous-classe assistante, associant l'adresse réelle de l'objet et un compteur...

Une pile représente un ensemble de données où l'on ne peut accéder qu'au dernier élément entré, qui devient donc le premier à sortir. On les appelle parfois LIFO (last in

A présent le code peut s'utiliser pour afficher tous les éléments d'une liste d'entiers différents de -5, tous les éléments d'un tableau de chaînes de moins de trois

sinon si valeur dans feuille courante &lt; valeur à ajouter Prend branche gauche comme nouvelle racine Ajout. sinon si valeur dans feuille courante &gt; valeur à ajouter Prend

• Arbre de recherche suivant la valeur Facile à programmer Très rapide à chercher Espace mémoire moyen Aucune n'est préférable, le contexte. décidera de la