sachant que mon code m'affiche a la fin:
je voudrais obtenir le resultat de cette operation qui est 20
Code : Sélectionner tout - Visualiser dans une fenêtre à part cout<<"8 * 5 / 2";
sachant que mon code m'affiche a la fin:
je voudrais obtenir le resultat de cette operation qui est 20
Code : Sélectionner tout - Visualiser dans une fenêtre à part cout<<"8 * 5 / 2";
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.
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; }![]()
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++.
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:
je voudrais obtenir le produit 2*4*8 et la mettre dans total, sachant que la variable n peut contenir plus de trois chiffres.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 double total; double n = 248;
D'ailleurs, personne n'a dit qu'il voulait évaluer une chaîne passée en entrée ...
Ça marche très bien ! :-)
Code : Sélectionner tout - Visualiser dans une fenêtre à part cout << 8 * 5 / 2 << endl;
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
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.UNIX> ./prod_tester
1 / 1
MULTIPLY 5
5 / 1
DIVIDE 5
1 / 1
MULT_BINOM 75 17
MULT_BINOM 5 3
DIV_BINOM 80 20
4 * 5 * 18 * 19 * 20 * 59 * 60 / 2 / 76 / 77 / 78 / 79 / 80
CALCULATE
0.0839351
<CNTL-D>
UNIX>
J'ai aussi un problème de réduction quand je PRINT, par exemple :
ce qui devrait réduire 5 * 2 / 2 a 5 / 1MULTIPLY 5
DIVIDE 2
5 / 2
MULTIPLY 2
5 * 2 / 2
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
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part UNIX> g++ prod_tester.cpp -o prod_tester
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:
En fait tu embarque l'interpréteur python qui fait tout pour toi (même le café
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 "]);)
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.
Partager