Résultat d'une expression mathématique a partir d'un string
Résolu/Fermé
LittDev
-
Modifié par LittDev le 12/06/2016 à 06:41
mamiemando Messages postés 33653 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 3 mai 2025 - 25 juin 2016 à 10:33
mamiemando Messages postés 33653 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 3 mai 2025 - 25 juin 2016 à 10:33
A voir également:
- Résultat d'une expression mathématique a partir d'un string
- Formule mathématique - Télécharger - Études & Formations
- Creer un groupe whatsapp a partir d'un autre groupe - Guide
- Comment faire une recherche à partir d'une photo - Guide
- Resultat foot - Télécharger - Vie quotidienne
- Lexer resultat - Télécharger - Sport
1 réponse
mamiemando
Messages postés
33653
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
3 mai 2025
7 846
Modifié par mamiemando le 21/06/2016 à 11:42
Modifié par mamiemando le 21/06/2016 à 11:42
A première vue ça semble tenir la route mais quelques remarques :
1) il y a beaucoup de warning que tu pourrais fixer (
2) tu pourrais définir tes opérateurs (
Voici comment les traiter :
a) Pour les 4 premiers warnings :
b) Pour le 5e : supprimer i
c)
d)
3) les
4) généralement
5) idéalement (mais le forum ne s'y prête pas) il serait bien de faire un header par classe (genre token.hpp) et le fichier source correspondant (token.cpp). Attention à ne pas faire de
6) beaucoup plus grave : tes fonctions font toutes des passages de paramètre par recopie, alors que ce devrait être des passages par référence (idéalement en précisant
Bonne chance
1) il y a beaucoup de warning que tu pourrais fixer (
g++ -W -Wall plop.cpp) :
plop.cpp: In function ‘bool operator|=(Token, std::__cxx11::string)’:
plop.cpp:96:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(i<operators.length())
^
plop.cpp:103:7: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(j==input.get_data().length())
^
plop.cpp: In function ‘bool count_brackets(std::__cxx11::string)’:
plop.cpp:173:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(i<input.length())
^
plop.cpp: In function ‘bool validity(std::__cxx11::string*)’:
plop.cpp:200:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(i<(*input).length())
^
plop.cpp: In function ‘std::__cxx11::list<Token> tokenize_string(std::__cxx11::string)’:
plop.cpp:262:6: warning: unused variable ‘i’ [-Wunused-variable]
int i(0);
^
plop.cpp: In function ‘double calculate_result(std::__cxx11::list<Token>)’:
plop.cpp:405:1: warning: no return statement in function returning non-void [-Wreturn-type]
}
^
plop.cpp: In function ‘Token calculate_value(std::__cxx11::list<Token>)’:
plop.cpp:374:1: warning: control reaches end of non-void function [-Wreturn-type]
}
2) tu pourrais définir tes opérateurs (
|=...) sur des const char * et incrémenter le pointeur au fur et à mesure de la lecture.
const char * pc = "toto"; while(*pc++ != '+') { //... }
Voici comment les traiter :
a) Pour les 4 premiers warnings :
idevrait être un
std::size_t.
b) Pour le 5e : supprimer i
c)
calculate_resultdevrait retourner un
void.
d)
calculate_valuedevrait retourner quelque chose à la dernière ligne ou lever une exception (
throw std::runtime_error("zut!"));
3) les
at(i)sont des plus lents que
[i]car ils contrôlent si tu es toujours dans le tableau. Et idéalement comme dit dans (1) autant travailler directement avec des pointeurs. Plus généralement il y a beaucoup d'endroits dans ton code qui marcheraient avec des
const char *et donc a fortiori sur une std::string (quitte à manipuler
s.str()).
4) généralement
x |= ysert à définir
x = x | y, du coup le rôle et le prototype de ces opérateurs ne sont pas très naturels. Personnellement j'aurais juste fait une fonction
read_untilou un truc dans le genre.
5) idéalement (mais le forum ne s'y prête pas) il serait bien de faire un header par classe (genre token.hpp) et le fichier source correspondant (token.cpp). Attention à ne pas faire de
using namespace std;dans les headers.
6) beaucoup plus grave : tes fonctions font toutes des passages de paramètre par recopie, alors que ce devrait être des passages par référence (idéalement en précisant
constquand c'est nécessaire). Exemple :
void increment_list(std::list<int> & l) { std::list<int>::iterator lit(l.begin()), lend(l.end()); for (; lit != lend; ++lit) { (*lit)++; } } void write_list(std::ostream & os, const std::list<int> & l) { std::list<int>::const_iterator lit(l.begin()), lend(l.end()); for (; lit != lend; ++lit) { os << *lit << ' '; } }
Bonne chance
23 juin 2016 à 21:44
Justement j'ai eu beaucoup de problème de comptabilité en string et char, mais c'est réglé maintenant
Merci beaucoup
Modifié par mamiemando le 25/06/2016 à 10:34