Salut à tous !
Voilà j´ai appris le C, j´ai fait quelques trucs, du graphisme, des petits jeux, des programmes complètement inutiles donc indispensables etc. Puis je me suis rendu compte que ce qui m´intéressait vraiment ce serait de gérer des calculs mathématiques comme les limites, les dérivées etc. dans un environnement graphique (à ce propos qu´est-il mieux d´utiliser comme librairie ? GTK, WxWidgets... ?) .
Mais une question se pose alors à moi, j´ai réfléchi un peu à la question mais je ne vois pas comment gérer le calcul formel, comment "dire" que lorsque l´utilisateur entre 5x+2, reconnaître les différents opérateurs des chiffres etc.
Donc auriez-vous un site qui explique tout ça ? Ou alors est-ce vraiment tout simple et suis-je stupide ?
![]()
non, ce n´est pas simple du tout.
Il y a deux partie dans ton programme, d´une part la partie analyseur syntaxique/lexiqual, qui va lire une chaine et comprendre que "5x+3" c´est l´addition de la constante 3 et de l´expression qui est une multiplication de la constante 5 et de la variable x.
Même si ça peut-être chiant, c´est le plus facile.
Ensuite (et avant), il faut décider comment tu vas stocker tes expressions, tu peut le faire sous forme d´arbre (c´est une notation fonctionnelle du genre "+(2,*(5,x))" (ou + et * sont des fonctions qui prenne deux paramètre), simple si tu connait les arbres (sinon, avant de te lancer dans ton projet, étudie ça)) ou alors sous forme de liste par exemple avec la notation postfixe ("2 5 x * +" par exemple).
L´une et l´autre ont leur avantage.
Mais pour faire du calcul formel (ta dernière étape) l´utilisation à base d´arbre est peut-être plus simple (mais pas forcément plus efficaces, beaucoup de "vrais" logiciels de calcul formel utilise des listes), et là commence la partie difficile.
Je ne connait pas de papier qui explique ça particulièrement. Mais pour débuter, tu peut commencer par coder une dérivation formelle, c´ets-à-dire, une fonction qui si tu lui donne une expression sous forme d´arbre, va renvoyer sa dérivé en fonction d´une variable.
Mais le plus dur c´est les opération du type simplification ou factorisation.
ça fait beaucoup d´un coup, il faudra que tu précise ce que tu sais faire et ce sur quoi tu as besoin d´aide.
Eh bien justement tout ce qui a un aspect mathématique en C m´est plus ou moins inconnu. La seule fonction que je connaisse de math.h c´est pow ^^ Je n´ai suivi les cours (de C) que sur le SdZ où j´y ai appris le C, la SDL et un peu l´OpenGL. Les rares maths que j´ai pu faire se limitent donc à des calculs matriciels assez simples.
En tout cas merci de tes informations, je vais me renseigner dès que possible, y´a pas mal de trucs à apprendre ça m´ouvrira sans doute d´autres voies ![]()
Un projet en effet compliqué a réaliser.
Si ton but est uniquement le résultat final, le logiciel Maple est une TI92 en beaucoup mieux.
Mais si ton but est de le programmer, c´est en effet complexe a faire.
Comme dit Dnob, passe par des arbres.
A la fac, j´ai fait un TP la dessus (dont j´ai encore les sources), un TP de manipulation d´arbres, et avec comme but final un évaluateur d´expression simple.
C´est a dire que tu rentres "2+((4*5)-3)"
Il te donne 19.
J´ai déja pensé a ça, une classe surchargée pourrait etre pas mal ! Quoiqu´il en soit, si tu te lances la dedans, je veux bien t´aider (si j´ai le temps), ou en discuter !
j´avais écrit il y a fort longtemps un dérivateur.
Tu lui donne une expression, la parse, et la dérive.
C´est marrant comme tout a faire, jusqu´au moment ou tu as des problemes d´ensemble de définition de la fonction...
Oh, du parsing ^^
En effet, ce n´est pas le sujet le plus simple. Il va falloir parser ton expression et la ranger dans un arbrer pour pouvoir jouer avec. C´est d´ailleurs en faisant ça qu´on comprend pourquoi certaines calculatrices préfèrent le RPN à la notation naturelle :p
L´écriture d´une grammaire sera donc également utile (Définir variables, nombres, règles de priorité, ...).
Mais c´est un sujet passionnant ![]()
Je me souviens, à la fac, on nous avait fait écrire notre propre compilateur (En C) et avec lex/yacc, on avait créé notre propre langage :p
Et bien entendu, la réccursivité sera ton amie !
Mais je rejoins dnob700 sur un point capital : maîtrise des arbres obligatoire.
"on nous avait fait écrire notre propre compilateur (En C) et avec lex/yacc, on avait créé notre propre langage "
--> Fac de Lyon, la Doua ?
Non, Lens, Faculté Jean Perrin :p
De l´autre coté, beaucoup d´étudiant font des compilos C!
chez nous c´est mini caml, mais bon... ![]()
Je pense aussi que l´écriture de compilo fait partie des classiques du cursus fac et autres formations scientifiques assimilées :p
Ah oui je m´attendais pas à quelque chose d´aussi ardu. Bon j´y passerai le temps qu´il faudra mais je finirai bien par y arriver. Je vais prendre sur le peu de temps libre qu´il me reste, ça prendra le temps que ça prendra ^^
Merci de vos conseils ![]()
hitman_alias_47 > et wé, car Lex et Yacc, j´en ai bien bouffé aussi a Lyon
Chaos_Clad > du boulot pour ça hein ? ![]()
Je veux suivre ta progression !
Je ne saurais te conseiller une classe "Expression" qui contiendrait une expression formelle, avec des opérateurs surchargés :
Expression operator+(Expression1,Expression2)
etc...
Et une classe "Equation" qui contiendrait 2 expressions (celle a gauche, celle a droite), ou alors simplement une seule expression, en se disant qu´a droite ça vaut 0...
A réfléchir !!
Le problème c´est que je n´ai appris que le C, donc tout ce qui est classes, surcharges etc. reste un peu flou, il faut donc que je me reconcentre avant tout sur l´avantage des nouvelles notions liées au C++ visiblement. Je vous ferai part de mes progrès (qui seront lents, l´informatique n´étant qu´une passion secondaire après la mathématique ^^) au fur et à mesure de mon apprentissage
Et encore merci.
Si tu connais ben le C, je te conseille de te renseigner sur Lex et Yacc (Le duo magique), grâce à eux, tu pourras te concentrer sur le fond de ton problème et écrirer de belles grammaires comme l´aiment les mathématiciens :D
Je sais pas, "bien" me semble un grand mot ^^ Sinon, que sont Lex et Yacc ? Que je sache dans quoi je me lance...
http://dinosaur.compilertools.net/
Merci
Vu que je suis vachement fort en anglais, ça va me prendre un certain temps mais en tout cas j´ai lu les quelques premiers paragraphes et ç´a l´air vraiment pas mal ! ![]()
Si je retrouve mes sources de licence (énormes doutes), je les posterai sinon, je verrai si je peux te coder un truc vite fait pour te montrer un peu comment faire.
Ocamllex et Ocamlyacc c´est bien mieux ![]()
j´avoue que pour faire des parser, du calcul formel tout ca, j´aurais plus recommandé caml. Mais c´est un bon exercice de faire ca en C...