IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Java - Algorithme


Sujet :

avec Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2016
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Java - Algorithme
    Bonjour, j'ai un problème avec mon code


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    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(); 
    } 
    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.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le premier problème vient de ta condition. Tu utilises un ou (choixEleve != 1 || choixEleve != 2 || choixEleve != 3 || choixEleve != 4). Si choixElement est égal à 2, alors il est différent de 1 et de 3 et de 4 : il y a donc au moins 3 conditions vraies dans ta condition, et donc elle est vraie (puisqu'avec un ou, il suffit d'une seule condition à vrai ou que la condition le soit). C'est un et qu'il fallait utiliser (&&).
    En plus, tu fais un do : quelque soit la valeur de la condition, on entre dans le do, puis tu teste la condition qui est vrai quelque soit ce qu'on saisit. On redemande l'entrée du nombre une seconde fois (sans même indiquer quoique ce soit à l'utilisateur : la plupart des utilisateurs penseront que ton programme tourne dans le vide).
    Ensuite, tu fais le traitement dans la boucle : la boucle existe pour traiter le cas d'erreur de saisie, le traitement n'a rien à y faire. En plus, comme la condition et toujours vraie, le traitement est effectué infiniment, la seule chose l'empêchant est qu'il faut resaisir le nombre à chaque boucle.

    Il ne faut pas faire un do/while, mais while. Le pseudo-code est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    saisir un code d'opération
    tant que le code d'opération est incorrecte
        saisir à nouveau un code d'opération
    fin tant que
    faire le traitement correspondant au code
    alors que tu as cherché à faire (en partant du principe que la condition soit correcte) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    saisir un code d'opération
    faire 
        si le code opération est incorrecte
           saisir le code d'opération
        fin si
        faire le traitement correspondant au code
    tant que le code d'opération est incorrecte
    On voit tout de suite mieux ce qui ne va pas.

    Voici le code final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    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 ");
    		System.out.print("Votre choix : "); // c'est toujours mieux de mettre explicitement une invite
    		int choixEleve = scanner.nextInt();
     
    		while (choixEleve != 1 && choixEleve != 2 && choixEleve != 3 && choixEleve != 4) {
    			System.out.println(choixEleve + " est une option incorrecte : voud devez entrer le choix 1, 2 , 3 ou 4"); // il faut afficher un message au moins (surtout s'il n'y a pas d'invite) sinon on ne peut pas savoir qu'il faut resaisir
    			System.out.print("Votre choix : ");
    			choixEleve = scanner.nextInt();
    		}
     
    		switch (choixEleve) {
    		case 1:
    			faireUneAddition();
    			break;
    		case 2:
    			faireUneSoustraction();
    			break;
    		case 3:
    			faireUneMultiplication();
    			break;
    		case 4:
    			faireUneDivision();
    			break;
    		}
     
    	}

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2014
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 176
    Points : 198
    Points
    198
    Par défaut
    Salut,
    Citation Envoyé par joel.drigo Voir le message
    Salut,
    C'est un et qu'il fallait utiliser (&&).
    La condition sera toujours false avec "&&" car on aura toujours au moins 3 conditions false et comme false && qqch = false, on affectera jamais notre variable "choixEleve"
    Plutot il suffit de mettre "==" au lieu de "!="

    code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    do{ 
    if(choixEleve == 1 || choixEleve == 2 || choixEleve == 3 || choixEleve == 4){ 
    choixEleve = scanner.nextInt(); }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par abysr Voir le message
    Salut,

    La condition sera toujours false avec "&&" car on aura toujours au moins 3 conditions false et comme false && qqch = false, on affectera jamais notre variable "choixEleve"
    Plutot il suffit de mettre "==" au lieu de "!="

    code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    do{ 
    if(choixEleve == 1 || choixEleve == 2 || choixEleve == 3 || choixEleve == 4){ 
    choixEleve = scanner.nextInt(); }
    Non.
    • La condition sera toujours false avec "&&" => faux (si les quatres sous conditions sont vraies alors la condition est vraie, et elles le sont si le choix est ni 1, ni 2, ni 3, ni 4.
    • car on aura toujours au moins 3 conditions false => faux : choixEleve!=2 est vraie dans tous les cas sauf si choixEklement vaut 2 (soit une "infinité" de possibilité qu'elle soit vraie). Pareil pour les autres.
    • on affectera jamais notre variable "choixEleve" : faux. Déjà elle est affectée au moins une fois au début.
    • false && qqch = false : tout juste. while( true ) boucle et while (false) non. Si le choix est correcte, au moins un des choixEleve!=x est faux, donc la boucle s'arrête, si le choix est incorrect, ils sont tous vrais, donc la boucle continue.


      Par exemple, si choixEleve vaut 5 :
      choixEleve != 1 && choixEleve != 2 && choixEleve != 3 && choixEleve != 4 = 5!=1 && 5!=2 && 5!=3 && 5!=4 = vrai && vrai && vrai && vrai = vrai on boucle pour redemander un choix (parce que le choix est incorrect)
      Si choixEleve vaut 1
      choixEleve != 1 && choixEleve != 2 && choixEleve != 3 && choixEleve != 4 = 1!=1 && 1!=2 && 1!=3 && 1!=4 = faux && vrai && vrai && vrai = faux on ne boucle pas pour redemander un choix (parce que le choix est correct)
      Et c'est également le cas pour la seconde saisit (tant que le résultat est incorrect on boucle, dès qu'il est bon on ne boucle plus et on passe à la suite).


    Avec ta proposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(choixEleve == 1 || choixEleve == 2 || choixEleve == 3 || choixEleve == 4){
    Veut dire que si le choix vaut 1, alors on le redemande !
    choixEleve == 1 || choixEleve == 2 || choixEleve == 3 || choixEleve == 4 = true || false || false || false == true !!!

    Super. Pourquoi le redemander s'il est correct ? Par contre, s'il est incorrect on continue, on ne fait rien (parce que le switch ne traite que des codes corrects) puis on arrive au while : là, tu n'as rien proposé, donc on reprend ce que j'ai expliqué précédemment... Et je ne parle pas de la conservation du do/while, avec le code de traitement dedans, qui sont absurdes tous les deux.

    On peut envisager un do/while si on fait un test à l'intérieur pour afficher un message différent, ou alors on réaffiche systématiquement le même menu. Sinon, un while est plus simple (une déclaration unique de variable au bon endroit, moins de if, une interface plus claire, des messages circonstantiels et minimums et par de répétition inutile)

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2014
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 176
    Points : 198
    Points
    198
    Par défaut
    Pour la solution générale, je suis d'accord, mais j'ai juste rebondi sur le code initiale, qui, voulait affecter l'entree du scanner que si l'entree etait : 1 ou 2 ou 3 ou 4, apres pour la pertinence, c'est sur ta solution à l'air bonne.
    j'ai juste remarqué qu'il voulait affecfter sa variable pour ensuite via un switch effectuer une operation.Et que jamais (en gardant son programme initial) et en remplaçant || par &&, ça ne marcherait.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par abysr Voir le message
    j'ai juste remarqué qu'il voulait affecfter sa variable pour ensuite via un switch effectuer une operation.Et que jamais (en gardant son programme initial) et en remplaçant || par &&, ça ne marcherait.
    Bien sûr que ça marche en remplaçant || par &&. Si le while marche, le if marche. while cond identique à if cond, sauf que le while exécute le bloc tant que la condition ne change pas dans le bloc alors que le if ne le fait qu'une fois, quelque soit l'évolution de la condition dans le bloc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (i==1) {
       i==0;
    ]
    fait la même chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( i==1 ) {
       i==0;
    }
    Je le répète : if(choixEleve == 1 || choixEleve == 2 || choixEleve == 3 || choixEleve == 4) fera que ça demandera à nouveau le choixEleve s'il est correct (s'il vaut 1 ou s'il vaut 2 ou s'il vaut 3 ou s'il vaut 4).

Discussions similaires

  1. [java] algorithme Expectation-maximization (EM)
    Par pseudocode dans le forum Contribuez
    Réponses: 20
    Dernier message: 30/03/2017, 11h10
  2. Réponses: 6
    Dernier message: 04/01/2011, 18h18
  3. Problème en java (algorithme vers java)
    Par almofa237 dans le forum Langage
    Réponses: 2
    Dernier message: 10/05/2010, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo