Bloqué!!

Signaler
Messages postés
13
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 avril 2008
-
 extraman1 -
bonjour , je suis actuellement en 1ere année de licence et j'ai un
projet sur lequel je suis bloqué par l'affichage suivant :Exception in
thread main java.lang.NullPointerException

at debut.estprioritaire(debut.java:247)

at debut.evaluation(debut.java:59)

at debut.main(debut.java:16)

voici mon programme:

import java.util.*;
import java.util.StringTokenizer;

public class debut  {

 public static void main (String args [])  {
     String ok=new String("oui");
      do  {
        
         TextWindow.printLine("Donner l'expression a evaluer : ") ;
        String expression=TextWindow.readString();
        StringTokenizer e=new StringTokenizer(expression);
       
        evaluation(e);
           

        TextWindow.printLine("voulez vous recommencer?");
          ok=TextWindow.readString();
      } while(ok.equals("oui"));
  
   }

public static void evaluation (StringTokenizer e) {

Pile p = new Pile();
String op = null;
String w;
String z;
int b;
int c;
int resa;
String resb;
String ope;

    while (e.hasMoreTokens()) {

    String i = e.nextToken();

        if (estunnombre(i)) {

        p.empiler(i);
       
        p.affichePile();

        }

           
        else if (estunoperateur(i)) {

            if (!(estprioritaire(op,i))) {

            while (p!=null) {

             z = p.sommet();
             b=Integer.parseInt(z);

            p.depiler();

            ope = p.sommet();

            p.depiler();

             w = p.sommet();
             c=Integer.parseInt(w);   

            p.depiler();
            resa=calculer(b,ope,c);
            resb=Integer.toString(resa);   

            p.empiler(resb);
            p.affichePile();
            
            }

            p.empiler(i);
           
            op =i ;
             p.affichePile();
           
            }

            else if(estprioritaire(op,i)) {
           
            p.empiler(i);

            p.empiler(e.nextToken());

             w = p.sommet();
                         b=Integer.parseInt(w);

            p.depiler();

           

            ope = p.sommet();

            p.depiler();
                       
             z = p.sommet();
             c=Integer.parseInt(z);

            p.depiler();
                        resa=calculer(b,ope,c);
            resb=Integer.toString(resa);
            p.empiler(resb);

            p.affichePile();
           

            while (p!=null) {
       
             z = p.sommet();
             b=Integer.parseInt(z);

            p.depiler();

            ope = p.sommet();

            p.depiler();
                         w = p.sommet();
                         c=Integer.parseInt(w);

            p.depiler();
                       
                        resa=calculer(b,ope,c);
                        resb=Integer.toString(resa);

            p.empiler(resb);

            p.affichePile();
           
                 }
           
            }

        }

    }
   }

public static boolean estsuperieur(String premier , String deuxieme)  {

   if ( (deuxieme.equals("x"))||(deuxieme.equals("/"))) {

      return true;  }

   else if ((deuxieme.equals("+"))||(deuxieme.equals("-"))) {

         if ((premier.equals("*"))||(premier.equals("/")))  {
         return false; }

         else {
         return true;  }
 
         }

   else { return false ; }
  

}

  public static boolean estunnombre(String valeur) {

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

  char c = valeur.charAt(i);
  if(c<'0' || c>'9') return false;
  }
  return true;

}

 

public static boolean estunoperateur(String x)   {

    if (x.equals("+") || x.equals("-") || x.equals("*")|| x.equals("/")) {

        return true; }

    else { return false; }

}

public static int calculer(int x, String a,int y) {
   if ( a.equals("+")) {
   return x+y ; }

   else if ( a.equals("*")) {
   return x*y ; }

   else if ( a.equals("-")) {
   return x-y ; }
 
   else if ( a.equals("/")) {
   return x/y ; }
   
   else return -1 ;
                 
  }

 public static boolean estprioritaire(String premier , String deuxieme)  {

   if ( (deuxieme.equals("x"))||(deuxieme.equals("/"))) {

      return true;  }

   else if ((deuxieme.equals("+"))||(deuxieme.equals("-"))) {

         if ((premier.equals("*"))||(premier.equals("/")))  {
         return false; }

         else {
         return true;  }
 
         }

   else { return false ; }
  
       }

}

29 réponses

Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut:

Il faut apprendre à débogguer le code.

Fais la trace de ton programme en mettant des instructions d'affichage (System.out.println, ...) dans plusieurs endroits de ton code pour savoir où l'exception est déclenchée.

L'exception NullPointerException est une exception qui se lève en temps d'exécution d'ailleurs il n'est pas nécessaire de la traiter.

Bonjour

Ombitious_Developper a raison. Dans la méthode "estprioritaire", le paramètre "deuxième" est à null, c'est ça qui doit poser problème. Le message d'erreur est pourtant assez clair.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
125
Salut,

lol ombitious : apprendre à debugguer un programme, c'est bien, le faire comme il faut, c'est mieux

Au lieu de mettre des traces un peu partout, ce qui est pratique, certes, mais constitue une perte de temps, je lui conseillerai plutôt d'utiliser un IDE digne de ce nom (du style eclipse ou netbeans), et de mettre des points d'arrêts dans son code, d'exécuter ce dernier pas à pas aux endroits où ca coince et regarder la valeurs des variables, ca c'est du vrai débogguage
______________________________________
DarK Sidious
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
10
Quand tu exécute la ligne 59, op a la valeur null:
if (!(estprioritaire(op,i))) {
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
ou alors de regarder la trace car l'explication est quand meme clair ^^

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
10
at debut.evaluation(debut.java:59) est la ligne intéressante.
Ensuite, et en regardant le code source autour, il n'y a qu'une seule conclusion possible:

Quand tu exécute la ligne 59, op a la valeur null:
if (!(estprioritaire(op,i))) {
Messages postés
13
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 avril 2008

Bonjour.Merci beaucoup a tous pour vos réponses très rapides .Je n'ai pas tout compris à ce que vous m'avez dit de faire mais j'ai compris que la variable op était initialiser a null ce qui renvoie une erreur.j'ai donc changé cette variable et un nouvel affichage me donne :

Mailllon@130c19b
Maillon@1f6a7b9
Maillon@7d772e

voici le programme:
import java.util.*;
import java.util.StringTokenizer;

public class debut  {

 public static void main (String args [])  {
     String ok=new String("oui");
      do  {
        
         TextWindow.printLine("Donner l'expression a evaluer : ") ;
        String expression=TextWindow.readString();
        StringTokenizer e=new StringTokenizer(expression);
       
        evaluation(e);
           

        TextWindow.printLine("voulez vous recommencer?");
          ok=TextWindow.readString();
      } while(ok.equals("oui"));
  
   }

public static void evaluation (StringTokenizer e) {

Pile p = new Pile();
String op=new String("initial");
String w;
String z;
int b;
int c;
int resa;
String resb;
String ope;

    while (e.hasMoreTokens()) {

    String i = e.nextToken();

        if (estunnombre(i)) {

        p.empiler(i);
       
        p.affichePile();

        }

           
        else if (estunoperateur(i)) {

            if (!(op.equals("initial"))&&!(estprioritaire(op,i))) {

            while (p!=null) {

             z = p.sommet();
             b=Integer.parseInt(z);

            p.depiler();

            ope = p.sommet();

            p.depiler();

             w = p.sommet();
             c=Integer.parseInt(w);   

            p.depiler();
            resa=calculer(b,ope,c);
            resb=Integer.toString(resa);   

            p.empiler(resb);
            p.affichePile();
            
            }

            p.empiler(i);
           
            op =i ;
             p.affichePile();
           
            }

            else if(estprioritaire(op,i)) {
           
            p.empiler(i);

            p.empiler(e.nextToken());

             w = p.sommet();
                         b=Integer.parseInt(w);

            p.depiler();

           

            ope = p.sommet();

            p.depiler();
                       
             z = p.sommet();
             c=Integer.parseInt(z);

            p.depiler();
                        resa=calculer(b,ope,c);
            resb=Integer.toString(resa);
            p.empiler(resb);

            p.affichePile();
           

            while (p!=null) {
       
             z = p.sommet();
             b=Integer.parseInt(z);

            p.depiler();

            ope = p.sommet();

            p.depiler();
                         w = p.sommet();
                         c=Integer.parseInt(w);

            p.depiler();
                       
                        resa=calculer(b,ope,c);
                        resb=Integer.toString(resa);

            p.empiler(resb);

            p.affichePile();
           
                 }
           
            }
            
        }

    }
   }

public static boolean estsuperieur(String premier , String deuxieme)  {

   if ( (deuxieme.equals("x"))||(deuxieme.equals("/"))) {

      return true;  }

   else if ((deuxieme.equals("+"))||(deuxieme.equals("-"))) {

         if ((premier.equals("*"))||(premier.equals("/")))  {
         return false; }

         else {
         return true;  }
 
         }

   else { return false ; }
  

}

  public static boolean estunnombre(String valeur) {

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

  char c = valeur.charAt(i);
  if(c<'0' || c>'9') return false;
  }
  return true;

}

 

public static boolean estunoperateur(String x)   {

    if (x.equals("+") || x.equals("-") || x.equals("*")|| x.equals("/")) {

        return true; }

    else { return false; }

}

public static int calculer(int x, String a,int y) {
   if ( a.equals("+")) {
   return x+y ; }

   else if ( a.equals("*")) {
   return x*y ; }

   else if ( a.equals("-")) {
   return x-y ; }
 
   else if ( a.equals("/")) {
   return x/y ; }
   
   else return -1 ;
                 
  }

 public static boolean estprioritaire(String premier , String deuxieme)  {

   if ( (deuxieme.equals("x"))||(deuxieme.equals("/"))) {

      return true;  }

   else { return false ; }
  
       }

}
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
10
Que viennent faire les deux classes Mailllon et Maillon le dedans? Que font ces deux classes? Où sont'elles définies? Pourquoi tu n'envois pas le code source intégralement? Quelle sont les données que tu entre à la Console? ... ... ...
Messages postés
13
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 avril 2008

J'utilise la classe pile qui a besoin de la classe maillon

public class Pile {
    Maillon sommet;
    public Pile() {
        sommet= null;
    }
    public Pile empiler (String e){
        sommet=new Maillon (sommet,e);
        return this;
    }
    public Pile depiler() {
        sommet=sommet.suivant;
        return this;
    }
    public String sommet () {
        return this.sommet.info;
    }
    public void affichePile() {
        TextWindow.printLine(sommet.toString());
    }

        public boolean pileVide()  {
                return sommet==null;    }

}

public class Maillon {

    String info;

    Maillon suivant;

    public Maillon (Maillon s, String x) {

    info=x;

    suivant=s;

}
}   
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
10
public class Maillon {

    String info;
    Maillon suivant;

    public Maillon(Maillon s, String x) {
        info = x;
        suivant = s;
    }

    @Override
    public String toString() {
        return info;
    }
}
Messages postés
13
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 avril 2008

Merci cela fonctionne même si ce n'est pas l'affichage que je voudrai.ça doit provenir d'une erreur dans mon programme que je vais essayer de trouver.Mais que veut dire la commande que vous avez ajouté dans la classe maillon parce que je ne la connait pas.
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
10
"toString" veut dire "vers chaine". C'est la méthode que tu appelle ici:
public void affichePile() {
    TextWindow.printLine(sommet.toString());
}

Par défaut, elle renvoie ceci:
getClass().getName() + "@" + Integer.toHexString(hashCode())

Pour avoir un résultat plus parlant, il faut la redéfinir pour chaque classe.
Messages postés
13
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 avril 2008

J'ai donc recommencé le programme pour qu'il corresponde a mon projet  mais l'erreur java.lang.NullException revient alors que op n'est pas initialisé a nul.
Je vous donne mon programme :

import java.util.*;
import java.util.StringTokenizer;

public class debut2  {

 public static void main (String args [])  {
     String ok=new String("oui");
      do  {
        
         TextWindow.printLine("Donner l'expression a evaluer : ") ;
        String expression=TextWindow.readString();
        StringTokenizer e=new StringTokenizer(expression);
       
        evaluation(e);
           

        TextWindow.printLine("voulez vous recommencer?");
          ok=TextWindow.readString();
      } while(ok.equals("oui"));
  
   }

public static void evaluation (StringTokenizer e) {

Pile p = new Pile();
String op=new String("+");
String w;
String z;
int b;
int c;
int resa;
String resb;
String ope;

    while (e.hasMoreTokens()) {

    String i = e.nextToken();

        if (estunnombre(i)) {

        p.empiler(i);
       
       
            
        }

           
        else if (estunoperateur(i)) {

            if (estprioritaire(op,i)) {
           
           

            p.empiler(e.nextToken());

            w = p.sommet();
                        b=Integer.parseInt(w);

            p.depiler();
            ope = p.sommet();

            p.depiler();
            z = p.sommet();
            c=Integer.parseInt(z);

            p.depiler();
                        resa=calculer(b,ope,c);
            resb=Integer.toString(resa);
            p.empiler(resb);

                     }       /* fin de si estprioritaire */
           

            else {   

                            if (!(resteexpression(p)))  {       
                                   p.empiler(i);       }   /* fin !resteexpression */

                               
                else {
                                  

                                w = p.sommet();
                                b=Integer.parseInt(w);

                    p.depiler();
                    ope = p.sommet();

                    p.depiler();
                    z = p.sommet();
                    c=Integer.parseInt(z);
                                p.depiler();
                                resa=calculer(b,ope,c);
                    resb=Integer.toString(resa);
                    p.empiler(resb);

           
                        } /* fin de else */

                              op=i;

                            
                              }  /* fin de else */

           }   /* fin de else if */

 

     }  /* fin de while */

  if (resteexpression(p))  {

                            w = p.sommet();
                                b=Integer.parseInt(w);

                    p.depiler();
                    ope = p.sommet();

                    p.depiler();
                    z = p.sommet();
                    c=Integer.parseInt(z);
                                p.depiler();
                                resa=calculer(b,ope,c);
                    resb=Integer.toString(resa);
                    p.empiler(resb);

   
        }  /* fin de if */

}  /* fin de evaluation */

public static boolean estsuperieur(String premier , String deuxieme)  {

   if ( (deuxieme.equals("x"))||(deuxieme.equals("/"))) {

      return true;  }

   else if ((deuxieme.equals("+"))||(deuxieme.equals("-"))) {

         if ((premier.equals("*"))||(premier.equals("/")))  {
         return false; }

         else {
         return true;  }
 
         }

   else { return false ; }
  

}

  public static boolean estunnombre(String valeur) {

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

  char c = valeur.charAt(i);
  if(c<'0' || c>'9') return false;
  }
  return true;

}

 

public static boolean estunoperateur(String x)   {

    if (x.equals("+") || x.equals("-") || x.equals("*")|| x.equals("/")) {

        return true; }

    else { return false; }

}

public static int calculer(int x, String a,int y) {
   if ( a.equals("+")) {
   return x+y ; }

   else if ( a.equals("*")) {
   return x*y ; }

   else if ( a.equals("-")) {
   return x-y ; }
 
   else if ( a.equals("/")) {
   return x/y ; }
   
   else return -1 ;
                 
  }

 public static boolean estprioritaire(String premier , String deuxieme)  {

   if ( (deuxieme.equals("x"))||(deuxieme.equals("/"))) {

      return true;  }

   else { return false ; }
  
       }

public static boolean resteexpression(Pile q)  {

   String a=q.sommet();
   q.depiler();
 
 if (q.pileVide())  {

   q.empiler(a);

return false;   }

   else {
q.empiler(a);

return true;  }

  }

}
Messages postés
13
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 avril 2008

Alors tout le monde dort ?J'ai beau chercher je ne vois pas du tout ou ce trouve l'erreur!
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
10
Aujourd'hui je n'ai pas envie de travailler
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
10
package demo;
import java.util.*;
public class debut3{   
    private static final Object OPEN = Character.valueOf( '(' );
    private static final Object CLOSE = Character.valueOf( ')' );
    private static final Object SEPARATOR = Character.valueOf( ',' );
    private Map<String, Operation> operations = new HashMap<String, Operation>();
    private Map<String, Function> functions = new HashMap<String, Function>();
    private Map<String, Double> constants = new HashMap<String, Double>();
    public debut3(){
        addOperation( "+", new Operation(){
            public int getPriority() {
                return 1;
            }
            public double calculate( double a, double b ) {
                return a+b;
            }
        });
        addFunction( "+", new Function(){
            public double calculate( double[] values ) {
                return values[0];
            }
            public boolean validNrOfArguments( int count ) {
                return count == 1;
            }
        });
        addOperation( "-", new Operation(){
            public int getPriority() {
                return 1;
            }
            public double calculate( double a, double b ) {
                return a-b;
            }
        });
        addFunction( "-", new Function(){
            public double calculate( double[] values ) {
                return -values[0];
            }
            public boolean validNrOfArguments( int count ) {
                return count == 1;
            }
        });
        addOperation( "*", new Operation(){
            public int getPriority() {
                return 2;
            }
            public double calculate( double a, double b ) {
                return a*b;
            }
        });
        addOperation( "/", new Operation(){
            public int getPriority() {
                return 2;
            }
            public double calculate( double a, double b ) {
                return a/b;
            }
        });
        addFunction( "sqrt", new Function(){
            public double calculate( double[] values ) {
                return Math.sqrt( values[0] );
            }
            public boolean validNrOfArguments( int count ) {
                return count == 1;
            }
        });
        addFunction( "min", new Function(){
            public double calculate( double[] values ) {
                return Math.min( values[0], values[1] );
            }
            public boolean validNrOfArguments( int count ) {
                return count == 2;
            }
        });
        constants.put( "e", Math.E );
        constants.put( "pi", Math.PI );
    }
    void addOperation( String name, Operation operation ){
        operations.put( name, operation );
    }
    void addFunction( String name, Function function ){
        functions.put( name, function );
    }
    public double parse( String formula ){
        List<Object> tokens = tokenize( formula );
        int count = 0;
        for( Object token : tokens ){
            if( token == OPEN )
                count++;
            if( token == CLOSE )
                count--;
            if( count < 0 )
                throw new IllegalArgumentException( "parenthèse fermante sans ouvrante" );            if( token SEPARATOR && count 0 )
                throw new IllegalArgumentException( "virgule hors parenthèses" );
        }
        if( count > 0 )
            throw new IllegalArgumentException( "parenthèse fermante manque" );

        if( count < 0 )
            throw new IllegalArgumentException( "parenthèse fermante de trop" );        for( int i 0, n tokens.size(); i<n; i++ ){
            Object replacement = constants.get( tokens.get( i ) );
            if( replacement != null ){
                tokens.set( i, replacement );
            }
        }
        int size = tokens.size();
        while( size > 1 ){
            parse( tokens, 0 );
            if( tokens.size() >= size ){
                throw new IllegalArgumentException(
                "La formule est incomplète" );
            }
            size = tokens.size();
        }
        if( size != 1 || !(tokens.get( 0 ) instanceof Double))
            throw new IllegalArgumentException( "Erreur formule" );
        return (Double)tokens.get( 0 );
    }
    private void parse( List<Object> formula, int offset ){               boolean open formula.get( offset ) OPEN;
        if( open ){
            formula.remove( offset );
        }
        int begin = offset;
        int length = 0;
        boolean done = false;
        while( begin+length < formula.size() ){
            Object end = formula.get( begin+length );
            if( end == OPEN ){
                parse( formula, begin+length );
            }            else if( end CLOSE || end SEPARATOR ){
                if( length == 0 )
                    throw new IllegalArgumentException( "expressions manquent, p.ex. parenthèse vide" );
                parse( formula, begin, length );
                formula.remove( begin+1 );
                begin++;
                length = 0;
                if( end == CLOSE ){
                    done = true;
                    break;
                }
            }
            else
                length++;
        }
        if( !done && begin+length == formula.size() ){
            parse( formula, begin, length );
            begin++;
            length = 0;
        }
        if( offset+1 != begin ){
            double[] value = new double[ begin-offset ];
            for( int i = begin-1; i >= offset; i-- ){
                value[i-offset] = (Double)formula.remove( i );
                begin--;
            }
            formula.add( offset, value );
        }
    }
    private void parse( List<Object> formula, int offset, int length ){
        for( int i = offset+length-2; i >= offset; i-- ){
            Function function = functions.get( formula.get( i ) );
            if( function != null ){
                if( i == offset || !(formula.get( i-1 ) instanceof Double )){
                    Object arguments = formula.get( i+1 );
                    double[] values = null;
                    if( arguments instanceof Double ){
                        values = new double[]{ (Double)arguments };
                    }
                    else if( arguments instanceof double[] ){
                        values = (double[])arguments;
                    }
                    else{
                        throw new IllegalArgumentException( "arguments manquent pour " + function +
                           ", trouvé: " + arguments );
                    }
                    if( !function.validNrOfArguments( values.length ))
                        throw new IllegalArgumentException( "nombre d'arguments faux pour " + function +
                           ", trouvé: " + values.length );
                    formula.remove( i+1 );
                    formula.set( i, function.calculate( values ) );
                    length--;
                }
            }
        }
        for( int i = offset; i < offset+length; i++ ){
            Object check = formula.get( i );
            if( check instanceof String ){
                Operation operation = operations.get( check );
                if( operation == null ){
                    throw new IllegalArgumentException( "Element " + check +
                       " est utilisé comme operation, mais une operation de ce nom n'existe pas." );
                }
                formula.set( i, operation );
            }
        }
        while( length > 1 ){
            int current = length;
            int priority = Integer.MIN_VALUE;
            for( int i = offset; i < offset+length; i++ ){
                Object check = formula.get( i );
                if( check instanceof Operation ){
                    priority = Math.max( priority, ((Operation)check).getPriority() );
                }
            }
            for( int i = offset+1; i < offset+length-1; i++ ){
                Object check = formula.get( i );
                if( check instanceof Operation ){
                    Operation operation = (Operation)check;
                    if( operation.getPriority() == priority ){
                        Object left = formula.get( i-1 );
                        Object right = formula.get( i+1 );
                       
                        if( !(left instanceof Double ))
                            throw new IllegalArgumentException( "Operation pas entourée de chiffres" );
                        if( !(right instanceof Double ))
                            throw new IllegalArgumentException( "Operation pas entourée de chiffres" );
                        formula.set( i, operation.calculate( (Double)left, (Double)right ) );
                        formula.remove( i+1 );
                        formula.remove( i-1 );
                        i--;
                        length -= 2;
                    }
                }
            }
            if( length == current ){
                throw new IllegalArgumentException( "Formule pas resolvable" );
            }
        }
    }

    private List<Object> tokenize( String formula ){
        int offset = 0;
        int length = formula.length();
        List<Object> parts = new ArrayList<Object>();
        Set<String> texts = new HashSet<String>();
        texts.addAll( constants.keySet() );
        texts.addAll( operations.keySet() );
        texts.addAll( functions.keySet() );
        while( offset < length ){
            char current = formula.charAt( offset );
            if( !Character.isWhitespace( current )){
                if( current == '(' ){
                    parts.add( OPEN );
                    offset++;
                }
                else if( current == ')' ){
                    parts.add( CLOSE );
                    offset++;
                }
                else if( current == ',' ){
                    parts.add( SEPARATOR );
                    offset++;
                }
                else if( Character.isDigit( current ) || current == '.' ){
                    int end = offset+1;                    boolean pointSeen current '.';
                    while( end < length ){
                        char next = formula.charAt( end );
                        if( Character.isDigit( next ))
                            end++;
                        else if( next == '.' && !pointSeen ){
                            pointSeen = true;
                            end++;
                        }
                        else
                            break;
                    }
                    parts.add( Double.parseDouble( formula.substring( offset, end ) ) );
                    offset = end;
                }
                else{
                    int bestLength = 0;
                    String best = null;
                    for( String check : texts ){
                        if( formula.startsWith( check, offset )){
                            if( check.length() > bestLength ){
                                bestLength = check.length();
                                best = check;
                            }
                        }
                    }
                    if( best == null )
                        throw new IllegalArgumentException( "Cette formule n'a pas l'air correct" );
                    offset += bestLength;
                    parts.add( best );
                }
            }
            else
                offset++;
        }
        return parts;
    }
     public static void main( String[] args ) throws Exception{
      String[] tests = new String[]{
              "1+1",
              "2+4*5",
              "(2+4)*5",
              "e",
              "(((5)))",
              "1 +-+-+ .25",
              "min( 1, 3 )",
              "sqrt 9/3",
              "sqrt (9/3)",
              "sqrt16" };
      debut3 parser = new debut3();
      for( String test : tests )
         System.out.printf( ""%s" = "%f"\n", test, parser.parse( test ) );
   }
}
interface Operation{
   public int getPriority();
   public double calculate( double a, double b );
}
interface Function {
    public boolean validNrOfArguments( int count );
    public double calculate( double[] values );
}
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
10
Pour la construction d'un "Parser", on devrait tenir compte de ce qui suit :
* L'abstraction est très importante. Si on n'insère pas directement "+" et co dans le code mais les traite comme objets, on peut simplifier le tout.
* Compréhension de la récursion. Car avec une récursion on peut calculer très facilement des parenthèses comme "(5+4)*3" .

Le "Parser" de mon message précédent travaille comme suit :
* Enferme la formule avec deux parenthèses. (Ces parenthèses ne doivent pas exister vraiment. Nous  faisons simplement comme si elles étaient là. L'importance de la formule ne change pas, si on convertit un "x" en "(x)", l'algorithme devient toutefois plus simple).
* Recherche à partir de gauche le premier signe de parenthèse "(" ou")".
- Si tu trouve une parenthèse ouvrante, appel toi-même. Dit-toi aussi qu'une partie de la formule a été examinée déjà, et que tu ne dois plus chercher à partir du début, mais à partir de la parenthèse ouvrante trouvée.
- Si tu trouve une parenthèse fermante: découpe la partie de la formule depuis la dernière parenthèse ouvrante jusqu'à la parenthèse fermante trouvée. Aucune autre parenthèse ne se trouve dans cette partie,  cette partie peut maintenant être convertie en valeur:
+ Parcours la formule partielle de gauche vers la droite. Cherche l'opération qui a la priorité la plus élevée,  si plusieurs opérations devraient avoir la même priorité, alors celle choisis celle que tu as trouvé d'abord.
+ Calcule l'opération. Supprime les arguments et l'opération elle-même de la formule, et écrit  le résultat dans la formule. Exemple : on remplace "1+2" par "3".
+ Si encore d'autres opérations devraient se trouver dans cette partie de la formule, alors commence avec un autre parcours de la boucle.
+ Autrement supprime la parenthèse ouvrante et la parenthèse fermante avant et derrière cette formule partielle . Exemple : "(123)" devient "123".
* Quand la formule a été réduite pas à pas, ne se compose maintenant plus que du résultat.
Messages postés
13
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 avril 2008

Vraiment merci beaucoup pour votre aide!
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
pour les parseurs une technique simple est celle d'utiliser le tableau de tannenbaum et la notation polonaise inverse :


http://www.spsu.edu/cs/faculty/bbrown/web_lectures/postfix/

http://fr.wikipedia.org/wiki/Notation_polonaise_inverse


il suffit d'adapter une peu le tableau pour effectuer les operation et les repusher dans la pile


par contre le tableau gere pas de base les - unaire et les modulo

pour les modulo c'est simple suffit d'ajouter une ligne et une colone
dans le tableau qui suis les propriete de la multiplication ou de la
division


je mettrais bien des sources mais c'est des sources en C et faite avec mon binome ^^

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
10
Pour ceux qui veulent faire des recherches: il ne faut pas chercher tannenbaum, mais tanenbaum