CALCULATRICE D'EXPRESSION MATHÉMATIQUE

Messages postés
7
Date d'inscription
dimanche 30 décembre 2007
Statut
Membre
Dernière intervention
22 avril 2008
- - Dernière réponse : 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

cs_raffour
Messages postés
7
Date d'inscription
dimanche 30 décembre 2007
Statut
Membre
Dernière intervention
22 avril 2008
-
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;
}
}
BananaTree
Messages postés
337
Date d'inscription
vendredi 15 octobre 2004
Statut
Membre
Dernière intervention
2 novembre 2010
-
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
-
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 ...
top30
Messages postés
1158
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
6 août 2010
-
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
-
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
BananaTree
Messages postés
337
Date d'inscription
vendredi 15 octobre 2004
Statut
Membre
Dernière intervention
2 novembre 2010
-
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.
top30
Messages postés
1158
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
6 août 2010
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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. ! ! ? ?
BananaTree
Messages postés
337
Date d'inscription
vendredi 15 octobre 2004
Statut
Membre
Dernière intervention
2 novembre 2010
-
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!)
jami007
Messages postés
1
Date d'inscription
dimanche 9 décembre 2007
Statut
Membre
Dernière intervention
29 juillet 2009
-
Bonjour
un grand merci à tout ceux qui ont travaillé sur ce code.
Ca ma super bien servi.