Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de boucle

Houston, nous avons un problème !

Anonyme
    19 juin 2017 à 22:46:44

    Bonjour à toutes et à tous,

    Codeur depuis peu sur Java, j'ai décidé d'entreprendre un projet. Cependant, un problème persiste au sein de mon code.

    Une de mes méthode demande au futur utilisateur d'entrer son "Nom". Mais pour être sur de son choix, je demande à celui-ci de valider son "Nom". => Pour ce faire, s'il entre au clavier "Oui/oui" le programme continue;

    => S'il entre "Non/non" le programme lui proposera de changer de "Nom"

    => MAIS s'il entre autre chose que "Oui ou Non", le programme lui fera remarquer qu'il a entré une mauvaise donnée et qu'il doit à nouveau répondre par "Oui ou Non".

    Mon code que vous trouverez ci-dessous, réalise cela MAIS si j'entre 2x de suite une mauvaise donnée, le programme lui propose d'entrer un "Nom".

    Comment cela ce fait-il ? Je suis perdu :p

    Voici quelques lignes de mon code qui pose problème (Dsl pour mon code un peu "bazardeux")

    do {
    		System.out.print("Entrez votre nom : ");
    		String nom = clavier.nextLine();
    		System.out.println("Êtes-vous certain pour " + nom + ". (Oui/Non) ?");
    		System.out.print("Votre réponse : ");
    		certain = clavier.nextLine();
    
    		if (certain.equals("Oui")) {
    			certain = "Oui";
    			incorrecte = "Oui";
    		} else if (certain.equals("oui")) {
    			certain = "oui";
    			incorrecte = "oui";
    		} else if (certain.equals("Non")) {
    			certain = "Non";
    			incorrecte = "Non";
    		} else if (certain.equals("non")) {
    			certain = "Non";
    			incorrecte = "Non";
    		} else {
    			incorrecte = "Mauvais";
    		}
    		if (incorrecte.equals("Mauvais")) {
    			certain = "Mauvais";
    			do {
    				System.out.println("");
    				System.out.println("[!] ATTENTION [!]");
    				System.out.println("Vous venez d'introduire une mauvaise donnée. Veuillez répondre par 'Oui' ou 'Non'");
    				System.out.println("");
    				System.out.println("Êtes-vous certain pour " + nom + ". (Oui/Non) ?");
    				System.out.print("Votre réponse : ");
    				certain = clavier.nextLine();
    			} while (certain.equals("Oui") && certain.equals("oui") && certain.equals("non") && certain.equals("non"));
    
    			if (incorrecte.equals("Non") && incorrecte.equals("non")) {
    				System.out.println();
    				System.out.println("Veuillez choisir un autre nom.");
    				System.out.println();
    			}
    		}
    		while (certain != "Oui" && certain != "oui");

    Bonne journée à vous tous :)

    • Partager sur Facebook
    • Partager sur Twitter
      20 juin 2017 à 6:02:11

      Bonjour,

      J'ai essayé de comprendre ton code mais c'est tellement compliqué, embrouillé et bourré de code inutile que je n'ai pas réussi...

      Voila comment j'aurais procédé :

      // Variable qui vaudra true quand le nom sera validé
      boolean accepte;
      do {
          // Lire le nom
          // Lire la confirmation
          // Déterminer la valeur de accepte
          // Si le choix n'est pas validé et qu'en plus la réponse est différente de "non", afficher "Mauvais choix"
      } while (!accepte);
      

      Sinon, pour simplifier le test majuscules/minuscules regarde la méthode toLowerCase ou equalsIgnoreCase.

      -
      Edité par brubru777 20 juin 2017 à 6:02:56

      • Partager sur Facebook
      • Partager sur Twitter
        20 juin 2017 à 9:24:52

        Tu a un problème de logique dans tes boucle,regardons par exemple:

         do {
                        [...]
         } while (certain.equals("Oui") && certain.equals("oui") && certain.equals("non") && certain.equals("non"));


        Si on met ta boucle en français, cela donne faire le traitement, tant que certain égale Oui et égale oui et  égale non (et re égale à non)

        Si la valeur est oui, elle ne peut pas être égale à non, ou bien égale à Oui

        • Partager sur Facebook
        • Partager sur Twitter
          22 juin 2017 à 17:56:38

          Bonjour,

          Je te conseil d'utiliser un switch à l'intérieur d'un do while et de passer la saisie utilisateur en majuscule pour pas avoir de problème, je te joins le code que j'ai produis pour un autre projet, adapte la à ton code ! :)

          do{
          			System.out.println("Waiting for a command ...");
          			Scanner sc = new Scanner(System.in);
          			String read = sc.nextLine();
          			read = read.toUpperCase();
          			System.out.println("");
          			answer = false;
          			switch(read)
          			{
          				case "CREATE TABLE" :
          					table.createNewTable();
          					break;
          				case "DELETE TABLE" :
          					table.deleteTable();
          					break;
          				case "DISCONNECT" :
          					answer = true;
          					launch.setMenu(1);
          					break;
          				case "DISPLAY TABLE" :
          					table.displayTable();
          					break;
          				case "DISPLAY ALL TABLE" :
          					table.displayAllTable();
          					break;
          				case "MODIFY TABLE" :
          					table.modifyTable();
          					break;
          				case "SAVE" :
          					//table.save();
          					break;
          				case "HELP" :
          					this.help("MenuPrincipal");
          				case "EXIT" :
          					answer = true;
          					break;
          				default:
          					System.out.println("Invalid parameter");
          			}
          		} while(answer == false);

          -
          Edité par aceofglad1 22 juin 2017 à 17:57:16

          • Partager sur Facebook
          • Partager sur Twitter
            22 juin 2017 à 18:10:21

            j'aurai plus fait quelques chose comme ca : 

            Scanner clavier = new Scanner(System.in);
            String confirmation;
            String nom;
            
            do {
            
            	System.out.print("Entrez votre nom : ");
            	nom = clavier.nextLine();
            	System.out.println("Êtes-vous certain pour " + nom + ". (Oui/Non) ?");
            	confirmation = clavier.nextLine();
            
            	while(!"oui".equalsIgnoreCase(confirmation) && !"non".equalsIgnoreCase(confirmation)){
            		System.out.println("[!] ATTENTION [!]");
            		System.out.println("Vous venez d'introduire une mauvaise donnée. Veuillez répondre par 'Oui' ou 'Non'");
            		System.out.println("Êtes-vous certain pour " + nom + ". (Oui/Non) ?");
            		confirmation = clavier.nextLine();
            	}
            
            } while (! "oui".equalsIgnoreCase(confirmation));


            et personnellement j'éviterai au maximum de faire des "switch" dans des "while" surtout pour des choses aussi simple que celle la. 

            • Partager sur Facebook
            • Partager sur Twitter
              22 juin 2017 à 18:18:18

              Il y a une raison particulière à éviter le "switch" dans le "while"? Car je suis aussi novice donc pour prendre des bonnes habitudes de prog je me renseigne ! Car j'ai regarder un peu sur internet et je n'ai vu aucun contrindication :)
              • Partager sur Facebook
              • Partager sur Twitter
                22 juin 2017 à 18:29:11

                Non pas vraiment, mais il y a souvent moyen de faire quelque chose de plus "propre" (une meilleur architecture, un algorithme mieux pensé ...) et sa augmente aussi la complexité d'une méthode (nombre de "chemins" possibles) et dans une démarche OO l'idée d'avoir des méthodes le plus simple et "concentré" sur une tache possible est vraiment intéressante.

                -
                Edité par Splintz 22 juin 2017 à 18:30:26

                • Partager sur Facebook
                • Partager sur Twitter
                  23 juin 2017 à 14:12:01

                  En effet, je ferais comme Brubru777 a dit :

                  boolean accepte = false;
                  
                  do {
                      System.out.print("Entrez votre nom : ");
                      String nom = clavier.nextLine();
                      System.out.println("Êtes-vous certain pour " + nom + ". (Oui/Non) ?");
                      System.out.print("Votre réponse : ");
                      String confirm = clavier.nextLine();
                  
                      if(confirm.toUpperCase().equals("OUI"))
                      	accepte = true;
                      //S'il a répondu autre chose que Oui, on refait un tour de boucle
                  
                  }while(!accepte);

                  voir même :

                  do {
                      System.out.print("Entrez votre nom : ");
                      String nom = clavier.nextLine();
                      System.out.println("Êtes-vous certain pour " + nom + ". (Oui/Non) ?");
                      System.out.print("Votre réponse : ");
                      String confirm = clavier.nextLine();
                  
                  
                  }while(!confirm.toUpperCase().equals("OUI"));


                  J'ai pas tester mais je pense que ça devrait marcher.

                  Edit : et si tu veux tester ta confirmation :

                  boolean accepte = false;
                  
                  do {
                      System.out.print("Entrez votre nom : ");
                      String nom = clavier.nextLine();
                      boolean ok = false;
                  
                      String confirm = "";
                  
                      do{
                      	System.out.println("Êtes-vous certain pour " + nom + ". (Oui/Non) ?");
                  	    System.out.print("Votre réponse : ");
                  	    confirm = clavier.nextLine();
                  
                  	    if(confirm.toUpperCase().equals("OUI") || confirm.toUpperCase().equals("NON"))
                  	        ok = true;
                      	else
                      	    System.out.println("Attention, veuillez répondre par Oui ou Non.");
                  
                      }while(!ok)
                  	    
                      if(confirm.toUpperCase().equals("OUI"))
                      	accepte = true;
                  
                  	    
                  }while(!accepte);



                  -
                  Edité par Punt 23 juin 2017 à 14:26:32

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Problème de boucle

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown