Calculette qui prend et retourne une chaîne de caractères - Algo - Programmation
Marsh Posté le 14-10-2010 à 01:44:39
Code :
|
Marsh Posté le 14-10-2010 à 02:26:55
Code :
|
Marsh Posté le 14-10-2010 à 06:23:45
6 heures du mat, j'en suis là :
Code :
|
Marsh Posté le 14-10-2010 à 11:59:33
Midi, c'est l'heure de la gamelle.
Code :
|
Marsh Posté le 15-10-2010 à 13:48:46
Petite correction pour le traitement des nombres négatif et ajout des fonctions trigonométrique et autres.
Mais j'aurais aimé voir un peut les algo qui tourne ailleurs.
Code :
|
edit : j'en avais oublié un petit morceau.
Marsh Posté le 15-10-2010 à 15:10:41
Ah ouais, assez bourrin ton algo. Si j'ai bien compris, tu essaie d'identifier l'expression au parenthèsage le plus interne, fais une évaluation, remplace le résultat dans la chaine et continue comme ça, jusqu'à ce qu'il n'y a plus rien à évaluer.
Bon, tu devrais voir du coté des parser LALR(1). C'est typiquement taillé pour ce genre de chose. C'est ce que génère des outils comme lex&yacc, mais pour un truc aussi trivial que ça, pas la peine de sortir une artillerie aussi lourde. Le truc avec les parseurs LALR(1) c'est de diviser ton code en deux: une qui fait l'analyse lexicale, une autre l'analyse grammaticale.
L'analyse lexicale est triviale, l'analyse grammaticale nécessite un automate fini à pile. Mais pour des expressions mathématiques en notation infixe, c'est assez trivial à faire à la main. Pour ça, tu as besoins de 3 variables:
L'algo se résume à :
S'il n'y a plus rien à lire, le résultat est normallement au sommet de la pile des entiers. S'il y a encore des opérateurs sur la pile, dépile en faisant l'opération associée.
Et voilà, avantages :
- Trivial d'ajouter de nouveaux opérateurs et/ou prendre en compte d'autres types de données.
- La chaine est lue de gauche à droite, en ne lisant qu'un caractère à la fois.
- L'arité des opérateurs se résume au nombre d'éléments à dépiler.
- L'associativité se résume à la condition du dépilement pour garder une pile d'opérateur en priorité croissante (associativité à gauche) ou strictement croissante (associativité à droite).
Comme j'ai que ça à foutre en ce moment, j'ai dépoussiéré une implémentation en C que j'avais faite il y a un bout de temps. Cette version ne contient qu'un type de donnée avec une douzaine d'opérateurs. La version originale
en avait 35 avec 3 types de données (entier, réél et chaine), en C pas en ADA, mais le code n'est pas trop pourri pour être transposé dans un autre langage:
Code :
|
Marsh Posté le 15-10-2010 à 17:10:49
Merci bien tpierron.
Je vais passer quelques heures à bricoler mon code, et je me mettrais à cette solution.
Marsh Posté le 15-10-2010 à 20:32:46
j'ai fait un import de ton code que j'ai modifié pour traiter des flottant et j'ai légèrement modifier le main pour qu'il réponde à mes besoins en terme d'interface.
Je connais pas grand chose au C. j'ai une warning à la compilation, mais ça fonctionne.
Code :
|
Marsh Posté le 16-10-2010 à 11:05:06
Pour le moment j'ai fait un import en retournant un pointeur sur un char finalement mais je me mettrai à l'implémentation avec Ada un peu plus tard.
Marci encore tpierron.
Marsh Posté le 23-11-2010 à 19:19:41
Bonjour,
Finalement, comment appelle-t-on ce type de machine ?
J'ai trouvé une implémentation Ada du même genre.
Je compte maintenant en implémenté une pour traiter les fichier MIDI... Vous pensez que ça peut ce faire ?
Pardon rien à voir avec les calculette.... Si ....
Marsh Posté le 23-11-2010 à 19:33:05
Hello,
C'est une machine à pile si mes souvenirs sont bons ( http://www.google.fr/#q=compilateu [...] 22138eb393 ).
Marsh Posté le 13-10-2010 à 20:48:29
Je réalise une calculette qui prend une chaîne de caractères et je voulais avoir votre avis sur un algo.
Je prend une chaîne de caractères et je retourne une chaîne de caractères.
j'ai à ma disposition un thread qui réalise toute les opérations mathématiques primitives voulues.
Merci pour votre aide.