Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CALCULATRICE D'EXPRESSION MATHÉMATIQUE


Information sur la source

Description

Les deux fichiers .as contiennent les objets permettant le passage d'une expression mathématique classique (infixée) par ex 3*(4+5) en notation polonaise inversée 3 4 5 + * plus facile à évaluer en programmation et qui n'est pas ambigue  (contrairement aux apparences) car par ex, l'addition a 2 opérandes qui sont donc forcément 4 et 5
Après ce passage en polonaise inversée, l'expression est calculée dans ce source
Le fichier fla est une interface sommaire permettant de tester les calculs
Le tout est compatible en as2, mais ne devrait pas être trop difficile à faire évoluer en as3
Les objets comprennent un certain nombre de fonctions et des expressions comme :
5 + (3 * 4^5) ou 5 - 2* exp(-3) ou asin(0.5)(en radians) sont reconnues et calculées
 

Source

  • Il s'agit d'une transcription partielle d'un source en Delphi pris sur http://www.delphifr.com//code.aspx?ID=45846
  • Ce source semble d'ailleurs une adaptation réussie d'un source de la défunte revue Pascalissime
  • J'ai pas mal d'expérience en delphi et pascal mais je suis un néophyte en actionscript
  • C'est donc pour progresser en actionscript que j'ai fait cette transcription
  • Le source des objets est assez long (+ de 500 lignes) et technique mais j'ai essayé de le commenter correctement
  • Enfin je n'ai pas eu le temps et le besoin d'implémenter la partie "constante" qui permet de calculer des f(x) par ex, mais il reste des traces dans le source
Il s'agit d'une transcription partielle d'un source en Delphi pris sur http://www.delphifr.com//code.aspx?ID=45846
Ce source semble d'ailleurs une adaptation réussie d'un source de la défunte revue Pascalissime
J'ai pas mal d'expérience en delphi et pascal mais je suis un néophyte en actionscript
C'est donc pour progresser en actionscript que j'ai fait cette transcription
Le source des objets est assez long (+ de 500 lignes) et technique mais j'ai essayé de le commenter correctement
Enfin je n'ai pas eu le temps et le besoin d'implémenter la partie "constante" qui permet de calculer des f(x) par ex, mais il reste des traces dans le source

Conclusion

Pour les experts en as, désolé pour les maladresses (par ex, de nombreux return sont inutiles) mais je compte sur vos conseils pour progresser
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de raffour le 19/04/2008 19:31:12

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;
}
}

signaler à un administrateur
Commentaire de BananaTree le 21/04/2008 11:02:44

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

signaler à un administrateur
Commentaire de raffour le 21/04/2008 16:50:25

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 ...

signaler à un administrateur
Commentaire de top30 le 22/04/2008 10:56:24

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...

signaler à un administrateur
Commentaire de raffour le 22/04/2008 12:43:18

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

signaler à un administrateur
Commentaire de BananaTree le 22/04/2008 18:30:25

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.

signaler à un administrateur
Commentaire de top30 le 23/04/2008 12:58:21

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 ?

signaler à un administrateur
Commentaire de BananaTree le 23/04/2008 18:25:02

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 ?

signaler à un administrateur
Commentaire de top30 le 24/04/2008 09:42:02

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.

signaler à un administrateur
Commentaire de BananaTree le 24/04/2008 10:39:01

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;
}

signaler à un administrateur
Commentaire de top30 le 24/04/2008 13:10:17

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 ?

signaler à un administrateur
Commentaire de BananaTree le 24/04/2008 13:59:32

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;

signaler à un administrateur
Commentaire de top30 le 24/04/2008 18:25:16

C'est parti...
http://www.hopemultimedias.com/flashkod/RPNProjet.zip

Dans l'attente de l'évolution.

signaler à un administrateur
Commentaire de BananaTree le 26/04/2008 13:19:45

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.

signaler à un administrateur
Commentaire de top30 le 26/04/2008 21:04:38

J'ai hate de lire, corriger, apprécier et applaudir !

signaler à un administrateur
Commentaire de BananaTree le 28/04/2008 11:03:16

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. ! ! ? ?

signaler à un administrateur
Commentaire de BananaTree le 30/04/2008 14:30:14

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!)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Calcul d angle ! [ par dragonrouge ] Bonjour,J ai un petit souci de prog sous Flash (ou de Math ). Voila, je veux simplement faire un inverse tangente sous Flash pour recupérer un angle e Calculatrice [ par harveym ] Je suis à faire une calculatrice en flash. Je me suis défini une zone de texte statique. Je peux faire afficher le chiffre 9 par exemple mais suis i ouverture de la calculatrice windows [ par mina31 ] Salut à tous, il parait qu'on peut ouvrir la calculatrice windows en action script à partir de flash... Quelqu'un connaitrait il le code sv calcul de la distance parcourue par la souris [ par gcolpart ] Salut,j'aurais voulu savoir s'il était possible de créer une sorte de compteur qui calculerait la distance parcourue par la souris, en cm ou probleme de calcul [ par aewu ] je n'arrive pas à additionner, à soustraire oui, avec ce code : _root.champ = _root.champ-1; alors pour additionner je fais : _root.champ = calcul tableau [ par Fwdavy ] Salut, J'ai un tableau qui donne ça : tableau = ["3","*","5","*",(","4","/","2",")"]; si je fais A = tableau.join("") j'obtiens : A = 3*5*(4/2); soucis de calcul [ par blue_jim ] Le resultat de certains de mes calculs me donnent Nan. Je ne comprend pas ou est l'erreur. Mon prog est une feuille de calcul avec des champs que le v Calcul de bande Passante - Flash [ par Diddou_83 ] Bonjour, alors voilà, j'ai créer un petit lecteur de vidéo flv qui appelle des vidéos (grâce à une variable) et les diffuse. Jusque là pas de problème Calcul des faces cachées [ par gyome314 ] Bonjour à tous,Je travaile sur un petit projet de moteur 3D sous flash :  un univers 3D est reconstitué à l'aide de face carrée autour du point (0,0,0 recupérer une variable pour effectuer un calcul [ par alise ] J'aimerais récupérer une valeur numérique contenue dans un .txt et de m'en servir pour faire une opération. (je sais que cela se fait d'un xml, mais p


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.