Algorithme , Langage java

Fermé
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017 - Modifié par NHenry le 25/09/2016 à 16:24
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017 - 26 sept. 2016 à 19:44
Bonjour, j'ai un problème avec mon code


public class CalculMathématique{
public static java.util.Scanner scanner = new java.util.Scanner(System.in);
public static void main(String[] args) {

System.out.println("Bienvenue Au programme de divers Operation : ");
System.out.println(" Entrer 1 pour faire une Addition ");
System.out.println(" Entrer 2 pour faire une Soustraction ");
System.out.println(" Entrer 3 pour faire une Multiplication ");
System.out.println(" Entrer 4 pour faire une divison ");
int choixEleve = scanner.nextInt();

do{
if(choixEleve != 1 || choixEleve != 2 || choixEleve != 3 || choixEleve != 4){
choixEleve = scanner.nextInt();
} 
[/contents/604-switch-commutateur switch](choixEleve){
case 1 : faireUneAddition();
break;
case 2 : faireUneSoustraction();
break;
case 3 : faireUneMultiplication();
break;
case 4 : faireUneDivision();
break;
}
}while(choixEleve!= 1 || choixEleve != 2 || choixEleve!= 3 || choixEleve != 4);
} 

Le gros du problème se trouve dans ma boucle do while :/ , ce que je veux savoir faire c'est que si l'utilisateur entre autre chose que l'un des choix proposé (dans mon switch case ), le programme l'en empêche jusqu’à ce qu'il entre l'un des choix proposé et que une fois qu'il a entré l'un des choix proposé que le programme continue et que une fois qu'il a effectuer le calcul et que la réponse a été donné qu'il s’arrête.

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
A voir également:

2 réponses

NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 331
25 sept. 2016 à 16:26
Ta condition :
choixEleve!= 1 || choixEleve != 2 || choixEleve!= 3 || choixEleve != 4
Est un peu toujours vraie, non ?
Si choixEleve=2 elle est différente de 1, donc vrai.
utilise && plutôt
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
25 sept. 2016 à 16:37
Bonjours, Merci pour ton aide c'est sympas !!! :) , Sa fonctionne à présent Mais je n'ai pas compris pourquoi on utilise le && à la place du || :/
0
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 331 > Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
25 sept. 2016 à 17:27
&& ET logique entre les valeurs
|| OU logique entre les valeurs

A ET B sera vrai si A et B sont vrai
A OU B sera vrai si A ou(inclusif) B sont vrai

Dans ton test, tu fais :
Si A différent de 1 OU A différent de 2 OU ...
Si A=1, A != 2
d'où le ET, car si une seule valeur est fausse (dans l'exemple, A==1, donc A!=1 est faux) l'ensemble est faux et donc sort de la boucle.
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017 > NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024
25 sept. 2016 à 17:42
Merci pour le temps que tu accordes , pardonne mon insolence mais J'aimerais aussi savoir par la même occasion comment faire pour prendre en compte dans ma condition que si l'utilisateur entre un caractère ou une chaîne de caractère , Ou un entier fin bref tout les type des variable possible que le programme ne s'arrete pas soudainement mais qu'il renvoie l'utilisateur dans la boucle jusqu’à ce qu'il entre un entier , par exemple quand j'entre un char ou une String le programme s'arrete j'aimerais donc savoir une instruction qui permet d'évite se cas de mesure ou si l'utilisateur rentre un char ou un String le programme le renvoie dans la boucle tant qu'il n'a pas entré d'entier .
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
25 sept. 2016 à 17:58
Bonjour,

Je t'invites à utiliser une méthode dédiée à la saisie d'un choix que tu peux compléter pour couvrir les différents cas à problèmes.

Exemple pour un entier :

public static int choixEntier(int min, int max) {
    while (true) {
        System.out.print("Entrez un nombre entre " + min + " et " + max + " : ");
        try {
            String line = scanner.nextLine();
            int n = Integer.parseInt(line);
            if (n < min) {
                System.out.println("Erreur: " + n + " < " + min);
            } else if (n > max) {
                System.out.println("Erreur: " + n + " > " + max);
            } else {
                return n;
            }
        } catch (RuntimeException e) {
            System.out.println("Erreur: " + e);
        }
    }
}
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
25 sept. 2016 à 18:08
Merci pour ta réponse , étant débutant dans la programmation j'ai du mal a visualisé chacune de tes instruction comme int n = Integer.parseInt(line); Qu'est ce qu'elle fait et dans le while que dois-je mettre entre parenthèse et aussi cette méthode permet de couvrir le cas ou c'est un entier qui est entré si j'ai bien compris mais ce que je voudrais savoirs c'est y'a t'il une méthode qui permet de couvrir tout les cas possible à savoir si c'est un String , un char , un double qui est entré ...
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
25 sept. 2016 à 18:15
Dans ton code précédent tu faisais
scanner.nextInt();
ce qui lisais directement un entier, mais avec des effets de bords assez pénibles, perso je préfère lire directement la ligne entière, et la convertir en entier, c'est ce que fait
Integer.parseInt(line)
.
Et oui ça couvre les autres cas possibles, nextInt renvoyait un InputMismatchException si la saisie n'était pas un entier, le parseInt renvoie lui un NumberFormatException, mais l'un ou l'autre sont tout les deux interceptés par le
catch(RuntimeException e)
il t'afficheras donc une erreur mais ne plantera pas.

Quant à ton while tu n'en as plus besoin, c'est la méthode de choix qui le fait.
Du coup ton code devient juste :

public static void main(String[] args) {
    System.out.println("Bienvenue Au programme de divers Operation : ");
    System.out.println(" Entrer 1 pour faire une Addition ");
    System.out.println(" Entrer 2 pour faire une Soustraction ");
    System.out.println(" Entrer 3 pour faire une Multiplication ");
    System.out.println(" Entrer 4 pour faire une divison ");
    
    int choixEleve = choixEntier(1, 4);
    switch (choixEleve) {
    case 1:
        faireUneAddition();
        break;
    case 2:
        faireUneSoustraction();
        break;
    case 3:
        faireUneMultiplication();
        break;
    case 4:
        faireUneDivision();
        break;
    }
}
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
Modifié par KX le 25/09/2016 à 19:49
Donc , La variable int choixEleve = choixEntier(1,4); Nous renvois directement à la méthode

public static int choixEntier(int min, int max) {
    while (true) {
        System.out.print("Entrez un nombre entre " + min + " et " + max + " : ");
        try {
            String line = scanner.nextLine();
            int n = Integer.parseInt(line);
            if (n < min) {
                System.out.println("Erreur: " + n + " < " + min);
            } else if (n > max) {
                System.out.println("Erreur: " + n + " > " + max);
            } else {
                return n;
            }
        } catch (RuntimeException e) {
            System.out.println("Erreur: " + e);
        }
    }
}

Donc on lègue le travail a cette méthode et c'est elle qui se chargeras de récupéré les erreurs si il y'en a Quant a ce que l'utilisateur écrit ? Quant a le Integer.parseInt(line). j'ai toujours pas compris sont utilisé fin elle sert a comparé ce que l'utilisateur a entré avec le type de la variable ? et pour pouvoir l'utilisé je suppose qu'il faut faire appel a son objet que l'environnement de développement connait ? genre pour le scanner pour pouvoir l'utilisé on doit introduire public static java.util.Scanner scanner = new java.util.Scanner(System.in);
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
25 sept. 2016 à 19:51
j'ai également apporté quelque modification a mon code mais il a buug il a m'affiche CalculMathematique1.java:46: error: missing return statement , pourtant j'ai pris le soins de refermé toute mes balise ({) Voici mon code :

public class CalculMathematique1{
public static java.util.Scanner scanner = new java.util.Scanner(System.in);
public static void main(String[] args){

System.out.println("Bienvenue Au programme de divers Operation : ");
System.out.println(" Entrer 1 pour faire une Addition ");
System.out.println(" Entrer 2 pour faire une Soustraction ");
System.out.println(" Entrer 3 pour faire une Multiplication ");
System.out.println(" Entrer 4 pour faire une divison ");
int choixEleve = choixEntier(1, 4);

do{
if(choixEleve != 1 && choixEleve != 2 && choixEleve != 3 && choixEleve != 4){
System.out.println( " Veuillez entré l'un des choix proposé : ");
choixEleve = scanner.nextInt();
}
switch(choixEleve){
case 1 : faireUneAddition();
break;
case 2 : faireUneSoustraction();
break;
case 3 : faireUneMultiplication();
break;
case 4 : faireUneDivision();
break;
}
}while(choixEleve!= 1 && choixEleve != 2 && choixEleve!= 3 && choixEleve != 4);
}

public static int choixEntier(int min, int max){

System.out.print("Entrez un nombre entre " + min + " et " + max + " : ");
try {
String line = scanner.nextLine();
int n = Integer.parseInt(line);
if (n < min) {
System.out.println("Erreur: " + n + " < " + min);
} else if (n > max) {
System.out.println("Erreur: " + n + " > " + max);
} else {
return n;
}
} catch (RuntimeException e) {
System.out.println("Erreur: " + e);
}
}
public static int unEntierAuHasardEntre (int valeurMinimale, int valeurMaximale){
double nombreReel;
int resultat;

nombreReel = Math.random();
resultat = (int) (nombreReel * (valeurMaximale - valeurMinimale + 1)) + valeurMinimale;
return resultat;
}
}
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
25 sept. 2016 à 20:01
"c'est elle qui se chargeras de récupéré les erreurs si il y'en a"
Oui c'est le code suivant qui gère ça.

try {
    // ...
} catch (RuntimeException e}
   System.out.println("Erreur: " + e);
}

En cas d'exception, on affiche le message "Erreur" avec le détail.

Integer.parseInt(line)
fait la conversion d'un String en int (voir sa javadoc)
Donc avec
scanner.readLine()
je lis un String, par exemple
"3"
et le
parseInt
le transforme en entier
3
, c'est à ce moment là que ça peut planter si tu mets autre chose qu'un entier dans la ligne car la conversion va échouer.

Pour pouvoir l'utiliser tu n'as rien à rajouter, Java connait déjà cette méthode, de même qu'elle connaît déjà System.out.println par exemple.

Après si ça t'embêtes vraiment, tu peux remettre ton
scanner.readInt()
à la place, mais pour éviter des effets de bords je t'invites à mettre un
scanner.readLine()
à la suite, comme ceci :
try {
    int n = scanner.nextInt();
    scanner.nextLine(); // suppression des autres caractères de la ligne
    if (n < min) {
    // ...
0