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 :

Calcul d'expression complexe


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Par défaut Calcul d'expression complexe
    J'ai enfin compris le principe de l'arbre binaire. J'aimerais maintenant l'utiliser pour résoudre un exercice que je dois faire.
    Ma fonction doit calculer des expressons du genre :
    3+42*(1-2/(3+4)-1%21)+1

    J'ai penser à ça :

    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
      (+)
      / \
    (3) (42)
          \
         (*)
         / \
        (-)(+)
       /  \  \
     (1)  (2)(1)
             \
             (/)
             /  \
            (+) (-)
            /\    \
           (3)(4) (1)
                  \
                  (21)
    J'espère que c'est compréhensible.
    Je voudrais savoir si je suis sur la bonne piste. Mon programme doit s'exécuter le plus vite possible. Donc l'arbre me parait la meilleure solution.
    J'ai aussi essayer passer par les listes chainées mais j'ai pas trouvé le moyen.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Salut,
    Il y a plusieurs étapes différentes dans ce genre d'intérprétation.
    D'abord, la lecture :
    1. Séparer les jetons (nombre, opérateur, etc.)
    2. Créer un arbre en tenant compte des priorités opératoires et des parenthèses.

    Ensuite, c'est là que ça devient intéressant. Tu peux:
    • soit évaluer l'opération en faisant un parcours postfixe de l'arbre,
    • soit convertir l'arbre en liste (chaînée ou non) d'opérations en NPI (notation polonaise inverse), là encore avec un parcours suffixe, et évaluer cette opération à l'aide d'une pile (plus compliqué, mais plus pratique s'il faut évaluer l'opération plusieurs fois).


    Pour le cas de "calculer chaque opération tapée", je pense qu'évaluer directement l'arbre est la meilleure solution.
    Ou bien, tu triches en rentrant directement l'opération en NPI, et dans ce cas tu as juste à séparer les jetons et évaluer avec une pile. Imparable pour la vitesse.

    Note: En NPI, ton opération 3+42*(1-2/(3+4)-1%21)+1 donnerait ceci:
    3 42 1 2 3 4 + / - 1 21 % - * + 1 +

    PS: Ton arbre est erroné: Les nombres sont forcément des feuilles de l'arbre, jamais des noeuds.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Par défaut
    Les nombres ne sont jamais des feuilles ?
    même si c'est un truc du genre
    42*(2+3) ?

    a moins que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     (*)
     /  \
    (42)(+)
        / \
      (2)(3)
    Sinon merci pour es conseils, je regarde si je peux le faire en NPI avec une pile, mais il faut que je l'étudie un peu plus (la NPI), parceque j'a regardé un peu et ça à l'air compliquée.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    J'ai dit les nombres sont TOUJOURS des feuilles.

    Et oui, ton arbre pour 42*(2+3) est correct.
    Et en NPI, ça donnerait 42 2 3 + *
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. VB express 2013 - aide et calcul avec nombres complexes
    Par vasilpapa dans le forum VB.NET
    Réponses: 6
    Dernier message: 06/07/2015, 05h56
  2. [Débutant] Calcul avec le complexe j
    Par ripans32 dans le forum MATLAB
    Réponses: 2
    Dernier message: 11/03/2007, 18h49
  3. Réponses: 3
    Dernier message: 30/08/2006, 21h30
  4. Réponses: 7
    Dernier message: 05/07/2005, 16h50
  5. calcul d'expression
    Par k_boy dans le forum Bases de données
    Réponses: 3
    Dernier message: 29/06/2004, 22h07

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