Bloqué!!

tomi45 Messages postés 13 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 avril 2008 - 27 mars 2008 à 22:39
 extraman1 - 4 avril 2008 à 21:41
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

Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
27 mars 2008 à 23:02
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.
0
Utilisateur anonyme
28 mars 2008 à 06:59
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
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
28 mars 2008 à 07:14
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
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
28 mars 2008 à 07:35
Quand tu exécute la ligne 59, op a la valeur null:
if (!(estprioritaire(op,i))) {
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
28 mars 2008 à 09:47
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"
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
28 mars 2008 à 10:06
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))) {
0
tomi45 Messages postés 13 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 avril 2008
28 mars 2008 à 14:13
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 ; }
  
       }

}
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
28 mars 2008 à 16:17
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? ... ... ...
0
tomi45 Messages postés 13 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 avril 2008
28 mars 2008 à 16:27
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;

}
}   
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
28 mars 2008 à 16:33
public class Maillon {

    String info;
    Maillon suivant;

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

    @Override
    public String toString() {
        return info;
    }
}
0
tomi45 Messages postés 13 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 avril 2008
28 mars 2008 à 16:38
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.
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
28 mars 2008 à 17:02
"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.
0
tomi45 Messages postés 13 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 avril 2008
28 mars 2008 à 18:02
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;  }

  }

}
0
tomi45 Messages postés 13 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 avril 2008
29 mars 2008 à 11:36
Alors tout le monde dort ?J'ai beau chercher je ne vois pas du tout ou ce trouve l'erreur!
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
29 mars 2008 à 11:42
Aujourd'hui je n'ai pas envie de travailler
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
29 mars 2008 à 20:56
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 );
}
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
29 mars 2008 à 21:42
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.
0
tomi45 Messages postés 13 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 avril 2008
30 mars 2008 à 18:18
Vraiment merci beaucoup pour votre aide!
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
31 mars 2008 à 13:23
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"
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
31 mars 2008 à 14:35
Pour ceux qui veulent faire des recherches: il ne faut pas chercher tannenbaum, mais tanenbaum
0
Rejoignez-nous