Évaluateur d'expressions

Contenu du snippet

voilà un petit évaluateur d'expression qui prend en compte que les opérateurs +-/*, on peut également utiliser des parenthèses et des chffres à virgule.

Source / Exemple :


public class calcul {
  String chaine;
  double resultat;
  int erreur,i;
  String txtErr;

  public calcul() {
  }

  public calcul(String s){
  chaine = s+";";
  resultat = expression();
      if(chaine.length()-1 != i){
      erreur = 10;
      txtErr = "La chaine ne se termine pas correctement";
      }
  }

  public void evaluer(){
  }

  private double expression(){
  double n = terme();

  double x = 0;
  while (chaine.charAt(i) =='+' || chaine.charAt(i) == '-'){
    if (chaine.charAt(i)=='+'){
        i++;
        n += terme();
      }
    else if(chaine.charAt(i)=='-'){
        i++;
        n -= terme();
    }

  }
    return n;
  }

  private double terme(){
  double n = operande();
  double n2 =0;

  double x = 0;
  while (chaine.charAt(i) =='*' || chaine.charAt(i) == '/'){
    if (chaine.charAt(i)=='*'){
        i++;
        n *= operande();
      }
    if(chaine.charAt(i)=='/'){
        i++;
        n2 = operande();
          if (n2==0){
            erreur = 3;
            txtErr = "Division par 0";
          }
        n /= n2;
    }

  }

  return n;
  }

  private double operande(){
    double n=0;

    if (chaine.charAt(i) != '('){

      n =nombre();

    }
      else
      {
      i++;
      n = expression();

        if (chaine.charAt(i)!=')')
          {
          erreur = 2;
          txtErr = "Il manque une paranthèse fermante:";
          }
    i++;
    }
    return n;
  }
///////////////////////////////////////////////////////////
   private double nombre() {

    String AvantVirgule = chiffre();
    if( erreur == 0){
          String ApresVirgule ="";
          if ( chaine.charAt(i) =='.' )
          {
          i++;
         ApresVirgule = chiffre();

              if(chaine.charAt(i)=='.'){
              erreur =5;
              txtErr = "Expression invalide";
              }
              else
              {
              return Double.parseDouble(AvantVirgule+"."+ApresVirgule);
              }
          }
          else
          {
          return Double.parseDouble(AvantVirgule);
          }
    }

   return 0;

 }
///////////////////////////////////////////////////////////////

  private String chiffre(){

  StringBuffer s = new StringBuffer();

  if(chaine.charAt(i)>='0'&& chaine.charAt(i)<='9'){
      while(chaine.charAt(i)>='0' && chaine.charAt(i)<='9'){
        s.append(chaine.charAt(i++));
      }
  }
  else{
  erreur = 1;
  txtErr ="J'attendais un chiffre; caractère trouvé!"+chaine.substring(0,1+i)+"<--";
  }

    return s.toString();
  }

  public double GetResultat(){
  return resultat;
  }

  public int GetErreur(){
  return erreur;
  }

  public String GettxtErr(){
  return txtErr;
  }

}

Conclusion :


voilà comment l'utiliser:

calcul c = new calcul("2-4*8-(54-4.6)"); //instence de la classe
c.GetResultat(); //affichage du resultat
c.GettxtErr(); //affiche l'erreur.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.