import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; /** * Ensemble de fonctions pour faciliter la lecture de nombres et de caracteres * au clavier. Pour faire usage de cette classe, vous devez soit: * * *

Chaque fonction definie dans cette classe lit une entree par ligne, * i.e. si la fonction {@link #readInt() Keyboard.readInt()} est appelee, * un entier va etre lu dans la derniere ligne tapee au clavier, et seulement * cet entier doit se trouver sur cette ligne ou il y aura une erreur. Il en va * default meme pour la lecture d'un nombre reel et d'un caractere. Seul la * lecture d'une chaine de caracteres ({@link #readString() * Keyboard.readString()}) permet la lecture d'une ligne quelconque. Vous devrez * traiter cette ligne manuellement pour gerer des entrees plus * sophistiquees.

* *

Note: Ceci n'est pas un programme. Vous ne pourrez pas l'executer * apres l'avoir compile.

* * @author felipe IFT1010, modifie par duranlef IFT1010 */ public final class Keyboard { /** Derniere ligne lue. */ private static String derniereEntree; /** Le lecteur de System.in... */ private static BufferedReader keyboard = new BufferedReader( new InputStreamReader( System.in ) ); /** Indique s'il y a eu erreur de la derniere operation. */ private static boolean erreur = false; /** Indique la fin de l'entree (plus rien a lire). */ private static boolean finEntree = false; /** Constructeur "camoufle". */ Keyboard() {} /** * Lit la prochaine ligne. * @return true si la lecture s'est bien deroulee. */ private static boolean readLine() { try { erreur = false; // jusqu'ici tout est beau derniereEntree = keyboard.readLine(); if( derniereEntree == null ) // fin de la lecture? { finEntree = true; derniereEntree = ""; } return true; } catch( IOException e ) { System.err.println( "Erreur de lecture clavier" ); erreur = true; // il y a eu un probleme } return false; } // ---------------------------------------------------------- // interface de la classe Keyboard // ---------------------------------------------------------- /** * Retourne vrai s'il y a eu une erreur de lecture lors de la derniere * operation. */ public static boolean error() { return erreur; } /** * Retourne vrai s'il n'y a plus rien a lire. */ public static boolean isEof() { return finEntree; } /** * Lecture d'un entier. * @return L'entier lu s'il y a bel et bien un entier a lire. Sinon, un zero * est retourne et le prochain appel a {@link #error() error()} retournera * false. */ public static int readInt() { if( readLine() ) // lecture de la prochaine ligne { try { return Integer.parseInt( derniereEntree ); } catch( NumberFormatException e ) { // Affiche un message d'erreur pour avertir de l'erreur //System.err.print( "La chaine saisie n'est pas un entier. " ); //System.err.println( "Je retourne 0 a la place." ); erreur = true; // mauvais format } } return 0; } /** * Lecture d'un nombre reel. * @return Le nombre lu s'il y a bel et bien un nombre a lire. Sinon, un zero * est retourne et le prochain appel a {@link #error() error()} retournera * false. */ public static double readDouble() { if( readLine() ) // lecture de la prochaine ligne { try { return Double.parseDouble( derniereEntree ); } catch( NumberFormatException e ) { // Affiche un message d'erreur pour avertir de l'erreur //System.err.println( "La chaine saisie n'est pas un nombre decimal" ); //System.err.println( "Je retourne 0. a la place" ); erreur = true; // mauvais format } } return 0.0; } /** * Lit un caractere. * @return Le caractere lu s'il y a bel et bien un caractere a lire et s'il * est seul. Sinon, le caractere zero est retourne et le prochain appel a * {@link #error() error()} retournera false. */ public static char readChar() { if( readLine() ) // lecture de la prochaine ligne { if( derniereEntree.length() == 1 ) { // retourne l'unique caractere de la chaine return derniereEntree.charAt( 0 ); } else { erreur = true; // mauvais format } } return (char)0; } /** * Lecture d'une chaine de caracteres. * @return La chaine lu s'il n'y a pas eu d'erreur de lecture. Sinon, la * chaine vide est retournee et le prochain appel a {@link #error() error()} * retournera false. */ public static String readString() { if( readLine() ) // lecture de la prochaine ligne return derniereEntree; return ""; } }