Petit Prog Java débutante/ Besoin d'aide s.v.p

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' &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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 &amp;&amp; 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 :wink: je crois que je doit utiliser la méthode “lireFinLigne()” mais je ne sais pas ou et comment.

Merci à tous.

apès 3-4 jours as-tu encore besoin d’aide?
si oui dit moi où t’es rendu

ha oui j’espère que tu sais que tout mettre dans le main est une mauvaise habitue?

habituellement seulement 1 ligne devrait être dans le main: l’appelle au constructeur avec ou sans paramètre

La structure if -> else if n’est pas correcte.

Tu testes d’abord
[cpp]
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” );
}
[/cpp]
puis tu ressors ici
[cpp]else if ( codeInfraction == ‘f’)
{
libelle = “Omission de se conformer à un feu rouge ou à un panneau d’arrêt”;
nbrPoint = 3;
}
[/cpp]
Tu exécutes donc
[cpp]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' &amp;&amp; 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();[/cpp]

A la fin tu as de nouveau la saisie. Tu effectues 2 fois le chemin.
Encadres ton premier test if par un
if (infraction != monInfraction)
{
saisie
}
else
{
test sur la valeur de l’infraction.
}

Pourquoi ne pas faire un enum type d’infraction puis un switch.