Calculatrice d'expressions arithmétiques simple

Fermé
Bekatni Messages postés 11 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 21 avril 2011 - 20 avril 2011 à 22:39
sakoba2010 Messages postés 157 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 24 juillet 2013 - 21 avril 2011 à 17:55
salut tout le monde j'ai un petit problème !!!
Je suis entrain de faire une calculatrice d'une expression arithmétique simple en JAVA.
j'ai réussi à faire l'analyse de l'expression mais il me reste à faire les calculs.
J'ai pensé à parcourir l'expression(en String) et lorsque je trouve un opérateur '*' ou '/' ou '+' ou '-' je fais l'opération et je remplace les entiers et l'opérateur que j'ai utilisé par le résultat dans mon expression.

Problème n°1 :je dois recommencer tant qu'il y a encore des opérateurs dans mon expression. Le problème c'est que je n'arrive pas à récupérer la nouvelle expression et j'ai exactement le même problème si j'ai deux opérateurs identiques.
Je ne sait vraiment pas quoi faire et je suit réellement bloqué.

Pour que vous puissiez comprendre où j'en suis et mon déroulement, vous pouvez trouver ci-joint une partie de mon code. Bien évidement si quelqu'un à une bien meilleure idée concernant le code, soit en l'améliorant soit en le changeant, je suis bien évidement ouvert à d'autres proposition.

Dans l'espoir que quelqu'un puisse m'aider, je vous remercie d'avance de votre aide!!
[code=java]import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class calcul_expression {



public void calcul(int [] ENTIER, char [] operator,String expression){

//le tableau ENTIER contiet tous les entiers de notre expression
//le tableau operateur contient tous les operateur de notre expression
int j = 0;
int [] tmp = new int [10];
int [] tmp1 = new int [10];
int m = 0;
int n = 0 ;
int resultat = 0 ;
String res = null;

for(int i = 0;i<expression.length();i++){

if(expression.charAt(i)=='*'){

j = i ;//on cherche l'indice de l'operateur '*' dans un notre expression.
tmp[m] = j;
m++;

}
}


for(int i=0;i<operator.length;i++){

if(operator[i]=='*'){

j = i;

tmp1[n] = j;
n++;

}
resultat = ENTIER[j] * ENTIER[j+1];//je fais la multiplication
res = String.valueOf(resultat); //je fait la conversion en String

}expression = expression.substring(0,tmp[0]-1) + res;//je concatène les deux string en suppriment les elément que j'ai utiliser pour la multiplication
System.out.println("l'expression est " +expression);//on fait l'affichage

}
public static void main(String[] args) throws IOException{

String expression;
System.out.println("Entrez l'operation que vous voulez effectuer");
BufferedReader Buf = new BufferedReader(new InputStreamReader (System.in));
expression = Buf.readLine();
}
}

/code
A voir également:

3 réponses

sakoba2010 Messages postés 157 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 24 juillet 2013 15
21 avril 2011 à 17:18
Pourquoi tu n'utilise pas la classe ScriptEngine C'est très simple pour exécuter ces genre d'opération.
exemple:
String script = "print(5*10)";
engine.eval(script);

voir ça:
http://sakoba.byethost13.com/...
2
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
21 avril 2011 à 17:50
Alternative intéressante :-)

import java.util.Scanner;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Test
{
    private static final Scanner sc = new Scanner(System.in);

    private static final ScriptEngine js = 
            new ScriptEngineManager().getEngineByName("js");
    
    public static Double evaluer(String formule)
    {
        try
        {
            return (Double) js.eval(formule);
        }
        catch (ScriptException e)
        {
            e.printStackTrace();
            return Double.NaN;
        }
    }
    
    public static void main(String[] args)
    {
        System.out.print("Formule : ");
        String formule = sc.nextLine();
        Double resultat = evaluer(formule);
        System.out.println(resultat);
    }
}
0
sakoba2010 Messages postés 157 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 24 juillet 2013 15
21 avril 2011 à 17:55
@kx,
C'est plus facile avec ta proposition, on laisse le choix à l'utilisateur.
merci
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
20 avril 2011 à 23:30
Regarde le post 'calcul de la valeur en java' j'y avais expliqué une méthode.
0
Bekatni Messages postés 11 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 21 avril 2011
20 avril 2011 à 23:58
Salut,
Merci beaucoup mais j'ai essayé de faire un arbre mais je n'y suis pas arrivé car je suis un débutant en Java et je ne sait pas faire la récursivité.
Si tu pouvais me l'expliquer ou me donner un exemple je t'en serais très reconnaissant.
Merci beaucoup de ton aide.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
21 avril 2011 à 12:35
Voici un début de code pour un Arbre d'évaluation, j'ai repris le même exemple.
J'ai pris des entiers puisque c'est ce que tu veux faire apparemment...

J'ai mis les constructeurs et la fonction toString pour voir comment ça se manipule.
Le principe est toujours le même, il y a une imbrication récursive de sous-arbres dans des arbre. Quand on manipule l'arbre il faut vérifier si on a des sous-arbres (différents de null) et les traiter avant de continuer.

L'évaluation de la valeur de l'arbre est très rapide à faire, le plus dur est de passer d'une chaîne de caractères à un arbre valide, mais tu as déjà commencé à traiter cette étape.

public class Arbre
{
    private String op;
    private Arbre ag;
    private Arbre ad;

    public Arbre(Character operateur, Arbre gauche, Arbre droit)
    {
        op=operateur.toString();
        ag=gauche;
        ad=droit;
    }
    
    public Arbre(Integer operande)
    {
        op=operande.toString();
        ag=null;
        ad=null;
    }
    
    public String toString()
    {
        String s=op;
        if (ag!=null)
            s+=" "+ag.toString();
        if (ad!=null)
            s+=" "+ad.toString();
        return s;            
    }
    
    public static void main(String args[])
    {
        Arbre a = new Arbre('*',
                            new Arbre('+',
                                      new Arbre(1),
                                      new Arbre(2)),
                            new Arbre('-',
                                      new Arbre(3),
                                      new Arbre(4)));
        
        System.out.println(a); // * + 1 2 - 3 4
    }
}
0
Bekatni Messages postés 11 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 21 avril 2011
21 avril 2011 à 14:33
merci bcp ,j'ai bien compris!!!!
mais je veux bien savoir si on va prendre une expression qqe ça marche comme meme?
comment calculer sa valeur?
merci :)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
21 avril 2011 à 14:54
Pour calculer sa valeur, tu différencies plusieurs cas :

Si ton arbre est une feuille (null à gauche et à droite), op est une opérande, donc c'est un entier que tu peux évaluer avec parseInt.
Sinon (il y a des sous-arbres), op est un opérateur, donc c'est un caractère et tu peux faire un switch.
Par exemple, si l'opérateur est '+' le résultat sera l'addition de l'évaluation de l'arbre de gauche et de l'évaluation de 'arbre droit.

Pour une expression quelconque ça devrait marcher à condition de switcher tous les opérateurs que tu peux rencontrer.
0
Bekatni Messages postés 11 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 21 avril 2011
21 avril 2011 à 14:57
merci :)
je vais essayé !!!
(je suis encore débutant en java je connait pas les switchs...)
:)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
21 avril 2011 à 15:01
Avant de continuer, apprend au moins les bases du langage Java, sinon ça ne sers à rien !
Voir Langage Java et en particulier les structures conditionnelles en Java.
0
Bekatni Messages postés 11 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 21 avril 2011
21 avril 2011 à 15:03
tu peut pas me donner un exemple de création d'un d'arbre qq?
Merci :)
0