Programmation |
![]() |
MagiCalculator a été réalisé à l’aide du langage actionScript2, en programmation objet (un peu) et linéaire (beaucoup), qui est intégré à flash/flex et qui se rapproche fortement du langage java. Pour les enseignants programmeurs qui souhaiteraient réaliser leur propre interpréteur/parseur de calcul (très lourd !), il peut leur être utile de détailler la méthode que j’ai utilisée pour réaliser celui de MagiCalculator, accompagné du code « actionScript » (un peu détaillé) correspondant. ActionScript 2 est tout de même livré avec les routines de fonctions mathématiques de base, que l’on peut invoquer pour l’interprétation, puisque les animations vectorielles sont particulièrement gourmandes en calcul!. Lorsqu’une expression à calculer est saisie, il s’agit de l’analyser littéralement (parsing) puis de traduire cette expression en séquences de calculs (interpréteur) qui aboutiront à un (ou plusieurs) résultat . La méthode d’analyse de l’expression va dicter la programmation de l’interpréteur et retentir sur la vitesse et l’efficacité des calculs obtenus. |
A titre d’exemple très simple, voici l’analyse de 5*3+1 (les symboles # sont des fonds de pile ou d’expressions indiquant la fin)
Pas |
Opérateurs (pile) |
Opérandes (pile valeurs) |
Expression (input) |
action |
|
1 |
# |
# |
5*3+1 # |
S |
|
2 |
# |
# 5 |
*3+1 # |
S |
|
3 |
# * |
# 5 |
3 +1 # |
S |
|
4 |
# * |
# 5 3 |
+1 # |
R |
|
5 |
# |
# 15 |
+1 # |
S |
|
6 |
# + |
# 15 |
1 # |
S |
|
7 |
# + |
# 15 1 |
# |
R |
|
8 |
# |
# 16 |
# |
fin |
|
Opérateur 2 (input) |
||||
Opérateur 1 |
+ |
- |
* |
: |
# |
+ |
R |
R |
S |
S |
R |
- |
R |
R |
S |
S |
R |
* |
R |
R |
R |
R |
R |
: |
R |
R |
R |
R |
R |
# |
S |
S |
S |
S |
Fin |
Bien évidemment, les priorités des opérateurs les uns par rapport aux autres doivent être
scrupuleusement définis dans une
table de priorités (voir ci-dessous la Table emloyée par le calculateur).
Par exemple la mini table ci-contre (avec +, -, *, :) :
On retrouve les priorités classiques : * et : sont prioritaires sur + et - . La table des priorités de MagiCalculator contient 36 opérateurs et certains codes d’erreurs. Toutes les fonctions « utilisateurs » ayant la même priorité définit par f0. Pour ceux qui aiment « fouiller » dans le code de programmes, vous trouverez ici : variables+parseur les variables globales ainsi que l’interpréteur/parseur de MagiCalculator en format .pdf. Cela représente actuellement la partie la plus essentielle (environ 1/5 du programme global). Dix calculateurs ont été créésen interne et interragissent uniquement pour l’étude de fonctions dont les définitions sont réutilisées pour créer de nouvelles fonctions, de façon imbriquées (un seul calculateur suffit pour tout le reste des calculs). Cette façon de procéder permet de définir des fonctions utlisateurs dont la définition utilise également d'autres fonctions utilisateur…jusqu’à…10 imbrications, sans nécessité, pour l’utilisateur, d’utiliser un langage de programmation ou macros. Les autres parties du programme de Magicalculator semblent moins intéressantes. |
Table des Priorités employée par le calculateur.
La coordonnée x (1ère) représente l’opérateur rencontré en premier. La coordonnée y (2ème) représente l’opérateur qui suit dans l’expression. L’opérateur “&” remplace la multiplication “*” sous-entendue, non apparente (comme 2(4+8x) ou 1/2√3 etc..). La barre de fraction “/” est prioritaire sur “*“, “+” ,”:” et “-” mais pas sur “&“. Toutes les fonctions définies par l’utilisateur (90 possibles) ont les mêmes priorités définies par celles de “f0“. Quelques codes d’erreurs apparaissent, correspondant à des déséquilibres de parenthèses ou l’absence de paramètres nécessaires. Par exemple, à la ligne 5 (/) l’opérateur fractionnaire “/” est prioritaire sur +, -, *(indiqué par R) mais n’est pas prioritaire sur “&” (qui est un “*” sous-entendu ) car indiqué par S. |