MINI EVALUATEUR D'EXPRESSION ARITHMÉTIQUES

sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 - 2 sept. 2006 à 12:52
agent24 Messages postés 5 Date d'inscription samedi 20 octobre 2012 Statut Membre Dernière intervention 1 juin 2013 - 1 juin 2013 à 21:03
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/39295-mini-evaluateur-d-expression-arithmetiques

agent24 Messages postés 5 Date d'inscription samedi 20 octobre 2012 Statut Membre Dernière intervention 1 juin 2013
1 juin 2013 à 21:03
Désolé du retard..

Oui, effectivement, il ya une erreur
étant donné que tu n'herite plus de Fonction, il ne reconnait pas vu que empileF n'empile que des fonctions de type "Fonction" et vu que l'heritage multiple n'existe pas en java, je te conseillerais de creer une interface pour ça...
ensuite tu fais ta fonctionPlus implements Fontion.. ça peut marcher ;)

Moi j'ai une autre erreur qui concerne la fonctionPow donc pour le calcul de la puissance...
comment dire ou modifier la grammaire pour que la fonction puissance soit prioritaire par rapport aux fonctions... car 2^2*3^2 ne fait pas 144 mais 36 !!!!
J'ai essayé d'ajouter un int de priorité mais je ne comprends pas comment le passer lors de l'evaluation de l'expression qui peut contenir un calcul de puissance ou peut ne pas en contenir..
Voilà
Merci de votre aide
lemufty Messages postés 74 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 1 juin 2013
30 mai 2013 à 01:39
salut agent24,j'ai essayé ce que tu as dit mais j'ai un soucis sur ces differents methodes que voici:
l'instanciation FonctionPlus genère une erreur dans cette fonction empileF(new FonctionPlus()),c'est logique car FonctionPlus ne fait plus partir de la classe Evalueur et herite de Evalueur. pareil pour empileF(new FonctionMoins())...
private void Eprime()
{
if (erreur!=ERROR_NO) return;

if (lu=='+')
{
avance(); T(); empileF(new FonctionPlus()); Eprime();

}else if (lu=='-')
{
avance(); T(); empileF(new FonctionMoins()); Eprime();

}
}

/**
* T->FT'
*/
private void T()
{
if (erreur!=ERROR_NO) return;

if (lu=='(' || (lu>='0' && lu<='9') || (lu>='a' && lu<='z') || (lu>='A' && lu<='Z'))
{
F(); Tprime();
}else erreur=ERROR_BAD_SYNTAX;
}

/**
* T'->*FT' | /FT' | $
*/
private void Tprime()
{
if (erreur!=ERROR_NO) return;
if (lu=='*')
{
avance(); F(); empileF(new FonctionMulu()); Tprime();

}else if (lu=='/')
{
avance(); F(); empileF(new FonctionDiv()); Tprime();

}

}

/**
* F->id | (E)
*/
private void F()
{
if (erreur!=ERROR_NO) return;
if (lu>='0' && lu<='9')
{
double valeur=0;
while(lu>='0' && lu<='9') //lit une valeur numérique
{
valeur=valeur*10+(lu-'0');
avance();
}
if (lu=='.') //reel
{
avance();
double av=0.1;
while(lu>='0' && lu<='9') //lit une valeur numérique
{
valeur=valeur+(lu-'0')*av;
av=av*0.1;
avance();
}
}
empileF(new FonctionCst(valeur));
}else if ((lu>='a' && lu<='z') || (lu>='A' && lu<='Z')) //une variable
{
String nomv=""+lu;
avance();
while((lu>='a' && lu<='z') || (lu>='A' && lu<='Z') || (lu>='0' && lu<='9'))
{
nomv=nomv+lu;
avance();
}
if (lu!='(') //c'est une variable
{
//cherche la variable
Double var=vars.get(nomv);
if (var==null)
erreur=this.ERROR_UNKNOW_VAR;
else
empileF(new FonctionVar(nomv));
}else
{ //une fonction
avance();
E();
if (lu==')')
avance();
else erreur=ERROR_BAD_SYNTAX;

if (nomv.equals("sin")) //sinus
empileF(new FonctionSin());
else if (nomv.equals("cos")) //cos
empileF(new FonctionCos());
else
erreur=this.ERROR_UNKNOW_FUNCTION;
}
}
else if (lu=='(')
{
avance();
E();
if (lu==')')
avance();
else erreur=ERROR_BAD_SYNTAX;
}else erreur=ERROR_BAD_SYNTAX;
}
agent24 Messages postés 5 Date d'inscription samedi 20 octobre 2012 Statut Membre Dernière intervention 1 juin 2013
28 mai 2013 à 19:50
Slt tout le monde !!
POur ta question de séparer en différentes classes Lemufty,... je pense que tu dois faire un extends de Evalueur pour chaque fonction, et la dans evalue de tes fonctions, tu fais super.depile(); pour bien récuperer la dernière valeur contenue dans la pile...
J'ai peut être tort mais ça ne coûte rien d'essayer...
lemufty Messages postés 74 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 1 juin 2013
28 mai 2013 à 14:41
jai vu comment utiliser la fonction addVar().
lemufty Messages postés 74 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 1 juin 2013
28 mai 2013 à 14:20
jai voulu separer les classes interne qui sont dans Evalueur telle que FonctionFois,FonctionPlus,FonctionMoins et jai transformé la classe Fonction en interface .mais quand j'execute le main j'obtiens à chaque fois 0.0.voici des bouts de mon code.quelqu'un a t'il une idée car je voudrais separer les classes et non les condenser toutes dans Evalueur.merci

public class FonctionPlus extends Evalueur implements Fonctionabl{

@Override
public void evalue() {
empile(depile()+depile());
}
public String toString()
{
return "+";
}



}
public interface Fonctionable {


public void evalue();

}
lemufty Messages postés 74 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 1 juin 2013
28 mai 2013 à 14:06
comment utiliser la fonction addVar() pour ajouter une variable.
par exemple je voudrais faire ce ceci.
double x=2
double r=x+5//ce qui donne 7
agent24 Messages postés 5 Date d'inscription samedi 20 octobre 2012 Statut Membre Dernière intervention 1 juin 2013
17 mars 2013 à 22:08
Re, j'ai réussi à pouvoir intégrer la fonction factorielle dans le code
voilà à quoi ressemble :

private void F()
{
if (erreur!=ERROR_NO) return;
if (lu>='0' && lu<='9')
{
double valeur=0;
while(lu>='0' && lu<='9') //lit une valeur numérique
{
valeur=valeur*10+(lu-'0');
avance();
}
if (lu=='.') //reel
{
avance();
double av=0.1;
while(lu>='0' && lu<='9') //lit une valeur numérique
{
valeur=valeur+(lu-'0')*av;
av=av*0.1;
avance();
}
}
empileF(new FonctionCst(valeur));
if (lu == '!'){
avance();
empileF(new FonctionFact());
}
}
else if ((lu>='a' && lu<='z') || (lu>='A' && lu<='Z')) //une variable
{
String nomv=""+lu;
avance();
while((lu>='a' && lu<='z') || (lu>='A' && lu<='Z') || (lu>='0' && lu<='9'))
{
nomv=nomv+lu;
avance();
}
if (lu!='(') //c'est une variable
{
//cherche la variable
Double var=vars.get(nomv);
if (var==null)
erreur=this.ERROR_UNKNOW_VAR;
else
empileF(new FonctionVar(nomv));
}else
{ //une fonction
avance();
E();
if (lu==')'){
avance();
if(lu=='!'){
avance();
empileF(new FonctionFact());
}
}
else erreur=ERROR_BAD_SYNTAX;

if (nomv.equals("sqrt")) //sqrt
empileF(new FonctionSqrt());
if (nomv.equals("sin")) //sinus
empileF(new FonctionSin());
else if (nomv.equals("cos")) //cos
empileF(new FonctionCos());
else if (nomv.equals("tan")) //tan
empileF(new FonctionTan());
else if (nomv.equals("asin")) //arc sin
empileF(new FonctionASin());
else if (nomv.equals("acos")) //arc cos
empileF(new FonctionACos());
else if (nomv.equals("atan")) //arc tan
empileF(new FonctionATan());
else
erreur=this.ERROR_UNKNOW_FUNCTION;
}
}
else if (lu=='(')
{
avance();
E();
if (lu==')'){
avance();
if(lu=='!'){
avance();
empileF(new FonctionFact());
}
}
else erreur=ERROR_BAD_SYNTAX;
}else erreur=ERROR_BAD_SYNTAX;
}

Il faut bien sûr avoir crée les fonctions adéquates pour arc (cos, sin...)
Voilà un évaluateur permettant d'analyser toute expression qui puisse contenir une fonction scientifique
En espérant avoir aidé quelqu'un...
agent24 Messages postés 5 Date d'inscription samedi 20 octobre 2012 Statut Membre Dernière intervention 1 juin 2013
17 mars 2013 à 18:01
Slt tout le monde
J'ai voulu intégrer la fonction factorielle à ce code pour l'améliorer mais disons que c'est plus compliqué que ça : voilà comment j'ai voulu procéder en modifiant légèrement la fonction F() :

private void F()
{
if (erreur!=ERROR_NO) return;
if (lu>='0' && lu<='9')
{
double valeur=0;
while(lu>='0' && lu<='9') //lit une valeur numérique
{
valeur=valeur*10+(lu-'0');
avance();
}
if (lu=='.') //reel
{
avance();
double av=0.1;
while(lu>='0' && lu<='9') //lit une valeur numérique
{
valeur=valeur+(lu-'0')*av;
av=av*0.1;
avance();
}
}
else if(lu=='!'){
empileF(new FonctionFact());
}
empileF(new FonctionCst(valeur));
}else if ((lu>='a' && lu<='z') || (lu>='A' && lu<='Z')) //une variable
{
String nomv=""+lu;
avance();
while((lu>='a' && lu<='z') || (lu>='A' && lu<='Z') || (lu>='0' && lu<='9'))
{
nomv=nomv+lu;
avance();
}
if (lu!='(') //c'est une variable
{
//cherche la variable
Double var=vars.get(nomv);
if (var==null)
erreur=this.ERROR_UNKNOW_VAR;
else
empileF(new FonctionVar(nomv));
}else
{ //une fonction
avance();
E();
if (lu==')')
avance();
else erreur=ERROR_BAD_SYNTAX;

if (nomv.equals("sqrt")) //sqrt
empileF(new FonctionSqrt());
if (nomv.equals("sin")) //sinus
empileF(new FonctionSin());
else if (nomv.equals("cos")) //cos
empileF(new FonctionCos());
else if (nomv.equals("tan")) //tan
empileF(new FonctionTan());
else if (nomv.equals("asin")) //arc sin
empileF(new FonctionASin());
else if (nomv.equals("acos")) //arc cos
empileF(new FonctionACos());
else if (nomv.equals("atan")) //arc tan
empileF(new FonctionATan());
else
erreur=this.ERROR_UNKNOW_FUNCTION;
}
}
else if (lu=='(')
{
avance();
E();
if (lu==')')
avance();
else erreur=ERROR_BAD_SYNTAX;
}else erreur=ERROR_BAD_SYNTAX;
}

j'ai bien créer les classes correspondantes mais j'ai toujours erreur ! lors ce que je veux faire par exemple : 3!

Voilà si quelqu'un pourrait m'aider alors merci

A24
agent24 Messages postés 5 Date d'inscription samedi 20 octobre 2012 Statut Membre Dernière intervention 1 juin 2013
13 mars 2013 à 17:05
Super!!!
Je cherchais justement ça pour mon projet!
Merci beaucoup, ça va beaucoup m'aider!
DJSmally Messages postés 1 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 27 mars 2012
27 mars 2012 à 18:29
Genial ! En moins d'une demi heure j'ai pu l'adapter à ma classe Complexe qui gère des complexes de la forme (a/b)+(c/d)*i
manouwett Messages postés 1 Date d'inscription mardi 23 mars 2010 Statut Membre Dernière intervention 23 mars 2010
23 mars 2010 à 19:46
c bi1 vue ke j'ai bcp de prblem ds la thorie de langage'compilation'
merciiiiiiii
boudjaoui19 Messages postés 9 Date d'inscription jeudi 6 mars 2008 Statut Membre Dernière intervention 19 septembre 2011 4
13 mai 2009 à 01:58
lol thank's
shomron Messages postés 30 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 30 juin 2010
2 févr. 2009 à 17:23
oups erreur !! desole
shomron Messages postés 30 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 30 juin 2010
2 févr. 2009 à 17:22
salut
le code est super vraiment mais ya un truc qui va pas
par exemple 3-2+3 donne 4 alors que c pas vrai !
jai deja depose une question de ce genr sur une autre source
et jai propose de fair 3+(-2)+3 au nivo de lalgo
c comme ca que ca dois se passer?
merci
missrosa Messages postés 1 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 18 mars 2008
18 mars 2008 à 12:34
bravo pour votre tolerance et votre simplicité basé sur la métrise des notions informatique
chapeau!!
o00zeus00o Messages postés 17 Date d'inscription vendredi 15 mars 2002 Statut Membre Dernière intervention 31 octobre 2007
31 oct. 2007 à 15:10
Très bon ! Utile et basé sur des connaissances serieuses en info, pro quoi ! Merci ^^
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
15 sept. 2006 à 18:04
yep moi j'ai vite arreté lol
je n'ai pas le niveau mathematiques :s
amateur_java Messages postés 32 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 6 août 2020
15 sept. 2006 à 15:27
exellent ca je pourrais l'utiliser pour mes devoirs de maths
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
2 sept. 2006 à 12:52
pas mal comme source
je pense qu'elle va pas mal me servir pour essayer de faire un mini interpreteur de script

mais bon ce n'est pas facil tout ca lol

allez encore une bonne source ;)

++
Rejoignez-nous