IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Arbre binaire pour expression opératorielle


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Par défaut Arbre binaire pour expression opératorielle
    Bonjour,
    Je ne sais pas trop sur quel forum poster mon sujet, donc je le poste ici puisque je programme en C++.

    Je cherche à écrire un code capable de lire et évaluer non pas une expression arithmétique (ça je sais faire), mais une expression opératorielle, c'est à dire une expression du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    H=Sum{i,1,3}(4*(C[i]+A[i])*(C[i]+3*A[i])+5)
    dans laquelle la notation "Sum{i,1,3}" représente la somme sur l'indice i de 1 à 3, et C[i] et A[i] sont respectivement des operateurs d'incrémentation et de décrémentation de la composante i d'un vecteur. H est donc un opérateur destiné à agir sur un vecteur.

    Ce que je voudrais faire, c'est un programme qui affiche le développement de l'expression, c'est à dire pour notre example:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    H = Sum{i,1,3}(4*(C[i]+A[i])*(C[i]+3*A[i])+5)
       = 4*C[1]C[1]+12*C[1]A[1]+4*A[1]C[1]+12*A[1]A[1]
       + 4*C[2]C[2]+12*C[2]A[2]+4*A[2]C[2]+12*A[2]A[2]
       + 4*C[3]C[3]+12*C[3]A[3]+4*A[3]C[3]+12*A[3]A[3]+15
    J'ai réussi à écrire un code qui construit un arbre binaire pour cette expression, c'est quasiment pareil que pour les arbres arithmétiques. Ce qui me manque c'est une méthode de lecture de l'arbre qui me permette d'afficher le développement de l'expression.

    Quelqu'un a-t-il une idée?

    (Si vous vous demandez à quoi ça sert, c'est pour écrire un algorithme de résolution de l'équation de Schrödinger pour la Mécanique Quantique).

  2. #2
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Normalement, l'évaluation de ton arbre binaire, ça doit être assez trivial, si la structure de ton arbre est bonne.

    On pourra plus facilement t'aider si tu la donnes .

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Normalement, l'évaluation de ton arbre binaire, ça doit être assez trivial, si la structure de ton arbre est bonne.

    On pourra plus facilement t'aider si tu la donnes .
    Ok, voici la grammaire que j'ai utilisée (oublions pour simplifier l'opération de somme "Sum{i,1,3}"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    E -> E + T | E - T | T
    T -> T * F | T / F | F
    F -> N | I | Op | (E)
    Op-> I [E]
    Traduction: Une expression est soit une expression plus un terme, soit une expression moins un terme, soit un terme. Un terme est soit un terme multiplié par un facteur, soit un terme divisé par un facteur, soit un facteur. Un facteur est soit un nombre, soit un identifiant (qui a une valeur associée), soit un opérateur, soit une expression entre parenthèses. Finalement un opérateur est un identifiant suivi d'une expression entre crochets.

    Les feuilles sont donc les nombres N et les identifiants I. Les noeuds sont les operations +-*/ qui ont deux fils (oublions les + et - unaires), ou les operateurs Op qui ont un seul fils. L'expression est analysée de droite à gauche afin d'assurer les priorités de calcul correctes.

    Ainsi, si l'on oublie les opérateurs, l'expression s'évalue très simplement par récurrence. Le problème est donc le suivant: Etant donné l'arbre obtenu par cette grammaire, comment le lire de manière à afficher l'expression développée?

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Ainsi, si l'on oublie les opérateurs, l'expression s'évalue très simplement par récurrence.
    Oui, c'est bien pour ça que je ne voyais pas où était ton problème.

    Le problème est donc le suivant: Etant donné l'arbre obtenu par cette grammaire, comment le lire de manière à afficher l'expression développée?
    Donc je n'avais encore rien compris .

    Si tu parenthèses tout, c'est très simple. Tu affiches une parenthèse ouvrante, puis tu affiches l'expression de gauche, puis la prenthèse fermante, etc...

    Si tu ne veux pas de parenthèses surnuméraire, il faut voir dans quel cas tu peux te passer de parenthèses. Je ne vois pas de solution systématique, autre qu'isoler les cas (tu as besoin de l'opérateur courant et de l'opérateur gauche pour savoir s'il faut parenthéser à gauche, et de l'opérateur courant et de l'opérateur droit pour parenthéser à droite), en sachant que tu peux te limiter à cette profondeur (flemme de faire la démonstration, mais il me semble bien que c'est le cas).

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Par défaut
    Je ne vois pas très bien... Si je fais ce que tu dis, le résultat sera l'affichage de l'expression telle quelle, c'est à dire sous forme factorisée. Ce que je veux c'est l'affichage sous forme développée.

    Oublions les opérateurs, qui finalement ne sont pas la cause du problème. Si je donne l'expression 3*(4+5)*(7-2)+25, je veux que l'affichage donne 3*4*7-3*4*2+3*5*7-3*5*2+25.

  6. #6
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par ValyGator Voir le message
    Je ne vois pas très bien... Si je fais ce que tu dis, le résultat sera l'affichage de l'expression telle quelle, c'est à dire sous forme factorisée. Ce que je veux c'est l'affichage sous forme développée.

    Oublions les opérateurs, qui finalement ne sont pas la cause du problème. Si je donne l'expression 3*(4+5)*(7-2)+25, je veux que l'affichage donne 3*4*7-3*4*2+3*5*7-3*5*2+25.
    Je comprends pas. Si tu as l'arbre, et que tu veux développer, tu fais comme on t'a appris à l'école.

    Dans un langage comme Caml, c'est assez concis à faire. De manière simple, tu procèdes itérativement. Tant qu'il est possible de développer, c'est à dire qu'il y a une sous-expression de type Produit d'une Somme avec une Expression, alors tu peux développer.

Discussions similaires

  1. Arbre binaire pour du dessin
    Par Kromagg dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 08/02/2011, 18h01
  2. Commande récursive pour dessiner un arbre binaire.
    Par IKota dans le forum Programmation (La)TeX avancée
    Réponses: 2
    Dernier message: 30/05/2010, 22h41
  3. [Free Pascal] Expressions arithmétiques sous forme d'arbre binaire
    Par Leikka dans le forum Free Pascal
    Réponses: 2
    Dernier message: 17/05/2010, 10h55
  4. Composant graphique pour arbre binaire
    Par danisam dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/08/2008, 11h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo