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

Fermé
anaurel Messages postés 37 Date d'inscription vendredi 26 mai 2017 Statut Membre Dernière intervention 12 janvier 2018 - 29 juin 2017 à 09:30
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 29 juin 2017 à 14:05
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);
     }
 }
 
}


A voir également:

1 réponse

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
29 juin 2017 à 10:36
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 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
29 juin 2017 à 13:58
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 vendredi 26 mai 2017 Statut Membre Dernière intervention 12 janvier 2018
Modifié le 29 juin 2017 à 14:04
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 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > anaurel Messages postés 37 Date d'inscription vendredi 26 mai 2017 Statut Membre Dernière intervention 12 janvier 2018
29 juin 2017 à 14:05
Nos messages ont du se croiser, je t'invites à lire ma réponse juste avant.
0