Bonjour a tous, je commence à peine a programmer avec Java et j’aurais quelques question concernant un petit programme que je doit faire pour l’école. Le programme utilise une classe appelée “Clavier” pour la saisie des données au clavier.
Mon probleme majeur est que lorsque j’entre un code different de ‘s’, ‘a’, ‘f’, ‘d’, ou ‘q’ voici ce que sa me donne:
Entrez le code de l’infraction :
z
Les codes d’infraction permis sont : s, a, f, d et q pour quitter
Entrez le code de l’infraction :
Les codes d’infraction permis sont : s, a, f, d et q pour quitter
Entrez le code de l’infraction :
la boucle est effectuée 2 fois et je ne comprend pas pourquoi.
Je crois que cela a un lien avec les méthodes “lireChar()” et “lireFinLigne()” de la classe “Clavier” fournis par le prof que je dois obligatoirement utilisée pour la saisie de données. Dans mon prog je n’utilise que la méthode “lireChar” mais je ne comprend ce quelle fait ni ce que la méthode “lireFinLigne” fait…donc si vous pourriez m’aider en regardant mon petit programme et la class “Clavier” je vous en serais extremement reconnaissante.
Voici donc mon prog (class) :
public class Infraction {
// Autres méthodes s'il y a lieu
public static void main (String[] params) {
char codeInfraction;
char sexe;
int age;
int vitesseMax;
int vitesseConstatee;
int nbrPoint;
int totInfraction;
int totPoint;
int totFemme;
int totHomme;
int totAgeHomme;
int totAgeFemme;
double moyenneFemme;
double moyenneHomme;
String libelle ;
libelle = "";
moyenneFemme = 0;
moyenneHomme = 0;
nbrPoint = 0;
totInfraction = 0;
totPoint = 0;
totFemme = 0;
totHomme = 0;
totAgeHomme = 0;
totAgeFemme = 0;
System.out.println ( "\n" + "Entrez le code de l'infraction : " );
codeInfraction = Clavier.lireChar();
while ( codeInfraction != 'q' ) {
if ( codeInfraction != 's' && codeInfraction != 'a' && codeInfraction != 'f' && codeInfraction != 'd' ){
System.out.println ( "\n" + "Les codes d'infraction permis sont : s, a, f, d et q pour quitter" );
}else if ( codeInfraction == 's') { // if "s"
libelle = "Excès de vitesse";
System.out.println ( "\n" + "Entrez la vitesse maximale permise : " );
vitesseMax = Clavier.lireInt();
while ( vitesseMax < 30 || vitesseMax > 100) {
System.out.println ( "\n" + "La vitesse maximale permise doit être comprise entre 30 et 100." );
System.out.println ( "\n" + "Entrez la vitesse maximale permise : " );
vitesseMax = Clavier.lireInt();
}
System.out.println ( "\n" + "Entrez la vitesse constatée : " );
vitesseConstatee = Clavier.lireInt();
while ( vitesseConstatee - vitesseMax <= 0 ) { // validation vitesse
System.out.println ( "\n" + "La vitesse constatée doit être plus grande que la vitesse maximale permise" );
System.out.println ( "\n" + "Entrez la vitesse constatée : " );
vitesseConstatee = Clavier.lireInt();
} // while valiadtion vitesse
if ( vitesseConstatee - vitesseMax <= 10 ) {
nbrPoint = 0;
} else if ( vitesseConstatee - vitesseMax <= 20 ) {
nbrPoint = 1;
} else if ( vitesseConstatee - vitesseMax <= 30 ) {
nbrPoint = 2;
} else if ( vitesseConstatee - vitesseMax <= 45 ) {
nbrPoint = 3;
} else if ( vitesseConstatee - vitesseMax <= 60 ) {
nbrPoint = 5;
} else {
nbrPoint = 8;
} // if calcul de la vitesse
} else if ( codeInfraction == 'f') {
libelle = "Omission de se conformer à un feu rouge ou à un panneau d'arrêt";
nbrPoint = 3;
} else if ( codeInfraction == 'a') {
libelle = "Vitesse ou action imprudente";
nbrPoint = 4;
} else if ( codeInfraction == 'd') {
libelle = "Omission darrêter avant deffectuer un virage à droite sur feu rouge";
nbrPoint = 3;
} //
if ( codeInfraction == 's' || codeInfraction == 'f' || codeInfraction == 'a' || codeInfraction == 'd' ) {
System.out.println ( "\n" + "Entrez le sexe de la personne ( h(homme) ou f(femme) ) : " );
sexe = Clavier.lireChar();
while ( sexe != 'h' && sexe != 'f' ) {
System.out.println ( "\n" + "Le sexe doit être soit h(homme) ou f(femme)" );
sexe = Clavier.lireChar();
}
System.out.println ( "\n" + "Entrez l'âge de la personne : " );
age = Clavier.lireInt();
while ( age < 16 || age > 100) {
System.out.println ( "\n" + "L'age doit être compris entre 16 et 100 ans inclusivement" );
age = Clavier.lireInt();
}
if ( sexe == 'h') {
totHomme = totHomme + 1;
totAgeHomme = totAgeHomme + age;
} else {
totFemme = totFemme + 1;
totAgeFemme = totAgeFemme + age;
}
totInfraction = totInfraction + 1 ;
totPoint = totPoint + nbrPoint;
System.out.println ( "\n" + libelle + " : " + nbrPoint + " points d'infraction." );
}
System.out.println ( "\n" + "Entrez le code de l'infraction : " );
codeInfraction = Clavier.lireChar();
}
if ( totHomme > 0 && totFemme > 0) {
moyenneHomme = totAgeHomme / totHomme;
moyenneFemme = totAgeFemme / totFemme;
System.out.println ( "Nombre total d'infractions : " + totInfraction );
System.out.println ( "Nombre total de points d'inaptitude : " + totPoint );
System.out.println ( "Nombre total de femmes en infraction : " + totFemme + "\n" + "Age moyen : " + moyenneFemme );
System.out.println ( "Nombre total d'hommes en infraction : " + totHomme + "\n" + "Age moyen : " + moyenneHomme );
} else if ( totHomme > 0 && totFemme == 0 ) {
moyenneHomme = totAgeHomme / totHomme;
System.out.println ( "Nombre total d'infractions : " + totInfraction );
System.out.println ( "Nombre total de points d'inaptitude : " + totPoint );
System.out.println ( "Nombre total d'hommes en infraction : " + totHomme + "\n" + "Age moyen : " + moyenneHomme );
} else if ( totHomme == 0 && totFemme > 0 ) {
moyenneFemme = totAgeFemme / totFemme;
System.out.println ( "Nombre total d'infractions : " + totInfraction );
System.out.println ( "Nombre total de points d'inaptitude : " + totPoint );
System.out.println ( "Nombre total de femmes en infraction : " + totFemme + "\n" + "Age moyen : " + moyenneFemme );
} else {
System.out.println ( "Nombre total d'infractions : " + totInfraction );
System.out.println ( "Nombre total de points d'inaptitude : " + totPoint );
}
} // main
}// Infraction
Et maintenant voici la class que je doit utiliser pour la saisie au clavier.
public class Clavier {
private static String lireMot() {
/* antecedent : -
* consequent : Retourne le mot lu, a partir du curseur.
* Les separateurs (voir plus haut) de debut sont
* ignores. La fin du mot est determinee par un sepa-
* rateur. Le separateur qui suit le mot est lu.
* Le curseur est rendu sur le premier caractere suiv-
* ant le separateur ayant determine la fin du mot.
*/
String resultat = "";
char car; // caractere lu
// Sauter les separateurs
do {
car = lireChar();
} while ( Character.isWhitespace( car ) );
// car ne contient pas un separateur.
// Lire et stocker dans resultat jusqu'a un separateur
do {
resultat = resultat + car;
car = lireChar();
} while ( ! Character.isWhitespace( car ) );
// car contient un separateur.
// S'il s'agit de CR, il faut qu'il soit suivi de LF
if ( car == '\r' ) { // CR
car = lireChar();
if ( car != '\n' ) { // LF
System.out.println(
"Erreur fatale dans la methode lireMot de la classe Clavier.");
System.exit(1); // 1 : pour signifier un arret anormal
} // if non LF
} // if CR
return resultat;
} // lireMot
public static void viderTampon() {
/* antecedent : -
* consequent : Vide le tampon d'entree associe a la console.
*/
try {
System.in.skip( System.in.available() );
} catch( IOException e ) {
System.out.println ( "Le tampon d'entree ne peut etre vide." );
}
} // viderTampon
public static void lireFinLigne() {
/* antecedent :
* consequent : Lit les caracteres, a partir du curseur.
* La fin de la ligne est determinee par :
* LF (line feed) ou par CR (carriage return)
* suivi de LF.
* LF et CR seront lus.
*/
char prochain_caractere;
boolean fini = false;
while ( ! fini ) {
prochain_caractere = lireChar(); // Lire un caractere
if ( prochain_caractere == '\r' ) { // CR
prochain_caractere = lireChar();
if ( prochain_caractere == '\n' ) { // LF
fini = true;
} else { // CR doit etre suivi de LF, sous Windows
System.out.println (
"Erreur fatale dans la methode lireLigne de la classe Clavier.");
System.exit(1); // 1 : pour signifier un arret anormal
} // if non LF
} else if ( prochain_caractere == '\n' ) { // UNIX, Linux et Mac OS X
fini = true;
}
} // while
} // lireFinLigne
public static String lireString() {
/* antecedent :
* consequent : Retourne la chaine lue, a partir du curseur.
* La fin de la chaine est determinee par :
* LF (line feed) ou par CR (carriage return)
* suivi de LF.
* Ni LF ni CR ne seront presents dans la chaine mais
* auront ete lus.
*/
char prochain_caractere;
String resultat = "";
boolean fini = false;
while ( ! fini ) {
prochain_caractere = lireChar(); // Lire un caractere
if ( prochain_caractere == '\r' ) { // CR
prochain_caractere = lireChar();
if ( prochain_caractere == '\n' ) { // LF
fini = true;
} else { // CR doit etre suivi de LF, sous Windows
System.out.println (
"Erreur fatale dans la methode lireLigne de la classe Clavier.");
System.exit(1); // 1 : pour signifier un arret anormal
} // if non LF
} else if ( prochain_caractere == '\n' ) { // UNIX et Mac OS X
fini = true;
} else { // concatener le caractere a la fin de la chaine
resultat = resultat + prochain_caractere;
}
} // while
return resultat;
} // lireString
public static byte lireByte() {
/* antecedent : -
* consequent : retourne le nombre entier octet lu, a partir du
* curseur. La fin du nombre est determinee par un
* separateur (voir ci-haut). Le separateur est lu.
* Le nombre peut commencer par - (negatif) mais ne
* peut commencer par +.
*/
String chaine_lue = null;
chaine_lue = lireMot();
return Byte.parseByte( chaine_lue );
} // lireByte
public static short lireShort() {
/* antecedent : -
* consequent : retourne le nombre entier court lu, a partir du
* curseur. La fin du nombre est determinee par un
* separateur (voir ci-haut). Le separateur est lu.
* Le nombre peut commencer par - (negatif) mais ne
* peut commencer par +.
*/
String chaine_lue = null;
chaine_lue = lireMot();
return Short.parseShort( chaine_lue );
} // lireShort
public static int lireInt() {
/* antecedent : -
* consequent : retourne le nombre entier lu, a partir du
* curseur. La fin du nombre est determinee par un
* separateur (voir ci-haut). Le separateur est lu.
* Le nombre peut commencer par - (negatif) mais ne
* peut commencer par +.
*/
String chaine_lue = null;
chaine_lue = lireMot();
return Integer.parseInt( chaine_lue );
} // lireInt
public static long lireLong() {
/* antecedent : -
* consequent : retourne le nombre entier long lu, a partir du
* curseur. La fin du nombre est determinee par un
* separateur (voir ci-haut). Le separateur est lu.
* Le nombre peut commencer par - (negatif) mais ne
* peut commencer par +.
*/
String chaine_lue = null;
chaine_lue = lireMot();
return Long.parseLong( chaine_lue );
} // lireLong
public static float lireFloat() {
/* antecedent : -
* consequent : retourne le nombre reel lu, a partir du
* curseur. La fin du nombre est determinee par un
* separateur (voir ci-haut). Le separateur est lu.
* Le nombre peut commencer par - (negatif) ou + (positif).
* Le nombre peut ne pas contenir le point decimal.
*/
String chaine_lue = null;
chaine_lue = lireMot();
return Float.parseFloat( chaine_lue );
} // lireFloat
public static double lireDouble() {
/* antecedent :
* consequent : retourne le nombre reel double lu, a partir du
* curseur. La fin du nombre est determinee par un
* separateur (voir ci-haut). Le separateur est lu.
* Le nombre peut commencer par - (negatif) ou + (positif).
* Le nombre peut ne pas contenir le point decimal.
*/
String chaine_lue = null;
chaine_lue = lireMot();
return Double.parseDouble( chaine_lue );
} // lireDouble
public static char lireChar() {
/* antecedent : -
* consequent : Retourne le caractere lu, a partir du curseur.
* Le curseur est rendu sur le caractere qui suit le
* caractere lu.
*/
int code_ascii = -1; // valeur bidon
try {
code_ascii = System.in.read();
} catch( IOException e ) {
// on ne fait rien
}
return ( char ) code_ascii;
} // lireChar
} // Clavier
Je sais tres bien que mon programme est mal fait mais le plus important serais qu’il fonctionne et non son efficacité coté temps.
Pour ce qui est des validations je doit seulement fair les validations logiques en assumant que l’utilisateur entrera le bon type lorsque demandé.
Donc si quelqu’un pouvait m’aider je crois que je doit utiliser la méthode “lireFinLigne()” mais je ne sais pas ou et comment.
Merci à tous.