Algorithme , Langage java [Fermé]

Signaler
Messages postés
186
Date d'inscription
dimanche 25 septembre 2016
Statut
Membre
Dernière intervention
22 juillet 2017
-
Messages postés
186
Date d'inscription
dimanche 25 septembre 2016
Statut
Membre
Dernière intervention
22 juillet 2017
-
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.

2 réponses

Messages postés
14808
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 juillet 2021
296
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
Messages postés
186
Date d'inscription
dimanche 25 septembre 2016
Statut
Membre
Dernière intervention
22 juillet 2017

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 || :/
Messages postés
14808
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 juillet 2021
296 >
Messages postés
186
Date d'inscription
dimanche 25 septembre 2016
Statut
Membre
Dernière intervention
22 juillet 2017

&& 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.
Messages postés
186
Date d'inscription
dimanche 25 septembre 2016
Statut
Membre
Dernière intervention
22 juillet 2017
>
Messages postés
14808
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 juillet 2021

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 .
Messages postés
16370
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 juillet 2021
2 856
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);
        }
    }
}
Messages postés
16370
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 juillet 2021
2 856
Integer.parseInt fait uniquement la conversion d'un String en int, si tu veux lire ce String au clavier il faut faire un scanner.nextLine avant.

Donc les deux codes suivants feront la même chose dans des cas simples :
int n = Integer.parseInt(scanner.nextLine());
int n = scanner.nextInt();

Cependant dans quelques cas, nextInt() aura un comportement "bizarre".

Par exemple si on écrit " 123 " le nextLine() lit " 123 " et le parseInt() fait une erreur (normal car " 123 " n'est pas un entier), alors que le nextInt() ne fera pas d'erreur et arrivera à lire 123 quand même. Pire si tu écrivais " 123 456 ", un premier nextInt() arriverait à lire 123 et un deuxième nextInt() viendrait lire 456 alors qu'ils n'y a eu qu'une seule ligne d'écrite... contrairement au nextLine() qui considère toujours l'intégralité de la ligne pour la convertir en entier, pas juste la première.

Exemple pour comprendre les effets de bords de nextInt :

import java.util.Scanner;

public class CalculMathematique {

 public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  System.out.println("Ecrire '   123   '");
  int n = scanner.nextInt();
  System.out.println("nextInt a lu " + n);
  System.out.println("et il reste encore: '" + scanner.nextLine() + "'");
  System.out.println();
  System.out.println("Ecrire '   123   456   '");
  int a = scanner.nextInt();
  System.out.println("nextInt a lu " + a);
  int b = scanner.nextInt();
  System.out.println("un deuxieme nextInt a lu " + b);
  System.out.println("et il reste encore: '" + scanner.nextLine() + "'");
 }
}

"je n'ai pas compris le while (true) :/ généralement dans un while on met une variable entre parenthèse non ?"
Dans le while on mets une condition et tant que la condition est vrai on continue, donc par exemple
while (n > 0)
va continuer tant que n est supérieur à 0.
Dans mon code,
while (true)
va toujours tourner en rond, le seul moyen de sortir de la méthode c'est de faire
return n;
ce qui n'arrive que si la ligne lue est un entier compris entre min et max, si on a une erreur (try/catch) ou si l'un des deux if plante, on arrive à la fin du while(true) et on recommence.
Messages postés
186
Date d'inscription
dimanche 25 septembre 2016
Statut
Membre
Dernière intervention
22 juillet 2017

D'accord merci beaucoup en tout cas , du coup l’idéal pour lire la chaîne de caractère '123 456' sur une seule et même ligne serait d'utilisé le scanner.nextLine() ? E
Messages postés
186
Date d'inscription
dimanche 25 septembre 2016
Statut
Membre
Dernière intervention
22 juillet 2017

et Donc je suppose qu'en ce qui concerne le While la condition sera toujours vrai par défaut ? du coup on débutera tjrs cette boucle de la manière suivante while (true){

}
Messages postés
16370
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 juillet 2021
2 856
Tout dépend ce que tu veux.

En Java "123 456" n'est pas un nombre, donc si tu veux récupérer tout en bloc, oui nextLine va tout prendre, mais tu ne pourras pas le convertir en int.
En revanche nextInt() pourra lire mais bloc par bloc ce qui va te donner deux int, 123 d'une part et 456 d'autre part.
Messages postés
186
Date d'inscription
dimanche 25 septembre 2016
Statut
Membre
Dernière intervention
22 juillet 2017

Ahh oui je souhaiterais aussi mettre un peu plus d'interactivité dans mon programme genre j'voulais aussi savoir une méthode qui permet de demandé a l'utilisateur si il souhaite recommencé une des opération et que dans le cas ou il répond par "Oui" le programme relance dans le cas contraire le programme s’arrête , ou dans le cas ou il répond par autre chose que oui ou non le programme on repart dans la boucle jusqu’à ce que l'utilisateur entre "oui" ou "non" je vois a peut près la demarche a suivre et j'ai du mal a le conceptualiser , a savoir les paramètre a prendre en compte ... je pense que tout se déroulera dans une boucle , celle ci elle même renferment un autre boucle ou on aura certainement des conditions if( ... = "oui" ){
}else { System.out.println(" Merci au revoir "); Mais je suis confronté a quelque problématique quant a son aboutissement :/