Besoin d'aide avec un prog simple en Java

Fermé
Éliane - 21 févr. 2005 à 03:45
 souhila29 - 10 avril 2008 à 17:39
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 d’arrêter avant d’effectuer 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.
A voir également:

6 réponses

Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
21 févr. 2005 à 08:22
Je pense que l' "erreur" vient juste de la methode lirechar en effet
quand tu tape z + enter le z doit etre placé dans le char et enterreste en attente jusaqu'au passage du prochain read.
La solution serai sans doute d'utiliser lireString qui te renvoie une chaine de caracteres que tu compare ensuite avec ce que tu veux :
exemple:

System.out.println ( "\n" + "Entrez le code de l'infraction : " );
String codeInfraction = Clavier.lireString();

while ( codeInfraction .equalsIgnoreCase ("q") ) {

if (! codeInfraction .equalsIgnoreCase ("s") &&
!codeInfraction .equalsIgnoreCase ("a") &&
!codeInfraction .equalsIgnoreCase ("f") &&
!codeInfraction .equalsIgnoreCase ("d")){

System.out.println ( "\n" + "Les codes d'infraction permis sont : s, a, f, d et q pour quitter" );

}else if ( ............................................


pour le equalsIgnoreCase en fait cela fait une comparaison de chaine en ignorant la case (ce qui est pratique dans ton cas)
verifie par contre que cela s'ecrit bien comme ca...je n'ai pas de compilo java sous la main la...

n'hesite pas si tu as d'autres questions..bon courage et bonne journée

COIN!
0
ok merci beaucoup...jai fini par men rendre compte :P jai ajouté lireFinLigne(); c'est que le "enter" etais consideré comme un char

Merci!
0
Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
21 févr. 2005 à 10:21
de rien bonne journée.
0
salut j'ai besoin d'un programme qui résoud un systeme linéaire sous java en précisant la méthode de simplexe
0
&lt;yassou&gt; Messages postés 589 Date d'inscription lundi 17 décembre 2007 Statut Membre Dernière intervention 6 juin 2015 74
22 mars 2008 à 11:07
et si tu faisais ton tp de "programmation linéaire" toute seule Souhila :d
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tu le veux en quel langage souhila ?
0
salut borabora merci de prendre ma question en considération je veux le programme en langage JAVA et merci
0