Parser de fonction mathématiques en C++ - Programmation
Marsh Posté le 26-02-2001 à 10:59:01
Ben en fait, tu rentre une fonction à la main dans un champ style : f(x)= 3x+cos(x) et le programme la lit et l'évalue. Cela évite de recompiler ton programme ,si la fonction change.
Voilà
Marsh Posté le 26-02-2001 à 12:28:26
Ben je ne sais pas vraiment quel est ton pb mais j'ai fait ça une fois, et j'ai procédé de la manière suivante :
[#]Développer un diagramme de classes représentant les fonctions mathématiques : monome, polynome, frac rat, trigo ....
[#]Convertir la string de la fonction en polonaise inverse.
[#]Stocker la représentation de cette fonction avec cette méthode, mais dans l'autre sens.
Exemple : f(x) = (3x + cos(x))/(2x²-x+2)
(mes souvenirs de représentations de polonaises sont flous avec les fonctions prioritaires)
=> 3 x * x cos + x 2 ^ x - 2 + /
Représentées par le chaînage des instances :
"Opérateur /" -> "Operateur +" -> "Polynome" -> "Monome (coef 3, degré 1)"
|---> "Trigo (cos)" -> "Polynome" -> " Monome (coeff 1 degré 1)"
|--> "Polynôme" -> "Monome coeff 1 degré 2" -> Monome coeff 1 degré 1" -> "Monome coeff -2 degré 0"
Marsh Posté le 26-02-2001 à 12:50:55
hum hum, ça me semble interressant. Tu n'aurais par hasard un source ou un dossier de programmation sous la main ?
Si oui, pourrais-tu me les mailer.
Merci
A+
Marsh Posté le 26-02-2001 à 12:58:12
Nan j'ai plus les sources. Mais faut bien que tu utilises tes méninges non ???
Ce qui est méga joussif c'est quand tu codes les fonctions dérive() pour chaque classe. Après tu fais fonction->derive() et zou c'est nikel
Bon je t'avoue le plus chiant c'est la simplification. Une méthode efficace consiste à factoriser puis développer x fois mais ça ne marche pas à tous les coups.
Marsh Posté le 26-02-2001 à 13:10:34
Un tuyau quand même : pour parser la string il te faut au moins une pile où tu mets les opérateurs que tu rencontres.
Marsh Posté le 26-02-2001 à 13:10:41
Tu n'aurais pas une connaissance qui aurait gardé les sources, tu me sauverais la vie.
ReMerci
A+
Marsh Posté le 26-02-2001 à 22:34:23
juste une petite remontée de post, j'attends une reponse (
Marsh Posté le 27-02-2001 à 09:41:52
PERDU
A plus les sources, il va falloir que tu cogites (ça m'a pris une journée je crois). Les étapes du parsage sont
- élimination des espaces
- élimination des parenthèses superflues
- analyse de la chaîne en commençant par les opérateurs les moins prioritaires, puis les opérateurs prioritaires puis enfin les fonctions.
Je crois me souvenir que l'on splitait la chaîne en deux et que c'était résursif mais alors là c'est une question d'affinités personnelles.
Marsh Posté le 27-02-2001 à 10:25:43
Ouuuuinnn Ouinnnnn :-(((
On était prêt à t'offrir un petit kekchose mais malheureusement ça tombe à l'eau.
Tu avais fait ça en TP, tu n'avais pas de binome ou des "camarades" qui auraient encore leurs sources aujourd'hui ?
J'ai déjà mal à la tête rien que d'y penser :-(
Enfin, merci quand même
A+
Marsh Posté le 27-02-2001 à 10:31:51
Nan projet info en école en binôme.
On était prêt à t'offrir un petit kekchose mais malheureusement ça tombe à l'eau.
Fallait pas le plaisir de t'aider me suffit.
Marsh Posté le 27-02-2001 à 10:33:04
tu vas peut-être me trouver chiant, mais tu es toujours en bons termes avec ton binome ? :-)
Marsh Posté le 27-02-2001 à 10:47:50
Salut,
J'ai peut-etre un parser en c mais il faut que je fouille, je te tiens au courant.
Marsh Posté le 27-02-2001 à 10:48:27
A ton avis pourquoi j'ai mis 'perdu' ? Il ne les a plus non plus c'est pour cela que je te demandais d'attendre le lendemain.
Marsh Posté le 27-02-2001 à 10:50:42
K1200 --> merci
Toxin --> Bon ben tant pis. Merci quand même pour tes recherches.
Marsh Posté le 25-02-2001 à 23:04:05
'lut
Je recherche kelkun ki aurait déjà programmmé ce genre de truc.
Merci.
A+