Calculer une expression contenue dans une chaîne

Mode d'emploi
Le code
Explications

Mode d'emploi - Exemple

La fonction CALC! retourne un nombre réel, et requiert un paramétre de type chaîne. Le nombre qu'elle retourne est le résultat de l'expression contenue dans la chaîne.

La procédure de calcul respecte les conventions du calcul scientifique (priorités). En plus de - + * /, elle comprends les fonctions ^, SIN, COS, TAN, EXP, LOG. Elle accepte de plus plusieurs niveau de parenthéses, leur nombre maximum variant selon la complexité du calcul et la taille de la pile. Pour les fonctions ^,SIN,COS,TAN,EXP,LOG et E il n'y a pas besoin de parentéses; par exemple SIN2.65 équivaut à SIN(2.65).
Attention, le signe - fait partie du nombre auquel il se rattache; par exemple -12^4 équivaut à (-12)^4.
Pour que la procédure fonctionne, il FAUT que le POINT soit le SYMBOLE DECIMAL; configurez cela avec Windows.

Exemple d'utilisation :
Dim x!
Dim a$
a$ = "cos0+4*12-2^3"
x! = Calc!(a$)
msgbox format$(x!)
On obtient le résultat suivant :
41

Le code


Explications

Je vais vous décrire la méthode que j'ai employée pour calculer une expression. Comme c'est compliqué, nous allons faire cela avec un exemple.

Soit l'expression "sin1.652+2*(17.6-15/(42+178))+2.3*(35-128)".

La première chose à faire est de régler le compte des parenthèses. En fait, au départ, ma fonction ne savait que calculer les expressions sans parenthèses. Comment faire ?
Réponse : RECURSIVITE !
NB: Une fonction récursive est une fonction qui s'appelle elle-même.
Donc, dans un premier temps, ma fonction identifie ce qu'il y a dans le premier couple de parenthése.
Le contenu "17.6-15/(42+178)" est ainsi identifié.
Et que fait la fonction ? Elle calcule ce contenu... en se rappellant elle-même ! Donc la fonction CALC!("sin1.652+2*(17.6-15/(42+178))+2.3*(35-128)") appelle dans son code la fonction CALC!("17.6-15/(42+178)").
J'espere que vous me suivez :-)
Et la fonction CALC!("17.6-15/(42+178)") appelle aussi la fonction CALC!("42+178").
Alors CALC!(42+178) retourne la valeur "220"; CALC!("17.6-15/(42+178)") devient alors CALC!("17.6-15/220"). C'est le «principe fondamental des parenthèses» que j'ai mis au point : Dès qu'il y a des parenthèses, on rappelle la fonction pour calculer leur contenu et, une fois ce contenu obtenu, on remplace dans la chaîne les parenthèses par la valeur de leur contenu.

Le compte des parenthèses est réglé, l'expression "sin1.652+2*(17.6-15/(42+178))+2.3*(35-128)" est devenue "sin1.652+2*17.53181818182+2.3*-93"

Maintenant je vais vous expliquer comment l'expression, une fois débarrassée de ses parenthèses, est calculée. D'abord, on recherche tout les opérateurs ayant la "priorité haute", c'est à dire: "COS SIN TAN LOG EXP ^ ..."
Puis, on les remplacent par leur valeur.
Ainsi, "sin1.652" est remplacé par sa valeur "0.99670480"; l'expression devient "0.99670480+2*17.53181818182+2.3*-93"
Ensuite, on recherche tout les opérateurs ayant la "priorité moyenne", c'est à dire: "*" et "/"
Puis, on les remplacent par leur valeur.
Ainsi, "2*17.53181818182" devient "35.06364000", et "2.3*-93" devient "-213.9"; l'expression devient alors "0.99670480+35.06364000+-213.9"
Enfin, il ne reste plus que les opérateurs ayant la "priorité basse", c'est à dire: "+" et "-".
On calcule alors le resultat au fur et à mesure :
"0.99670480+35.06364000+-213.9"
"36.06034000+-213.9"
"-177.8397000"
Il ne reste plus qu'à retourner le resultat obtenu.