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

Algorithmes et structures de données Discussion :

construire 1 arbre pour une calculatrice polonaise prefixée


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Points : 82
    Points
    82
    Par défaut construire 1 arbre pour une calculatrice polonaise prefixée
    Bonjour,
    Je suis un peu null en modelisation et en algo donc je demande votre aide sur un projet que j'ai eu du mal à commencer:
    Ecrire un programme qui calcule les expressiosn sous forme + 3 2 = 5
    * + 5 - 6 3 * 8 + 5 6 = (5 + (6-3)) * (8*(5+6)) = 704 et non pas 80

    En gros j'ai remarqué que la grammaire est de type :
    exp = op nombre nombre
    | op exp exp
    enfin je suppose que c bon, c moi qui le dit c pas dans le sujet
    Donc c une calculatrice polonaise prefixée je souhaite pour cela ecrire :
    (le langage c'est le CPP)
    1 - une Classe Lexeur
    2 - une classe Parseur
    3- une classe Arbre et Noeud
    4 - et what else ?
    je ne sais pas ou commencer pour arriver au resultat voulu? quelqu'un pourrais m'aider avec une bonne doc SVP
    rien trouvé sur le net
    surtout comment parser recursivement, comment cree l'arbre et comment evaluer (j'imagine que ce dernier c facile c juste un parcours infixée)

    Je vous remercie

    EDIT:
    Je tiens juste a ajouter les contraintes lol
    pas d'enum ni de switch
    et on doit imperativement profiter des avantages de la prog OO en cpp
    d'ou mon appel à l'aide sinon j l'aurai fait à l'arache comme d'hab lol
    merci encore

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    ce genre de notation va permettre de construire un arbre de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Fonction ConstruireMonArbre()
    Début
    	Lire l'élément suivant
    	Si élément = Opérateur alors
    		début
    			Ajouter un noeud avec l'opérateur
    			ConstruireMonArbre() // Lire le membre de gauche
    			ConstruireMonArbre() // Lire le membre de droite
    		Fin
    	Sinon
    		Ajouter une feuille avec le nombre
    Fin
    Une fois que tu as l'arbre, ton évaluation sera triviale avec ce même type de fonction pour parcourir l'arbre

  3. #3
    Membre régulier Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Points : 82
    Points
    82
    Par défaut
    Bjr,
    Merci pour ta réponse, mais voilà comment j'ai compris ton algo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Fonction ConstruireMonArbre(String expr)
    Début
    	Lire l'élément suivant // Premier token
    	Si élément = Opérateur alors
    		début
    			Ajouter un noeud avec l'opérateur // creer un noeud op
    			ConstruireMonArbre(expr.next()) 
    // Lire le membre de gauche
    			ConstruireMonArbre(expr.next()) 
    // Lire le membre de droite
    		Fin
    	Sinon
    		Ajouter une feuille avec le nombre 
    // ça sera notre test d'arret non ?
    Fin
    Mais je me pose la question sur comment l'appel récursif peut savoir si c un membre gauche ou droit, c'est a dire exp = op exp exp | nombre
    -C'est vraiment trop c**, mais j'ai du mal avec les structures de données sous forme d'arbre, d'où le fait que j'ai commencé hier à faire avec une pile-
    Je ne sais pas si j'etais clair je viens de me reveiller
    bonne journée

  4. #4
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par AliJava Voir le message
    Bjr,

    -C'est vraiment trop con, mais j'ai du mal avec les structure de données sous forme d'arbre, d'ou le fait que j'ai commencé hier à faire avec une pile-
    La version avec pile sera bien plus adapté à la notation polonaise inverse (c'est à dire postfixe)

  5. #5
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    - en fait le test d'arret sera sur la lecture. Si tu ne peux plus lire de donnée, tout s'arrêtera.
    - pour ce qui est de la récursivité, tu sais que tu parcours un arbre binaire, donc après avoir trouvé un opérateur : lors du premier appel de la fonction tu sais que tu dois commencer par lire le membre de gauche, puis le deuxième appel lis le membre de droite.

  6. #6
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut je trouve le C pratique pour renvoyer à la fois une valeur et un indice dans un tableau

    voici la fonction que j'utiliserais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    float lire_expression(elem **pe) {
       elem *e = *pe;
       if (e[0].type == OP) {
          e++;
          float a = lire_expression(&e);
          float b = lire_expression(&e);
          *pe = e;
     
          switch(e[0].type) {
             case '+':
                return a+b;
             case '*':
                return a*b;
          }
       }
       else {
          (*pe)++;
          return e[0].value;
       }
    }

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par acx01b Voir le message
    voici la fonction que j'utiliserais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    float lire_expression(elem **pe) {
       elem *e = *pe;
       if (e[0].type == OP) {
          e++;
          float a = lire_expression(&e);
          float b = lire_expression(&e);
          *pe = e;
     
          switch(e[0].type) {
             case '+':
                return a+b;
             case '*':
                return a*b;
          }
       }
       else {
          (*pe)++;
          return e[0].value;
       }
    }
    Tu devrais mettre des noms de variables explicites.
    Ton code est super pour couler un débutant et ennuyeux (au mieux) à décoder pour un vétéran Entre autre, l'arithmétique sur les pointeurs ça rend un code bien prompt à être rempli de bug.

    En tout cas, c'est la partie algo, c'est un algorithme qu'il faut fournir. Passer d'un code à un algorithme fait qu'au mieux, tu ne vas pas l'aider et au pire, tu vas l'emmener sur une mauvaise habitude : penser le code avant l'algo.

  8. #8
    Membre régulier Avatar de AliJava
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 184
    Points : 82
    Points
    82
    Par défaut
    Je suis tout a fait d'accord avec toi, ce que j'ai demandé est un algo et non pas une implemnetation
    de plus le langage etant C++ je ne me vois à le faire QU'avec des pointeurs, je prefere les template et les references
    il faut profiter des avantages du langage.

    merci a toute l'equipe !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/07/2010, 20h17
  2. aide pour une calculatrice vb.net
    Par lez-j dans le forum VB.NET
    Réponses: 4
    Dernier message: 11/02/2010, 16h58
  3. besoin d'aide pour une calculatrice
    Par icpajacky dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 15/04/2009, 14h46
  4. Réponses: 2
    Dernier message: 28/12/2008, 18h51
  5. problème pour une calculatrice
    Par Anthobask dans le forum C
    Réponses: 4
    Dernier message: 19/12/2005, 21h11

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