package iutsud ; import java.io.BufferedReader ; import java.io.InputStreamReader ; /** * Cette classe fournit des méthodes simples pour lire les types * de base sur l'entrée standard (au clavier).
* La lecture est faite par des instructions du type : *
int i = Console.readInt() ;
* double d = Console.readDouble() ;
* char c = Console.readChar() ;
* ...
*
* readChar()
* qui renvoie le caractère de fin de ligne '\n'
, et sauf pour readLine()
* qui renvoie la chaîne vide.
* readLine()
qui renvoie null
.
*
* Le point de départ a été la classe sdsu.io.Console
de l'université
* de San Diego (http://www.eli.sdsu.edu/java-SDSU).
* Cette classe a été simplifiée pour répondre à nos besoins particuliers pour
* l'enseignement de l'introduction à l'algorithmique.
* Le code a été entièrement remanié pour utiliser les fonctions de
* conversion du langage Java.
* Des améliorations pourraient certainement y être apportées en utilisant
* la classe Number
notamment pour les problèmes d'internationalisation,
* liés à l'écriture des nombres en virgule flottante.
*
* * Utilisation :
*
Console.class
se trouve sous le répertoire
* /usr/local/lib/java/iutsud
.
* CLASSPATH
doit contenir
* /usr/local/lib/java
. Sur sterne elle est initialisée
* automatiquement au démarrage de la session avec cette valeur.
* Console
depuis le package iutsud
par l'instruction
* import iutsud.Console
*
*
* Le document de présentation peut être généré depuis le source par la commande :
* javadoc -version -author iutsud
* @author Raymond Schneider
* (Raymond.Schneider@iutsud.u-strasbg.fr)
* @version version 0.1 17/07/98
*/
public class Console {
private static BufferedReader cin = new BufferedReader(
new InputStreamReader(
System.in )) ;
private static void main(String args[]) {
while (true) {
System.out.print( "Print a Base ");
int base = Console.readInt() ;
System.out.print( "Print a Long in base " + base + " : ") ;
long lb = Console.readLong(base) ;
System.out.println( "You typed: " + lb );
System.out.print( "Print a Byte ");
byte k = Console.readByte() ;
System.out.println( "You typed: " + k );
System.out.print( "Print a Short ");
int j = Console.readShort() ;
System.out.println( "You typed: " + j );
System.out.print( "Print a Int ");
int i = Console.readInt() ;
System.out.println( "You typed: " + i );
System.out.print( "Print a Long ");
long l = Console.readLong() ;
System.out.println( "You typed: " + l );
System.out.print( "Print a Float ");
float f = Console.readFloat() ;
System.out.println( "You typed: " + f );
System.out.print( "Print a Double ");
double d = Console.readDouble() ;
System.out.println( "You typed: " + d );
System.out.print( "Print a Boolean ");
boolean b = Console.readBoolean() ;
System.out.println( "You typed: " + b );
System.out.print( "Print a Char ");
char c = Console.readChar() ;
System.out.println( "You typed: " + c );
}
}
private Console()
{
super() ;
}
/**
* Exception levée lors d'une erreur de lecture
*/
public static class ReadException extends RuntimeException
{
public ReadException(String message)
{
super(message) ;
}
} // end class ReadException
/**
* Exception levée lors d'une erreur de conversion
*/
public static class ConvertionException extends RuntimeException
{
public ConvertionException(String message)
{
super(message) ;
}
} // end class ConvertionException
/**
* Quitte le programme en levant l'exception e
* Le système afficheraé le message d'erreur associé
* ainsi que la pile d'ecxécution
* @param e l'exception à lever
*/
/*
* Exits programs after throwing an exception
* @param e exception to be thrown
*/
static final void exitProgram( RuntimeException e )
{
throw e ;
}
/**
* Quitte le programme suite à une erreur de conversion ;
* affiche un message d'erreur en levant l'exception
* Console.ConvertionException
* @param s la chaîne à convertir
* @param t le type vers lequel il fallait convertir
*/
/*
* Exits programs after displaying a conversion error message
* and after dumping the Thread's stack
* @param s String that could not be converted
* @param t Conversion Destination Type
*/
private static final void conversionError( String s , String t )
{
exitProgram( new ConvertionException(
conversionErrorMessage( s , t ) ) ) ;
}
/**
* Quitte le programme suite à une erreur de lecture ;
* affiche un message d'erreur en levant l'exception
* Console.ReadException
* @param s la raison de l'erreur à afficher
* @param t le type lu
*/
/*
* Exits programs after displaying a conversion error message
* and after dumping the Thread's stack
* @param s the error cause
* @param t Read Destination Type
*/
private static final void readError( String s , String t )
{
exitProgram( new ReadException ( s + " lors de la lecture d'un " + t) );
}
/**
* Compose le message d'erreur à afficher suite à une erreur de conversion ;
* @param s la chaîne à convertir
* @param t le type vers lequel il fallait convertir
*/
/*
* Bulids a conversion error message
* @param s String that could not be converted
* @param t Conversion Destination Type
*/
private static String conversionErrorMessage( String s, String t )
{
return '"' + s + '"' + " ne peut être convertie en " + t ;
}
// Input methods ----------------------------------------------------
/**
* Lit une valeur booléenne dans une ligne.
* Lit une ligne et détermine si elle représente true
ou false
.
* Les valeurs possibles sont : true and false,
* vrai and faux.
* La comparaison est insensible à la casse (majuscule, minuscule).
*
* Le programme stoppe en cas d'erreur de lecture ou en fin de fichier
* @return la valeur booléene correspondante.
*/
/*
* Reads an ASCII boolean value.
* It reads a word and determines if it represents true
or
* false
. Possible values are: true and false,
* vrai and faux.
* The comparison is case insensitive.
* Program exits on read errors or EOF
* @return the boolean.
*/
public static boolean readBoolean()
{
boolean b = false ;
String s ;
s= readLine("boolean") ;
if (s.equalsIgnoreCase(String.valueOf(false))
|| s.equalsIgnoreCase("faux") )
b= false;
else if (s.equalsIgnoreCase(String.valueOf(true))
|| s.equalsIgnoreCase("vrai") )
b= true;
else
conversionError( s , "boolean" ) ;
return b;
} // end readBoolean
/**
* Lit un caractère dans une ligne.
* La ligne lue doit contenir au maximum un caractère.
* Si la ligne est vide le caractère '\n'
est renvoyé.
*
* Le programme stoppe en cas d'erreur de lecture ou en fin de fichier
* ou encore si la ligne contenait plusieurs caractères.
* @return le caractère lu ou '\n'
si la ligne était vide.
*/
/*
* Reads one ASCII character and convert it into the internal char
* format. If the line is empty '\n'
is returned.
* If more than one character are available in the line, only the first one is returned ; all other are
* ignored.
* Program exits on read errors or EOF or if more characters are available
* @return the character or '\n'
if line was empty.
*/
public static char readChar()
{
String s ;
char c = '\n' ;
s= readNewLine("char");
if (s.length() == 1)
c= s.charAt(0);
else if ( s.length() != 0 )
exitProgram( new ReadException(
"La ligne lue contenait plus d'un caractère : "
+ '"' + s + '"' + '\n' )
);
return c ;
}
/**
* Lit un nombre en virgule flottante et en double précision dans une ligne.
* Ces nombres doivent être conforme à l'écriture standard des constantes
* double
en Java et permettre la conversion par :
* Double(String).doubleValue()
* Le nombre peut être précédé ou suivi d'un nombre quelconque d'espaces
* (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre.
*
* Le programme stoppe en cas d'erreur ou en fin de fichier
* @return la valeur double
correspondante.
*/
/*
* Reads an ASCII decimal floating point number.
* A floating point number should obey Java String conversion :
* Double(String).doubleValue()
* Program exits on read errors or EOF
* @return the double.
*/
public static double readDouble()
{
String s ;
double d = 0.0 ;
s= readLine("double");
try
{
d = new Double(s).doubleValue() ;
}
catch (NumberFormatException e)
{
conversionError( s, "double");
}
return d ;
}
/**
* Lit un nombre en virgule flottante et en simple précision dans une ligne.
* Ces nombres doivent être conforme à l'écriture standard des constantes
* float
en Java et permettre la conversion par :
* Float(String).floatValue()
* Le nombre peut être précédé ou suivi d'un nombre quelconque d'espaces
* (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre.
*
* Le programme stoppe en cas d'erreur ou en fin de fichier
* @return la valeur float
correspondante.
*/
/*
* Reads an ASCII decimal floating point number.
* A floating point number should obey Java String conversion :
* Float(String).floatValue()
* Program exits on read errors or EOF
* @return the double.
*/
public static float readFloat()
{
String s ;
float f = 0.0F ;
s= readLine("float");
try
{
f = new Float(s).floatValue() ;
}
catch (NumberFormatException e)
{
conversionError( s, "float" );
}
return f ;
}
/**
* Lit un nombre entier dans une ligne.
* Ces nombres doivent être conforme à l'écriture standard des constantes
* int
en Java et permettre la conversion par :
* Integer.parseInt(String)
.
* Le nombre peut être précédé ou suivi d'un nombre quelconque d'espaces
* (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre.
*
* Le programme stoppe en cas d'erreur ou en fin de fichier
* @return la valeur int
correspondante.
*/
/*
* Reads an ASCII decimal integer conforming to Integer.parseInt(String)
.
* Integers can be preceded by optional whitespace (SPACE or TAB).
* Program exits on read errors or EOF
* @return the integer.
*/
public static int readInt()
{
int i = 0 ;
String s ;
s= readLine("int");
try
{
i = Integer.parseInt(s) ;
}
catch (NumberFormatException e)
{
conversionError( s, "int" );
}
return i ;
}
/**
* Lit un nombre entier long écrit en base b
dans une ligne.
* Ces nombres doivent être conforme à l'écriture standard des constantes
* long
en Java et permettre la conversion par :
* Long.parseLong(String,b)
* Le nombre peut être précédé ou suivi d'un nombre quelconque d'espaces
* (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre.
*
* Le programme stoppe en cas d'erreur ou en fin de fichier
* @param b la base dans laquelle l'entier lu est exprimé
* @return la valeur long
correspondante.
*/
/*
* Reads an ASCII long expressed in base b
and conforming
* to Long.parseLong(String,b)
* Longs can be preceded by optional whitespace (SPACE or TAB).
* Program exits on read errors or EOF
* @param b the numbering base used to make the conversion
* @return the long.
*/
public static long readLong(int b)
{
long l = 0L;
String s ;
String t = "long" ;
if ( b != 10)
t= t + " in base " + b ;
s= readLine(t);
try
{
l = Long.parseLong(s, b) ;
}
catch (NumberFormatException e)
{
conversionError( s, t) ;
}
return l ;
}
/**
* Lit un nombre entier long dans une ligne.
* Ces nombres doivent être conforme à l'écriture standard des constantes
* long
en Java et permettre la conversion par :
* Long.parseLong(String)
* Le nombre peut être précédé ou suivi d'un nombre quelconque d'espaces
* (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre.
*
* Le programme stoppe en cas d'erreur ou en fin de fichier
* @return la valeur long
correspondante.
*/
/*
* Reads an ASCII decimal long conforming to Long.parseLong(String)
* Longs can be preceded by optional whitespace (SPACE or TAB).
* Program exits on read errors or EOF
* @return the long.
*/
public static long readLong()
{
return readLong(10) ;
}
/**
* Lit un nombre entier court dans une ligne.
* Ces nombres doivent être conforme à l'écriture standard des constantes
* short
en Java et permettre la conversion par :
* Short.parseShort(String)
* Le nombre peut tre preécédé ou suivi d'un nombre quelconque d'espaces
* (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre.
*
* Le programme stoppe en cas d'erreur ou en fin de fichier
* @return la valeur short
correspondante.
*/
/*
* Reads an ASCII decimal short.
* Shorts can be preceded by optional whitespace (SPACE or TAB).
* Program exits on read errors or EOF
* @return the short.
*/
public static short readShort()
{
short j = 0 ;
String s = readLine("short");
try
{
j = Short.parseShort(s) ;
}
catch (NumberFormatException e)
{
conversionError( s, "short" );
}
return j ;
}
/**
* Lit un octet dans une ligne.
* Ces nombres doivent être conforme à l'écriture standard des constantes
* byte
en Java et permettre la conversion par :
* Byte.parseByte(String)
* Le nombre peut être précédé ou suivi d'un nombre quelconque d'espaces
* (SPACE ou TAB). La ligne lue ne doit comporter qu'un seul nombre.
*
* Le programme stoppe en cas d'erreur ou en fin de fichier
* @return la valeur byte
correspondante.
*/
/*
* Reads an ASCII decimal byte.
* Bytes can be preceded by optional whitespace (SPACE or TAB).
* Program exits on read errors or EOF
* @return the byte.
*/
public static byte readByte()
{
byte b = 0 ;
String s = readLine("byte");
try
{
b = Byte.parseByte(s) ;
}
catch (NumberFormatException e)
{
conversionError( s, "byte" );
}
return b ;
}
/**
* Lit une ligne.
*
* Le programme stoppe en cas d'erreur de lecture.
* @return une chaîne indiquant le contenu de la ligne ou
* une chaîne vide lorsque la ligne était vide ou
* null
en fin de fichier .
*/
/*
* Reads a line.
* Program exits on read errors
* @return the line content or an empty string if nothing entered or null
if EOF reached .
*/
public static String readLine()
{
String s = null ;
try
{
s= cin.readLine();
}
catch ( java.io.EOFException error)
{
s = null ;
}
catch ( Exception error )
{
exitProgram( new RuntimeException(error.toString()) ) ;
}
return s ;
}
/**
* Lit une nouvelle ligne.
*
* Le programme stoppe en cas d'erreur de lecture ou si la fin de fichier
* est rencontrée.
* @param t chaîne indiquant le type de la donnée lue dans cette ligne
* @return une chaîne indiquant le contenu de la ligne ou
* une chaîne vide lorsque la ligne était vide .
*/
/*
* Reads a new line.
* Program exits on read errors or if EOF is reached.
* @param t String indicating the type expected in the line
* @return the line content or an empty string if nothing entered .
*/
private static String readNewLine(String t)
{
String s ;
s= readLine() ;
if ( s == null)
readError ( " Fin de fichier inattendue" , t) ;
return s ;
}
/**
* Lit une donnée de type t
dans une ligne non vide.
*
* Le programme stoppe en cas d'erreur de lecture, de fin de fichier
* ou si la ligne était vide.
* @param t chaîne indiquant le type de la donnée lue dans cette ligne
* @return une chaîne indiquant le contenu non vide de la ligne.
*/
/*
* Reads a data of type t
in a non empty line.
* Program exits on read errors or EOF or if line is empty
* @param t String indicating the type expected in the line
* @return the non empty line content
*/
private static String readLine(String t)
{
String s ;
s= readNewLine(t).trim() ;
if (s.length() == 0)
readError ( " Ligne vide" , t) ;
return s ;
}
} // end class Console