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 :

Évaluation d'une expression numérique sous forme de chaîne de caractères


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut Évaluation d'une expression numérique sous forme de chaîne de caractères
    Bonjour,

    Est-ce qu'il existe un algorithme type pour résoudre une expression numérique sous forme de chaîne de caractères en respectant la précédence des opérateurs. Le but est d'interpréter cette chaîne comme une expression numérique et donc d'obtenir son résultat.
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    tout dépend de la complexité de l'expression j'imagine, s'il y a des parenthèses ou non par exemple etc.

    à mon sens plus qu'un algorithme c'est un parseur qu'il te faut de manière générale, et définir la grammaire d'une expression numérique, la syntaxe BNF de ce genre de chose est assez simple
    un exemple concret de ce que tu veux faire en python avec pyparsing : http://pyparsing.wikispaces.com/file/view/SimpleCalc.py

    en espérant que ça aide,

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Bonjour,

    Citation Envoyé par InitSreen Voir le message
    Bonjour,

    Est-ce qu'il existe un algorithme type pour résoudre une expression numérique sous forme de chaîne de caractères en respectant la précédence des opérateurs. Le but est d'interpréter cette chaîne comme une expression numérique et donc d'obtenir son résultat.
    Si tu utilises la notation polonaise inversée, l'algorithme tombe tout cuit dans la bouche!
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    En fonction du langage, il t'est possible d'avoir une interprétation d'une chaine de caractères.

    Par exemple avec Java :

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
     
    public class TestDeveloppez {
    	public static void main(String[] args) throws Exception {
    		ScriptEngineManager mgr = new ScriptEngineManager();
    		ScriptEngine engine = mgr.getEngineByName("JavaScript");
    		String foo = "40+(2*10)";
    		System.out.println(engine.eval(foo));
    	}
    }
    Dans ce cas, on interpréter l'équation comme étant du JavaScript, qui inclus tout ce qu'il faut pour faire le calcul.

    Il en va de même pour PHP :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $expression = '40+(2*10)';
    eval( '$result = (' . $expression . ');' );
    echo $result;

    Ici, c'est la fonction eval qui est utilisé.

    Il est très probable que le langage que tu cherche à utiliser dispose déjà d’interpréteur gérant l'ensemble des opérations mathématique. Il est très peu intéressant de refaire cette partie à la main. Car, cela implique en grande partie la théorie des langages et la redéfinition d'un langage et d'utilisation d'un parseur.
    Donc même si tu refait cette partie, il est très probable que tu te base sur un parseur pré-existant (Exemple JFlex) et que tu ne réalise que les règles lexicals et le traitement associé. Là encore, tout a déjà été fait plusieurs fois ! Donc à reprendre de ce qui existe déjà sauf si tu réalise ton propre langage mathématique.

    Cordialement,
    Patrick Kolodziejczyk.

    Source :
    http://de.php.net/manual/en/function.eval.php
    http://jflex.de/manual.html#LexRules
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    Merci pour vos réponse, je pense que la notation polonaise inversé est la plus adapté à mon problème étant donné que je dois le faire en C.
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

  6. #6
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    A re-coder, je serai partie sur l’algorithme Shunting-yard. Mais bon pas comme si cela n'existait pas déjà ici ou .

    C'est le genre d'algorithme que si tu le code et que ce n'est pas dans un but d'apprentissage, c'est que tu fait quelque chose de faux. Je dis ça, mais je travail sur une application qui implémente sont propre Shunting-yard, mais elle a une excuse... Elle a plus de 20 ans !

    Cordialement,
    Patrick Kolodziejczyk.

    source :
    http://en.wikipedia.org/wiki/Shunting-yard_algorithm
    http://rosettacode.org/wiki/Parsing/...yard_algorithm
    http://en.literateprograms.org/Shunt...orithm_%28C%29

    Edit : La partie "token" de l'algorithme vient de la théorie des langages !
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  7. #7
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    L’algorithme Shunting-yard revient à peu près à faire une NPI mais avec une entrée et une sortie. Et non c'est pas dans un but d'apprentissage, mais je pense que ça correspond à ce que je recherche. Je vais faire une première lecture de la chaîne et disposer les jetons en fonction de la précédence puis calculer un résultat en sortie. ça règle les problèmes qui se posent, l'optimisation viendra dans un second temps.
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Algorithme de Pratt
    L'algorithme de Pratt est le plus simple et le plus efficace pour évaluer une expression.
    Voici un excellent article présentant un exemple écrit en python.
    https://eli.thegreenplace.net/2010/0...edence-parsing
    Il est d'une remarquable simplicité et concision.

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

Discussions similaires

  1. [Turbo Pascal] Unité EqParser : Évaluation d'expression algébrique sous forme numérique et représentation graphique
    Par Eric Sigoillot dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 07/04/2014, 10h24
  2. [XL-2010] Macro - SUM sous forme de chaîne de caractères
    Par Rototo912 dans le forum Excel
    Réponses: 9
    Dernier message: 27/02/2014, 12h48
  3. Interpréter une formule saisie sous forme de chaîne de caractères
    Par Pozzo dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 29/05/2013, 09h30
  4. Réponses: 17
    Dernier message: 08/12/2008, 12h01
  5. Réponses: 2
    Dernier message: 20/12/2006, 08h26

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