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 :

calculer le contenu d'une string


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut calculer le contenu d'une string
    sachant que mon code m'affiche a la fin:
    je voudrais obtenir le resultat de cette operation qui est 20

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 142
    Par défaut
    Dire bonjour, c'est bien aussi.

    Ce que tu veux faire n'est pas une mince affaire, il faut analyser (parser) la chaîne, en extraire les informations, décider des priorités des opérateurs toi-même… bref, il faut tout faire, le C++ n'offrant rien en natif pour cela.

    Regarde Boost.Spirit pour générer un parser : http://www.boost.org/doc/libs/1_36_0...sic/index.html
    Il y a même un exemple de calculatrice tout fait.

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 73
    Par défaut
    Sinon, si tu as envie de faire quelque chose de moche, pas du tout portable, à la limite de l'inutilisable, tu peux faire ç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
    18
    19
    int main()
    {
        std::string s("8 * 5 / 2");
     
        system(("expr " + s + " >> tmp").c_str());
     
        std::ifstream tmp("tmp");
     
        int res;
     
        tmp >> res;
     
        tmp.close();
        system("rm tmp");
     
        std::cout << s << " =" << res << std::endl;
     
        return 0;
    }

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par three minute hero Voir le message
    Ce que tu veux faire n'est pas une mince affaire, il faut analyser (parser) la chaîne, en extraire les informations, décider des priorités des opérateurs toi-même… bref, il faut tout faire, le C++ n'offrant rien en natif pour cela.
    A vue de nez :
    utiliser les flux pour lire les chiffres et les opérateur puis :

    faire le calcul en cour de lecture en utilisant une stack comme accumulateur
    ou
    créer un arbre d'opérateur et faire le calcul par la suite

    C'est un exo, non?

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par stillman Voir le message
    Sinon, si tu as envie de faire quelque chose de moche, pas du tout portable, à la limite de l'inutilisable, tu peux faire ça :
    ou tu fait un requête sur google pour faire le calcul

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 73
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    ou tu fait un requête sur google pour faire le calcul
    Effectivement, je n'avais pas pensé à cette solution !

    Plus sérieusement, je pense qu'ici il vaut mieux s'orienter vers la construction d'un arbre. Une pile, ça marche bien quand le calcul est en notation polonaise ; là, ça va être compliqué de prendre en compte la priorité des opérateurs.

    S'il n'y a pas de parenthèses, on peut même faire plus simple, avec un petit algorithme récursif. Comme j'ai l'impression que c'est un exercice, je ne donnerais pas l'algorithme directement, mais essaye de réfléchir à comment toi tu ferais pour calculer en lisant la chaîne de gauche à droite. Une fois que tu auras compris comment tu effectues le calcul dans ta tête, ce sera facile de reproduire l'algorithme en C++.

  7. #7
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut
    Merci pour les reponses.

    vous avez raison, ce n'est pas faisable, alors j'ai penser a quelquechose d'autre plus simple que j'ai ameliorer dans mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double total;
    double n = 248;
    je voudrais obtenir le produit 2*4*8 et la mettre dans total, sachant que la variable n peut contenir plus de trois chiffres.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par virtuadrack Voir le message
    Merci pour les reponses.

    vous avez raison, ce n'est pas faisable

    personne as dit que ce n'est pas faisable?

  9. #9
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par virtuadrack Voir le message
    Je voudrais obtenir le produit 2*4*8 et la mettre dans total, sachant que la variable n peut contenir plus de trois chiffres.
    Il faut que tu fasses toute une série de divisions entières par 10, 100, 1000, ... pour savoir
    • Combien tu as de chiffres
    • Quels sont ces chiffres pour les multiplier

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 453
    Par défaut
    D'ailleurs, personne n'a dit qu'il voulait évaluer une chaîne passée en entrée ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << 8 * 5 / 2 << endl;
    Ça marche très bien ! :-)

  11. #11
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    si tu cherche juste à faire une petite calculatrice, il te suffit de parser ta chaine (par exemple avec boost::tokeniser) en fonction de delimiteurs qui seront tes operateurs ("+","-","/","*"). Faut 'simplement' gerer les priorités entre operateurs et les parentheses. Si en plus tu veux integrer des fonctions à nombre d'arguments variables (genre pow(2,2)), ca devient plus coton mais ca reste dans le meme genre d'idée. Jusqu'ou va la complexité de ton exo ?

  12. #12
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut
    Citation Envoyé par vikki Voir le message
    si tu cherche juste à faire une petite calculatrice, il te suffit de parser ta chaine (par exemple avec boost::tokeniser) en fonction de delimiteurs qui seront tes operateurs ("+","-","/","*"). Faut 'simplement' gerer les priorités entre operateurs et les parentheses. Si en plus tu veux integrer des fonctions à nombre d'arguments variables (genre pow(2,2)), ca devient plus coton mais ca reste dans le meme genre d'idée. Jusqu'ou va la complexité de ton exo ?
    c'est assez complexe, enfin pour mon niveau...

    et j'ai abandonne l'idee de calculer le contenu d'un string, qui etait une idee qui me passait par la tete; mais irrealisable vu la complexite de mon programme.

    Il faut utiliser des commandes au lieu de symboles et des multiset en tant que container, genre MULTIPLY, DIVIDE, CALCULATE, PRINT...

    une execution du code donnerait
    UNIX> ./prod_tester
    PRINT
    1 / 1
    MULTIPLY 5
    PRINT
    5 / 1
    DIVIDE 5
    PRINT
    1 / 1
    MULT_BINOM 75 17
    MULT_BINOM 5 3
    DIV_BINOM 80 20
    PRINT
    4 * 5 * 18 * 19 * 20 * 59 * 60 / 2 / 76 / 77 / 78 / 79 / 80
    CALCULATE
    0.0839351
    <CNTL-D>
    UNIX>
    Il fait a peu près toute les commandes. J'aimerais bien que quelqu'un le teste entièrement, et me suggère des améliorations ou m'informe de bugs.

    J'ai aussi un problème de réduction quand je PRINT, par exemple :
    MULTIPLY 5
    DIVIDE 2
    PRINT
    5 / 2
    MULTIPLY 2
    PRINT
    5 * 2 / 2
    ce qui devrait réduire 5 * 2 / 2 a 5 / 1

    Si quelqu'un s'intéresse a ce code ca serait sympa de me proposer des solutions et/ou amélioration du code pour le rendre plus efficace.

    Mes codes en attachement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UNIX> g++ prod_tester.cpp -o prod_tester
    Merci
    Fichiers attachés Fichiers attachés

  13. #13
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Je suis pas rentré dans le détail du code dsl, mais ca semble un peu violant
    Sinon il existe une solution sur mesure qui t'évite de tt faire à la main : boost.python (ici). De mémoire ça ressemble à un truc comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    object main_module = import("__main__");
    object main_namespace = main_module.attr("__dict__");
     
    PyRun_SimpleString(" variable = 8*4+2 ");
     
    int ma_variable = extract<int>(main_namespace["variable "]);
    En fait tu embarque l'interpréteur python qui fait tout pour toi (même le café )

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    ou tu fait un requête sur google pour faire le calcul
    Uhm c'est pas très sûr comme résultat: http://www.flickr.com/photos/aprilyahoo/2797890451/

    Voilà un lien qui t'explique l'analyse lexicale et syntaxique: http://fastnet.univ-brest.fr/~gire/C..._IUP/POLY.html

    Sinon la solution d'embarquer l'interpréteur python est un bon choix si tu veux faire ça rapidement.

Discussions similaires

  1. Convertir le contenu d'une String en ligne de code
    Par DamS2502 dans le forum Langage
    Réponses: 5
    Dernier message: 29/04/2008, 07h40
  2. [Oracle] Executer le contenu d'une string
    Par altansar dans le forum SQL
    Réponses: 2
    Dernier message: 04/12/2007, 10h56
  3. Interpreter le contenu d'une string comme de l'hexa
    Par thibal_kamehouse dans le forum C++
    Réponses: 4
    Dernier message: 30/11/2006, 17h46
  4. Modifier contenu d'une String
    Par error dans le forum Langage
    Réponses: 7
    Dernier message: 03/10/2006, 09h58
  5. [DEBUTANT]Recherche mot contenu dans une String
    Par lynxman dans le forum Langage
    Réponses: 7
    Dernier message: 16/12/2005, 11h49

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