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 :

Evaluation d'une expression arithmétique


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Par défaut Evaluation d'une expression arithmétique
    Bonjour,

    J'aimerais écrire une petite calto qui puisse faire des opération de base (+, -, *, /) avec gestion des parenthèses. Voilà le problème c'est que je ne vois pas quel algo pourrait être le plus efficace et le plus simple à coder :s
    J'ai lu qu'on pouvait utiliser une stack, convertir l'expression en notation polonaise inversée puis l'évaluer à l'aide d'une stack, mais cette solution est-elle efficace et simple? J'ai aussi lu que l'on pouvait utiliser un arbre (même question, ceci est-il une bonne idée)?

    Si quelqu'un pourrait me donner un algo ou un lien traitant du sujet je lui serait vraiment reconnaissant Je cherche avant tout une méthode rapide à coder, pour le reste ça devrait aller ^^'

    Merci

  2. #2
    Membre émérite
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Par défaut
    J'ai déjà fait cela en association avec de la reconnaissance d'écriture.
    j'ai utilisé
    1- notation polonaise inversée.
    2- La stack pour gérer les parenthèses { définition des "blocs" (....) et les des entrelacer le cas échéant }
    3- des algorithmes de base pour évaluer les fonctions de base
    ( racine, sin, cos, ...)

    L'ensemble tournait sur un processeur à 8M et 12k de mémoire.

    Du point de vue des utilisateurs, la notation polonaise inversée à été la plus difficile à appréhender. Pour un produit "grand publique" j'ai donc été amené à réintroduire une entrée "standard" avec la gestion de =. Cela est nettement moins rationnel et devrait , à mon avis, si il n'y a pas de contraintes "client" être évité.

  3. #3
    Membre confirmé
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Par défaut
    Merci pour ta réponse
    Par contre la conversion de la notation standard à la notation polonaise inversée n'est pas très dur. Je vais peut être utiliser cette méthode alors à moins qu'il n'y ait quelquechose de plus performant?

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Recherche dans mes derniers messages sur fr.comp.lang.c, j'en ai écrit deux... (news:87u0ajmigu.fsf@news.bourguet.org, news:87lkvvmenj.fsf@news.bourguet.org)

  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 : 46
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,
    c'est assez simple à programmer, le plus dur est d'avoir une grammaire qui reconnaisse les expressions arithmétiques, mais google est ton ami.
    Ensuite, il te suffit de transcrire la grammaire dans le langage de ton choix.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  6. #6
    Membre émérite
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Par défaut
    je dispose aussi d'1 code en delphi et qui inclue la gestion des parenthèses, les fonctions de base ( + * / - trigo, log, puissance, ... )
    je pourrais le fournir sur demande.

  7. #7
    Membre expérimenté Avatar de Betatesteur
    Inscrit en
    Juillet 2003
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 210
    Par défaut
    delphi ou pas je le repasserai en pseudo code. j'aimerai comparer avec ce que je suis en train de faire donc oui je veux bien ton code

  8. #8
    Membre émérite
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Par défaut
    j'envoie le code dans le prochain mail.
    Dès que vous l'avez récupéré, dites le moi afin que je le supprime du forum.
    cela est un peu long et inutile d'être maintenu en permanence. L’option « fichier attaché » n’est malheureusement pas encore active

  9. #9
    Membre émérite
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Par défaut
    supprimé

  10. #10
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Juste pour apporter mon point de vue

    J'ai fais un évaluteur il y a un 10aine d'année, c'etait pour la fac, car marre d'avoir des fonctions en dur et recompiler à chaque fois.
    Depuis, je l'utilise toujours, pour mes progs et professionellement.

    Comment j'ai procédé.

    1. Le parsing, determiner chaque elt de la chaine (d'ailleurs je m'étais cassé la tête à l'époque car je tenais absolument à pouvoir ecrire comme sur papier,ie , 2x signifiait bien 2 * x, sinx signifiait bient sin(x) etc...)

    2. Chaque elt est d'une certaine nature (nbre/cte, fonction, opérateur, variables) avec une certaine priorité de lecture pour l'établissement de l'arbre.

    3. J'ai fais mon stockage de l'expression dans un arbre. Chaque element est un objet (au sens classe) avec une méthode 'Calculer'.

    3. La méthode calculer se charge selon sa nature, de prendre ses fils (1 ou plusieurs selon la nature) et de renvoyer fils1.Calculer * fils2.Calculer pour le cas d'une multiplication.
    Finalement fils1 pouvait être n'importe quel sous-arbre, le résultat de se sous-arbre était incombé à fils1.

    4. Donc chaque feuille de l'arbre est soit une constante soit un nombre, c'est ce qui arrete le parcours de l'arbre.
    Le résultat d'un expression est NoeudSommet.Calculer, tout simplement.

    C'est pas la méthode la plus rapide, néanmoins j'ai jamais eu de pb de vitesse même avec des expressions compliquée et sur des 486...

    De plus, pour le tracer d'une fonction par exemple, le parsing n'est effectué qu'une seule fois. Après, l'arbre est gardé en mémoire et il est autonome. Le calcule est alors très rapide. (uniquement le parcours de l'arbre et les opérations)

    Le gros avantage, c'est que une fois l'expression en arbre on peut faire ce que l'on veut sur l'expression en litéral.

    J'avais notamment implémenté, en plus de la méthode 'calculer', la méthode 'Deriver' qui permettait de renvoyer un 2eme arbre, résultat dérive de la 1ere expression. Avec l'opération inverse de transfo. de l'arbre en chaine de caractère, la dérivé était là! (non simplfiée certe)

    Mais la simplfication est chose possible également. repérer dans l'arbre certain parcours de'*' est faisable.
    (x^2 / x ) étant facilement repérable dans un arbre, permetait de renvoyer '1/x'.
    La simplification marchait dans certains cas, j'ai pas été jusqu'au bout .

    Enfin voila, tout dépend de ton but. Si c'est juste une calculette simple rien ne sert d'en arriver là, sinon c'est un exercice ou je m'étais éclaté

    PS: volontier également de te proposer mon code, par MP si tu veux.
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

Discussions similaires

  1. [Turbo Pascal] Evaluation d'une expression arithmétique post-fixée
    Par simousoft dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 28/01/2012, 20h35
  2. Réponses: 9
    Dernier message: 21/01/2009, 07h54
  3. Réponses: 8
    Dernier message: 15/05/2007, 11h02
  4. [Oracle 9i] Evaluation d'une expression
    Par Process Linux dans le forum Oracle
    Réponses: 2
    Dernier message: 21/03/2006, 12h55
  5. [EXP] Evaluation dans une expression régulière
    Par SergentHeinz dans le forum Langage
    Réponses: 7
    Dernier message: 10/11/2005, 18h17

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