Qunand est ce qu'il faut vider le buffer (Memoire tampon)

anaurel Messages postés 37 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

je ne sais quand il faut vider le buffer

J'ai écris un code qui saute des intructions lors de l'execution

/**
 * Addition,Multiplication,Division entière et Modulo en base quelconque
 */

package Algebre;
import java.util.Scanner;
public class Operations 
{
 static Scanner sc=new Scanner(System.in);
 static String val="0123456789ABCDEF";
 static int base;
 
 public static void main(String args[])
 {
     afficher();
 }
 
  public static void afficher()
 {
     String n1,n2;
     StringBuilder resultat;
     int operation;
     char op[]={'+','*','/','%'};
     
     readBase(); // choix de la base
     
     n1=readValue("premier");
     operation=operation();
     n2=readValue("deuxieme");
     
     resultat=calcul(toTen(n1),toTen(n2),operation);
     
     System.out.println(n1+" "+op[operation-1]+" "+n2+" = "+ resultat);
     
     sc.close();
 }
 
  public static StringBuilder toBase(int n)
 {
     StringBuilder  result=new StringBuilder();
     do
     {
         result.append(n%base);
         n/=base;        
     }while(n!=0);
     
     return result.reverse();
 }
  
 public static int toTen(String chaine)
 {
     int valeur,i=1;
     valeur=val.indexOf(chaine.charAt(0));
     
     while(i<chaine.length())
         valeur+=base*valeur+val.indexOf(chaine.charAt(i++));
         
    return valeur;
 }
 
 public static boolean checkValue(String valeur)
 {
     int i=0;
     String message;
     message=valeur+"ne peut être en base "+base;
     
     if(!valeur.matches("[0-9A-Z]+"))
     {
         System.out.println(message);
         return false;
     }
     while(i<valeur.length())
         if(val.indexOf(valeur.charAt(i))>=base)
            {
                System.out.println(message);
                return false;
            }
     return true;
 }
 
 
 public static void readBase()
 {    
     boolean faux=false;
    do
    {
        if(faux)
            System.out.println("Choisir une base valide");
        System.out.println("Préciser la base");
        base=sc.nextInt();
    } while(faux=base<2 || base>16);
     
 }
 
 public static String readValue(String name)
 {
     String terme=new String();
     sc.nextLine();
     do
     {
        System.out.println("Entrer le "+name+" terme");
        terme=sc.nextLine();
        
     } while(!checkValue(terme));
     
     sc.nextLine();
     return terme;
 }
 
 public static int operation()
 {
     int op;
     
    do
    {
         System.out.println("Choisir une opération");
         
         System.out.println("1-> +");
         System.out.println("2-> *");
         System.out.println("3-> %");
         System.out.println("4-> /");
                
         op=sc.nextInt();
    } while(op<1 || op>4);
    
    sc.nextInt();
    return op;
 }
 
 public static StringBuilder calcul(int a,int b,int op)
 {    
     switch (op) {
         case 1:
             return toBase(a+b);
         case 2:
             return toBase(a+b);
         case 3:
             return toBase(a%b);
         default:
             return toBase(a/b);
     }
 }
 
}


1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

De quel buffer tu parles ?

Java a un mécanisme de Garbage Collector qui élimine automatiquement de la mémoire les objets qui ne sont plus utilisés, donc en général il n'y a rien à faire pour libérer de la mémoire.
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Pour ton problème d'instructions "qui sautent" c'est parce que tu mélanges nextInt et nextLine avec ton Scanner et que ça ne fait pas ce que tu penses.

Le mieux serait de ne faire que nextLine et gérer à la main la conversion en int.
int n = Integer.parseInt(sc.nextLine());

Il serait d'ailleurs intéressant que tu gères la lecture des données dans des méthodes séparées pour pouvoir gérer tous tes cas une seule fois, un peu comme dans ta méthode operation()

        do {
            System.out.println("Choisir une opération");

            System.out.println("1-> +");
            System.out.println("2-> *");
            System.out.println("3-> %");
            System.out.println("4-> /");

            op = sc.nextInt();
        } while (op < 1 || op > 4);

Cela pourrait faire :
public static int lireEntier(String message, int min, int max) {
    while (true) {
        System.out.println(message);
        try {
            int result = Integer.parseInt(sc.nextLine());
            if (result >= min && result <= max) {
                return result;
            } else {
                throw new IllegalStateException("Value is expected between "
                               + min + " and " + max + ": " + result);
            }
        } catch (RuntimeException e) {
            System.err.println(e);
        }
    }
}

op = lireEntier("Choisir une opération\n1-> +\n2-> *\n3-> %\n4-> /", 1, 4);
0
anaurel Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
En fait le programme qui ci dessus saute des instructions de LECTURE à l'execution.
j'étais confronté à une situation pareille la semaine derniere et on m'avait demandé de faire
sc.nextLine(); sc est un objet Scanner
Ca avait marché
j'ai appliqué la meme chose mais le probleme se déplace
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > anaurel Messages postés 37 Date d'inscription   Statut Membre Dernière intervention  
 
Nos messages ont du se croiser, je t'invites à lire ma réponse juste avant.
0