CALCULATRICE D'EXPRESSION MATHÉMATIQUE

cs_raffour Messages postés 7 Date d'inscription dimanche 30 décembre 2007 Statut Membre Dernière intervention 22 avril 2008 - 19 avril 2008 à 19:31
jami007 Messages postés 1 Date d'inscription dimanche 9 décembre 2007 Statut Membre Dernière intervention 29 juillet 2009 - 29 juil. 2009 à 11:24
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/46406-calculatrice-d-expression-mathematique

jami007 Messages postés 1 Date d'inscription dimanche 9 décembre 2007 Statut Membre Dernière intervention 29 juillet 2009
29 juil. 2009 à 11:24
Bonjour
un grand merci à tout ceux qui ont travaillé sur ce code.
Ca ma super bien servi.
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
30 avril 2008 à 14:30
version beta sur la page :
http://www.flashapi.org/spas3.html
(version finale quand j'aurrais le temps)

>> gestion d'erreurs:
on peu maintenant changer la langue.
j'ai pas fini l'implémentation des erreurs, et y'a qq petits trucs à revoir (il me semble que la puissance d'un nombre fractionnaire négatif existe!)
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
28 avril 2008 à 11:03
preview:
http://www.flashapi.org/temp/RPN.zip

je dois finir checkExp, et l'idée d'avoir la boucle pour tokenizer et l'algorythme de la npi séparés ne me convient pas. je pense qu'on doit pouvoir les combiner.
enfin, la gestoin des erreurs est différente, mais encore dans ma tête ;)

note: il semble que Stingg.indexof soit 100 fois plus rapide que les regexp. ! ! ? ?
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
26 avril 2008 à 21:04
J'ai hate de lire, corriger, apprécier et applaudir !
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
26 avril 2008 à 13:19
c'est pas vraiment la bonne structure.
du coup j'ai codé la totalité (plus simple de le faire que de l'expliquer)
j'ai juste 1 ou 2 truc à corriger, et je poste le lien.
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
24 avril 2008 à 18:25
C'est parti...
http://www.hopemultimedias.com/flashkod/RPNProjet.zip

Dans l'attente de l'évolution.
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
24 avril 2008 à 13:59
var my_op:RpnOperator = new RpnOperator("sin", "sin", 0, 1);
my_dictionary[my_op.name] = my_op;

donc my_dictionary["sin"] retourne my_op

après rien n'empèche de faire :

RpnOperator.equation(... arg):Number {};
---

var sin:Function = function(... arg):Number { return sin(arg[0]); };
my_op.equation = sin;
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
24 avril 2008 à 13:10
Effectivement le "RPN" simpose donc.

D'accord pour l'usage d'un "dictionary" regroupant l'ensemble des "RpnOperator".
Mais l'usage d'au moins un "switch" est obligatoire. Puisque c'est ce "switch" qui devra retourné à partir d'un "string"(name) l'objet RpnOperator correspondant.

public function getOperator( $name:string )
:RnpOperator{
switch($name)
{
case 'somme': return RpnOperator.SOMME ;
// Constante contenant un "RpnOperator" setter comme il se doit...
etc...
}
}

non ?
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
24 avril 2008 à 10:39
http://en.wikipedia.org/wiki/Reverse_Polish_notation
http://fr.wikipedia.org/wiki/Notation_polonaise_inverse

>>Il se dit que c'est plus rapide qu'une analyse de String car par char
il me semble aussi.

j'ai supprimé les tableaux au profit d'un objet RpnOperator et la classe TNiveau est devenue PostFixItem et est dans le fichier as de la classe RpnExp (car c'est une classe interne, pas besoin d'y donner accès).

mon but c'est que RpnOperator définnisse lui même sa fonction mathématique,
de façon à remplacer le switch de eval_exp par un objet Dictionary
>> et de créer des "collections" externes de fonction (+ simple à gérer)

public function RpnOperator(name:String, notation:String, priority:int 0, operandNum:uint 0) {
super();
this.name = name;
this.notation = notation;
this.priority = priority;
this.operandNum = operandNum;
//this.equation = equation;
}
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
24 avril 2008 à 09:42
Non je ne penses rien moi. Plus depuis longtemps.
Une question, que veux dire "RPN" ?
Moi j'au choisi "EqExp" de EquationExpression.

Mais c'est vrai que les "vérifications" de la chaine pourrait se faire a travers les "RegExp". Il se dit que c'est plus rapide qu'une analyse de String car par char.

Qund on sera d'accord sur la structure je me proppose de faire le premier obj:
L'operator.
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
23 avril 2008 à 18:25
top30
tu penses qu'utiliser des RegExp pour alimenter la pile serait judicieux (des projets existent sur ce principe ds d'autres languages)
ou bien il n'y a pas de gain de performance et une boucle reste le mieux ?
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
23 avril 2008 à 12:58
La propo de nom de BananaTree est à mon avis la bonne:
"RpnExp" suivant la logique et la structure des RegExp.
Le package serait donc "flash.math.RpnExp" ????
Pourquoi pas ?
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
22 avril 2008 à 18:30
le package logique est "math"
le nom logique de la classe devrait être RPN, ou RpnExp, qui me semble pas trop mal au final
ce qui permettrait de faire des trucs du genre new RpnExp(str), RpnExp.exp(str) et RpnExp.test(str)
la gestion des erreurs est partie intégrante d'as3 et la classe devrait être RPNException

concernant la gestion des expressions mathématiques à une ou plusieurs iconnues, je préconise l'utilisation de bibliothèques de fonctions dynamiques.
cs_raffour Messages postés 7 Date d'inscription dimanche 30 décembre 2007 Statut Membre Dernière intervention 22 avril 2008
22 avril 2008 à 12:43
Waoow ! et moi qui commençait à penser que la communauté des action-scripteurs ne kiffait qu'à animer des petits mickeys dans tous les sens ...
Les suggestions de TOP30 sont alléchantes car bien structurées et découpées mais j'apprécierai un peu plus de précisions
je précise aussi que le type Constante (mal nommée donc à changer) correspond à la possibilité d'introduire une variable, par ex : x pour calculer différentes valeurs d'une expresion en f(x)
exemple : f(x) = 3x^2 -x la lettre x doit être reconnue comme une "constante" qu'on peut ensuite remplacer par une valeur numérique
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
22 avril 2008 à 10:56
Enfin un projet intéressant.
D'après ce que j'ai lu faudrais peut-être commencer par définir un "package Calcul:

package Calcul
{
classe Calcul
// la classe actuelle "TCalcul"

classe CalculOperators
// Liste de constantes de "CalculOperator"

classe CalculOperator
// Objet regroupant priorité, nom, operateur et type

classe CalculError
// Gestion des erreus

classe CalculItemsType
// Liste de constante des types d´élément de CalculStack

classe CalculItems
// Array des éléments de l'actuelle array "TTypePile"
}

A débattre...
cs_raffour Messages postés 7 Date d'inscription dimanche 30 décembre 2007 Statut Membre Dernière intervention 22 avril 2008
21 avril 2008 à 16:50
BananaTree
ça ne m'embête pas que tu le passes en as3 et en anglais et je voudrais bien voir ça
mais je ne suis qu'un transcripteur et non l'auteur : il faudrait sans doute citer Barbichette qui l'a écrit en Delphi
De plus, il faudrait le fignoler :
éliminer les scories inutiles
ajouter le traitement des variables
améliorer la gestion des erreurs
vérifier la libération mémoire
je vais essayer de le faire mais si qqun a envie de m'aider ...
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
21 avril 2008 à 11:02
helo,
si ça ne te dérange pas, je vais le passer en as3 et en anglais, et on va mettre ton nom en nom d'auteur, avec une jolie licence open source.
pascal
cs_raffour Messages postés 7 Date d'inscription dimanche 30 décembre 2007 Statut Membre Dernière intervention 22 avril 2008
19 avril 2008 à 19:31
Pour ceux qui ne disposent pas de flash cs3 et ne peuvent donc pas ouvrir le fichier fla
voici son source (btOK est un composant bouton,tsaisie et treponse sont deux zones de texte)
import TNiveau;
import TCalcul ;


btOK.onPress = function(){
var expression = new TCalcul();
var expr : String = tsaisie.text;
try { expression.DefineExpression(expr);
// on évalue l'expression
expression.Evalue();
// on affiche juste le résultat
treponse.text = expression.GetResultat();

} // si il y a une erreur, on l'affiche
catch(e:Error) {treponse.text =expression.GetExprErrorString(expression.LastExprError);
expression = Null;
}
}
Rejoignez-nous