bonjour
jaurai aimer savoir commen je pouvai evaluer une chaine de caractere du type: (2+3)*4/5%8
merci davance![]()
bonjour
jaurai aimer savoir commen je pouvai evaluer une chaine de caractere du type: (2+3)*4/5%8
merci davance![]()
Tu pourrais etre encore moins precis stp ?
Bon, serieusement, l'evaluer comment ? La calculer ?
Si c'est ca, la reponse ne tient pas en une seule ligne :
Il faut que tu parcours ta chaine, que tu mette les chiffres dans des variables que tu stocke dans une pile, que tu evalue tes operateurs d'apres une base d'operateurs, que tu extraie tes nombres de ta pile pour les calculer quand tu croise des operateurs prioritaires, etc...
Enfin bon je m'emporte...
Essaie d'etre un (gros) poil plus precis si tu veux qu'on puisse t'aider.
excuse moi mai pr moi c ete clair
jai pas penser aux autres![]()
oui en fait il faut que je le calcul cette expression
jai compris le principe que tu vien dexpliquer avec la pile
mai jai encore js fait de simulation de pile...peut mexpliquer??
merci
Je suis justement sur un exercice la-dessus, trouvé dans un bouquin de c++.
Il y a plusieurs étapes:
1) Séparer les nombres, opérateurs etc. Si les nombres sont garantis faire un chiffre au plus, c'est comme si c'était déjà fait.
2) Pour évaluer l'expression, c'est assez dur dans ce sens: Il peut être utile de la convertir en notation postfixée (Notation Polonaise Inverse)
(l'algorithme est dans le bouquin, mais je ne l'ai pas ici)
3) Quand tu as une expression en NPI, il est facile de l'évaluer, avec une pile.
[U]SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.[/U]
[I]"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone.[/I] -- [URL="http://blogs.msdn.com/oldnewthing/archive/2004/01/15/58973.aspx"]Raymond[/url] [url=http://blogs.msdn.com/b/oldnewthing/archive/2011/05/06/10161590.aspx]Chen[/URL].
[SIZE="1"][URL="http://club.developpez.com/regles/#LIII-A"]Traduction obligatoire:[/URL] "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.[/SIZE]
Il faut écrire une grammaire des expressions arithmétiques, un analyseur lexical qui te fournira des lexèmes (nombre, opérateur), , que tu analyseras dans un analyseur syntaxique qui construira l'arbre syntaxique (si je ne me trompe pas). Ensuite il ne reste plus qu'à évaluer.
Direction forum algo.
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
les outils pour faire celà c'est Yacc et Lex (ou Bison et flex)...
Ouaih, ça fait le travail à la place de l'étudiant, est-ce qu'il cherche ?
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
javai une petite ide avec la NPI mais jai l'algo correspondant
si tu peu me le filer des que tu peux??
et pour lex et yacc je suis au courant mais cest ds un projet de C dc impossible...
OK, Je te file l'algo de conversion dès que possible.Envoyé par ricardvince
En attendant, tu peux toujours faire l'algo de décomposition de la chaîne en nombres, ops, etc (si les nombres peuvent avoir deux chiffres ou plus, ce sera nécessaire) et l'algorithme d'exécution à partir de la NPI...
Qu'est-ce que cette phrase veut dire? Si c'est que tu n'as pas le droit, OK. Mais si elle veut dire que lex et yacc ne marchent pas avec le C, elle est fausse à un point proche de l'infini.et pour lex et yacc je suis au courant mais cest ds un projet de C dc impossible...
[U]SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.[/U]
[I]"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone.[/I] -- [URL="http://blogs.msdn.com/oldnewthing/archive/2004/01/15/58973.aspx"]Raymond[/url] [url=http://blogs.msdn.com/b/oldnewthing/archive/2011/05/06/10161590.aspx]Chen[/URL].
[SIZE="1"][URL="http://club.developpez.com/regles/#LIII-A"]Traduction obligatoire:[/URL] "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.[/SIZE]
pour etre clair je cherche un algo C qui me permettrai de faire une analyse lexicale et syntaxique de cette expression
comment je peut effectuer une priorite d'operateur () avant * et /
avant +et -...
Je réitère, écris la grammaire associée, cherche sur Google, "Grammaire des expressions arithmétiques".
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
et pour lex et yacc je suis au courant mais cest ds un projet de C dc impossible...
je voulai dire que je navai pa le droit...je c bien que lex et yacc genere du code C.
Tu px ecrire en F avc des mts entiers, ou t'es trop fénéant pour ça ? Et les regles du forum, tu les a lues ?Envoyé par ricardvince
Pour la priorite et les operateurs, avec la NPI ca marche tout seul.
Vu que sur ton amiqui te renvoie vers un super article de la Wikipedia quand tu tape "Notation polonaise inversee" c'est super bien explique, je vais faire bref :
Une methode simple et efficace que j'ai deja mise en oeuvre dans un projet similaire est la suivante :
Tu te cree deux piles :
1_ Une pile d'operateurs
2_ Une pile de nombres
Des listes chainees s'imposent. Ca marche tout seul ou presque.
Empiler = poser au dessus de la pile.
Depiler = retirer l'element du dessus de la pile.
Ensuite tu parse ta chaine.
Pour ce qui suit, depiler() = depiler deux nombres, un operateur et empiler le resultat dans la pile de nombre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 si (tu croises un nombre) tu l'empiles();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 si (tu croises un operateur) { Si (c'est une parentheses fermante) tu depiles() jusqu'a croiser une parenthese ouvrante; Si ((c'est *, / ou %) et que (au sommet de la pile tu n'as ni un + ni un -) ) tu depiles(); Si (c'est un + ou un -) tant que (tu n'as pas une parenthese ouvrante au sommet de ta pile) tu depiles(); Si (ton operateur que tu viens de croiser n'est pas une parenthese fermante) tu empiles() ton operateur; }
Attention, j'ai déjà eu à faire ça, et c'est pas si simple que ça, avec les nombres négatifs surtout:Envoyé par Médinoc
3 * -2 doit être interprété comme (3) * (-2) alors que si on recherche les opérateurs de priorité minimum (ici le "-"), on va obtenir (3 *) - (2) qui va générer ensuite une erreur de syntaxe ou de calcul.
Les nombres negatifs sont la partie la plus drole du probleme.Envoyé par 10_GOTO_10
Une solution consiste pendant le parsing a reperer le debut d'un nombre negatif :
soit: un operateur suivi d'un - (ou d'un plus si on doit gerer des cas tordus)
soit: (-
Avec la solution que j'ai exposee plus haut :
comprend le fait de croiser un cas similaire.Envoyé par jack_serious
Ensuite la fonction qui empile le nombre en question doit empiler un nombre negatif. (ou pas).
3 * -2 est une écriture incorrecte, normalement une erreur devrait être signalée, à mon avis si l'évaluateur autorise cette écriture il est incorrect.Envoyé par 10_GOTO_10
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
C'est mathématiquement tout à fait correct, et le fait de l'accepter ou non dépend de la fonction de séparation (analyse lexicale), pas de la conversion en postfixe.
Au passage, voici l'algorithme tant attendu: Utilise un ensemble de jetons d'entrée (infix), un ensemble de jetons en sortie (postfix) et une pile (pile).
On peut considérer infix et postfix comme deux files FIFO.
Types de jetons: nombre, parenthèse ouvrante, parenthèse fermante, opérateur.
(Penser à remercier Deitel et Deitel pour le livre de C++)
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 1.Pousser une parenthèse ouvrante '(' sur la pile. 2.Ajouter une parenthèse fermante '(' à la fin de infix. 3.Tant que la pile n'est pas vide: Prendre un jeton de infix. Si c'est un nombre l'ajouter à la fin de postfix. Si c'est une parenthèse ouvrante La pousser sur la pile. Si c'est un opérateur Tant que le sommet de la pile est un opérateur de priorité supérieure ou égale à l'opérateur en cours Dépiler l'opérateur de la pile et l'ajouter à la fin de postfix. Pousser l'opérateur en cours sur la pile. Si c'est une parenthèse fermante Tant que le sommet de la pile n'est PAS une parenthèse ouvrante Dépiler l'opérateur de la pile et l'ajouter à la fin de postfix. Dépiler la parenthèse ouvrante de la pile et l'oublier.
Donc, si on résume, au début, infix contient toutes sortes de jetons.
La pile, elle, ne peut contenir que des opérateurs et des parenthèses ouvrantes
postfix ne peut contenir que des nombres et des opérateurs.
[U]SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.[/U]
[I]"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone.[/I] -- [URL="http://blogs.msdn.com/oldnewthing/archive/2004/01/15/58973.aspx"]Raymond[/url] [url=http://blogs.msdn.com/b/oldnewthing/archive/2011/05/06/10161590.aspx]Chen[/URL].
[SIZE="1"][URL="http://club.developpez.com/regles/#LIII-A"]Traduction obligatoire:[/URL] "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.[/SIZE]
ok ba merci pour cet algorithme...
je teste ca demain et jespere afficher ce probleme comme
resolu...
merci![]()
En infixe, 3*-2 devrait être rejeté.
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Partager