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 :

évaluer une expression mathématique


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 38
    Points : 30
    Points
    30
    Par défaut évaluer une expression mathématique
    bonsoir
    svp j'ai un petit soucis avec un mini-projet , je dois lire une expression mathématique qui est sous la forme -par exemple- :
    -123+5*(13e-0,5^6)
    je dois pouvoir l'évaluer en utilisant la notation polonaise inverse.
    jusque l'as c est ok , mon problème est que je ne trouve pas de solution pour pouvoir lire mes opérandes , (toute l'expression est de type string ).
    l'idée qui m'est venu et d'utiliser un automate et de faire l'analyse lexicale , mais y as ici plus de 12 états et s'apparais plutôt trop compliqué .
    y'a t ils pas d'autres solution?

    a l aide svp.

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    tu peux utiliser <sstream> ou <cstring> pour pouvoir lire des nombres d'une chaine de caractères.

    Un exemple avec <vector> et <sstream>:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <sstream>
    #include <vector>
    #include <string>
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        /* L'expression à évaluer, et ce dans quoi on va la stocker */
        string chaine;
        istringstream item;
     
        cout << "Entrez une expression à évaluer: ";
        cin >> chaine;
     
        item.str(chaine);
     
        /* On stocke les nombres dans un vector, les opérateurs dans un autre */
        vector<int> nombres;
        vector<char> operateurs;
     
        char temp_op;
        int temp_nb;
     
        /* Quand il n'y aura plus rien à rentrer, la boucle sera arrêtée */
        while (1)
        {
            if (item >> temp_nb)
            {
                nombres.push_back(temp_nb);
            } else
            {
                item.clear(); //On rend possible de lire un opérateur, même si on n'a pas pu rentrer de nombres
            }
     
            if (item >> temp_op)
            {
                operateurs.push_back(temp_op);
            } else
            {
                break;
            }
        }
     
        cout << "Nombres:" << endl;
        for (vector<int>::iterator it = nombres.begin(); it != nombres.end(); ++it)
        {
            cout << *it << endl;
        }
     
        cout << "Operateurs:" << endl;
        for (vector<char>::iterator it = operateurs.begin(); it != operateurs.end(); ++it)
        {
            cout << *it << endl;
        }
     
        return 0;
    }
    Là, ça fait à peu près ce que tu veux mais pas complètement!
    Par exemple, dans 13e-0,5 , il lit "13", "e", "0", ",", "5". (au lieu de "13", "e", "-0,5")

    C'est un début d'idée, quoi!

  3. #3
    Membre confirmé
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Points : 563
    Points
    563
    Par défaut
    Nombreuses solutions:

    1) Faire un analyseur syntaxique à la main. 12 états ca reste de l'ordre du raisonnable non ?

    2) Utiliser un générateur d'analyseur syntaxique (lex/flex par exemple)

    3) Un système à base d'expressions régulières (ce qui au final revient à faire un automate, mais c'est plus rapide à implémenter)

    4) La solution proposée par coyotte507, qu'il faudrait un peu améliorer pour reconnaitre l'ordre des tokens.

  4. #4
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Je viens tout juste d'en faire un avec des matrices!
    1) boost::tokenizer pour découper la chaine
    2) analyse basé sur un pattern Interprete
    3) Génération des opérations basé sur une fabrique (avec Prototype, donc clonage)

    Bon courage !

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    merci pour votre aide , je vais essayer avec boost.
    et encore merci

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

Discussions similaires

  1. [Batch] évaluer une expression mathématique en Batch
    Par hackoofr dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 15/04/2013, 11h40
  2. Evaluer une expression mathématique
    Par sbeu dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/07/2007, 18h28
  3. Réponses: 2
    Dernier message: 20/11/2006, 21h19
  4. [C#] Comment évaluer une expression ?
    Par bart64 dans le forum C#
    Réponses: 3
    Dernier message: 11/01/2006, 15h46
  5. Analyser une expression mathématique
    Par Amokrane dans le forum C++
    Réponses: 5
    Dernier message: 06/01/2006, 13h36

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