Evaluation d'une chaine de calcul

Signaler
Messages postés
235
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
26 juillet 2010
-
Messages postés
6
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2004
-
Quelqun connait il une fonction ( ou une unité plutot) qui permettrai de faire un truc du genre function evaluation(chaine:string):integer et qui reverrai le résultat de la chaine exemple
evaluation("3+5*2") renvoie 13.
Merci d'avance

8 réponses

Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
Je pense que tu peux essayer de le faire tout seul partant du principe que tout ce qui est entre deux signes arithmétiques (j'entends par là + - * /) est forcément un chiffre... Tu peux donc essayer d'utiliser un pos(...) en testant la présence des opérateurs dans la chaine, puis récupérer les nombres puis enfin effectuer les opérations en respectant les priorités !

Bonne prog' !
Bestiol.
Messages postés
235
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
26 juillet 2010

J'y avias bien pensé, mais j'aurais aimé une routine qui faisait aussi COS, SIN, LN...en plus, il y a le problème des nombres negatifs...C'est faisable, mais si ca existait deja, ce serait pas mal de temps de gagne pour mon projet :)
Merci
Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
Evidemment, si c'est aussi poussé !!! Je te comprend très bien ! je vais voir si j'arrive à trouver quelque chose, mais tu peux, pour ta part, chercher sur delphi300.com ou torry.net, par exemple...

Bonne prog' !
Bestiol.
PS: D'ailleurs, j'en profite pour te retourner une question : A quoi correspond l'opération LN ?? Je ne l'ai jamais utilisée mais déjà rencontrée, et j'aimerais savoir à quoi elle sert... Merci !
Messages postés
235
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
26 juillet 2010

Sympas, merci, e vais regarder aussi de mon cote.
J'ai mis ln ^pour la fonction logarythme népérien. Voila (si tu ne connais pas cette fonction dis le moi)
A+
Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
Justement... Je connais pas cette fonction !!!
Je viens de passer en 1ère S et jamais en cours on en a parlé !! C'est certainement normal, mais si tu avais la gentillesse de m'expliquer ce que c'est, ou sinon où je peux avoir des infos, ce serait sympa !

Sinon, pour ta question (!!) :
Je suis allé voir sur delphi super page, et j'ai peut-être trouvé ce que tu cherches... Il s'agit apparemment d'une suite de 8 composants juste pour des maths, et y en a un qui a l'air de faire ce qu tu veux ! (j'ai pas essayé, mais d'après ce que j'ai compris de la description en Anglais c'est ça !)

Voici un lien direct sur le fichier : delphi.icm.edu.pl/ftp/d30free/exbldr131.zip

Voilà !! Bonne prog' !
Bestiol.
Messages postés
235
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
26 juillet 2010

-------------------------------
Réponse au message :
-------------------------------

Justement... Je connais pas cette fonction !!!
Je viens de passer en 1ère S et jamais en cours on en a parlé !! C'est certainement normal, mais si tu avais la gentillesse de m'expliquer ce que c'est, ou sinon où je peux avoir des infos, ce serait sympa !

Sinon, pour ta question (!!) :
Je suis allé voir sur delphi super page, et j'ai peut-être trouvé ce que tu cherches... Il s'agit apparemment d'une suite de 8 composants juste pour des maths, et y en a un qui a l'air de faire ce qu tu veux ! (j'ai pas essayé, mais d'après ce que j'ai compris de la description en Anglais c'est ça !)

Voici un lien direct sur le fichier : delphi.icm.edu.pl/ftp/d30free/exbldr131.zip

Voilà !! Bonne prog' !
Bestiol.

Merci beaucoup, je vais y jetter coup d'oeil . Pour la fonction ln, c'est normal, c'est le programme de Terminale S :) . (Je suis prof de Math). Cette fonction a plein de proporiétes interessantes en particulier ln(a^n)=nln(a). (Utile pour resoudre par exemple 2^n>500). Voila

A+
Magicvinni
Messages postés
833
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
Ah bon ?? Bah si tu le dis, c'est que ça doit être vrai !!! :big)

lol

Bestiol.
Messages postés
6
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
20 décembre 2004

tu peux commencer ainsi :

type
Tsymbole = (plus, moins, mult, divi, opp, abs, ln, exp , sin, ...,arcTan, reel);
PFonction = ^TFonction;
TFonction = record
case symbole : TSymbole of
plus .. puis : (gauche, droite : PFonction);
opp .. arcTan : (argument : PFonction);
reel : (valeur : Real);
end;


pour "compiler" l'expression :

function LireExpression : PFonction;

function LireTerme : PFonction;

function LireFacteur : PFonction;
begin
if LireCar = '(' then begin
LireExpression;
if LireCar <> ')' then Error;
end
else begin
new (result);
result.Symbole := LireSymbole;
if result.symbole = reel then
result.valeur := Lirevaleur;
end;
end;

begin {-- LireTerme --}
result := LireFacteur;
while lirecar in ['*', '/'] do begin
new (temp);if carlu '*' then temp.symbole mult else temp.symbole :=divi;
temp.gauche := result;
temp.droite := LireFacteur;
result := temp;
end;
end;

begin {-- LireExpression --}
{-- même principe avec '+' et '-' et LireTerme--}
end;

enfin pour l'évaluation des expressions ainsi formées :

function evaluation (f :Pfunction) : Real;
begin
case f^.symbole of
reel : result := f^.valeur;
opp : result := - evaluation (f^.argument);
....
plus : result := evaluation (f^.gauche) + evaluation (f^.droite);
...
end
end;

je te laisse le soin de finir cette source en complétant les fonctions et
définir les fonctions telle que lirecar, liresymbole ...

normalement avec ça, tu peux interpréter des expressions :
sin abs -4 en tant que sin (abs (-4))
4 * tan (3/2)
...

En ajoutant "unknown" dans TSymbole tu pourrais lire des fonctions avec inconnue(s)
et de les dériver ...

Je sais, c'est un peu long, si quelqu'un à plus simple