Probleme de lecture

Résolu
Bonjour,

Le programme ne lit pas le nombre à convertir et saute directement sur la base finale . ( Voir mes commentaires ).

/**
 * Ce programme convertit un nombre lu au clavier d'une base en une autre toutes deux entrées au clavier
 */
package test;

import java.util.Scanner;

public class Test {
    static String val = "0123456789ABCDEF";
    static int decimal;
    static Scanner sc = new Scanner(System.in);

    public static void main(String argv[]) {
        affiche();
    }

    public static void affiche() {
        // Cette méthode affiche le nombre converti
        int bInit, bFinal;
        String nombre = new String();
        bInit = lectureBase();
        // Lecture de la base d'entrée
        nombre = lectureNombre(bInit);
        // Lecture du nombre à convertir
        bFinal = lectureBase();
        // Lecture de la base de sortie
        toDecimal(nombre, bInit);
        // Conersion en base décimale
        System.out.println("(" + nombre + ")base" + bInit + " donne (" + toBase(bFinal) + ") en base" + bFinal);
    }

    public static StringBuilder toBase(int bFinal) {
        // Cette méthode convertit du décimal en une base quelconque
        StringBuilder valeur = new StringBuilder();
        do {
            valeur.append(val.charAt(decimal % bFinal));
            decimal /= bFinal;
        } while (decimal != 0);
        return valeur.reverse();
    }

    public static void toDecimal(String p, int base) {
        /* Cette méthode convertit en décimal */
        int i = 1;
        decimal = val.indexOf(p.charAt(0));
        while (i < p.length())
            decimal = decimal * base + val.indexOf(p.charAt(i++));
    }

    public static boolean control(String nbre, int base) {
        // Cette méthode vérifie qu'un nombre est écrit dans une base
        int i = 0;
        boolean faux = true;
        while (i < nbre.length())
            if (base <= val.indexOf(nbre.charAt(i++))) {
                faux = false;
                break;
            }
        return faux;
    }

    public static int lectureBase() {
        // Cette méthode permet de lire une base
        int base;
        boolean faux = false;
        do {
            if (faux)
                System.out.println("Veuillez entrer une base valide !!");
            System.out.println("Entrer la base initiale");
            base = sc.nextInt();
            faux = (base > 16 || base < 2);
        } while (faux);
        return base;
    }

    public static String lectureNombre(int base) {
        // Cette méthode permet de lire le nombre à convertir
        String nbre = new String();
        boolean faux = true;
        do {
            if (!faux)
                System.out.println("Veuillez entrer une donnée valide !!");
            System.out.println("Entrer la valeur");
            nbre = sc.nextLine();
            faux = nbre.matches("[0-9A-Z]+");
            if (!faux)
                continue;
            if (faux = !control(nbre, base))
                System.out.println(nbre + " ne peut être en base " + base);
        } while (faux);
        return nbre;
    }
}

2 réponses

  1. Bonjour anaurel,

    Peux-tu commencer par mettre ton code entre les balises code ?
    1. Modérateur
      Je l'ai réédité la question, il faut plutôt utiliser les balises <code java></code> que <code></code> car cela permet d'avoir la coloration syntaxique Java et ça évite le bug d'interprétation des astérisques comme étant des puces (ce qui casse toute la mise en forme)
    2. Le problème est déjà réglé

      En fait dans la méthode LectureBase , j'ai oublié de vider le flux d'entrée.

      il faut juste un sc.nextLine() avant le return.
    3. @KXmerci beaucoup
  2.  /**
     * Ce programme convertit un nombre lu au clavier d'une base en une autre toutes deux entrées au clavier
     * Author : Anatole Aurel HAGBE 
     * Date: 22 June 2017
     */
    package test;
    
     import java.util.Scanner;
     
     
     public class Test
     {
    	static String val= "0123456789ABCDEF"; 
            static int decimal;
            static Scanner sc = new Scanner(System.in);
            
    	
           public static void main(String argv[])
    
    	 {
    		 affiche(); 
    	 }
    	 
    	 
    	 public static void affiche()
    	 
    	 {       
                 // Cette méthode affiche le nombre converti 
                 
                    int bInit,bFinal;
                    String nombre=new String();                     
                    
                    bInit=lectureBase("d'entrée");            // Lecture de la base d'entrée
                    
                    nombre=lectureNombre(bInit);    // Lecture du nombre à convertir
                    
                    bFinal=lectureBase("de sortie");           // Lecture de la base de sortie
                    
                    toDecimal(nombre,bInit);        // Conersion en base décimale
                    
                    System.out.println("("+ nombre +")base"+bInit +" donne ("+toBase(bFinal)+") en base" +bFinal );
                		 
    	  }	 
            
             
    	 public static StringBuilder toBase(int bFinal)
    	 {                                              
                 // Cette méthode convertit du décimal en une base quelconque 
                 
                      StringBuilder valeur=new StringBuilder();
    						 			 
    			 do
    			 {
                                    valeur.append(val.charAt(decimal % bFinal));
    				 decimal/=bFinal;
    				 
    			 } while(decimal!=0);
    			 
    			return  valeur.reverse();			
                            
    	 } 
             
             
             public static void toDecimal(String p,int base)
             {
                  /*Cette méthode convertit en décimal */
                 
                 int i=1;
                 
                  decimal=val.indexOf(p.charAt(0));
                   
                while(i<p.length())
                     decimal=decimal*base + val.indexOf(p.charAt(i++));
                    
             }
             
             public static boolean control(String nbre,int base)
             {
                 // Cette méthode vérifie qu'un nombre est écrit dans une base 
                 
                 int i=0;
                 boolean faux= true;
                 
                 while(i< nbre.length())
                     if(base <= val.indexOf(nbre.charAt(i++)))
                     {
                         faux=false;
                         break;
                     }
                 
                 return faux;
             }
             
            public static int lectureBase(String chaine)
            {
             // Cette méthode permet de lire une base
                
             int base;
             boolean faux=false;
             
                 do
                    {
                        if(faux)
               
                 System.out.println("Veuillez entrer une base valide !!");
                        
                        System.out.println("Entrer la base "+ chaine);
                        base=sc.nextInt();
                        
                        faux=(base >16 || base <2);
                        
                    } while(faux);
                 
                  sc.nextLine(); // Vider le flux de lecture
                  
                return base;
            }
    
            
            public static  String lectureNombre(int base)
            {
               // Cette méthode permet de lire le nombre à convertir
                          
                String nbre=new String();
                boolean faux=true;
                
                 do
                    {
                        if(!faux)
                            System.out.println("Veuillez entrer une donnée valide !!");
                        
                        System.out.println("Entrer la valeur");
                        nbre=sc.nextLine();
                        
                        faux= nbre.matches("[0-9A-Z]+");
                         
                        if(!faux)
                            continue;
                        
                        if(faux=!control(nbre,base))
                                System.out.println(nbre +" ne peut être en base "+base);                                                
                        
                    }while(faux);
                 
                return nbre;
            }
            
     }