Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème débutant

Je ne comprend pas ce qui se passe...

Sujet résolu
    14 avril 2012 à 21:31:58

    Bonjour ! Alors voilà, j'ai fouillé un peu sur Internet en quête d'exercices en console, et je suis tombé sur un qui me demandait
    Afficher en console une ligne discontinue composée de tirets et d'espaces. La ligne est composée de a fois le caractère tiret -, suivi de b fois la caractère espace. Le motif doit se répéter c fois. Le motif présenté en console devra être obtenu avec l'appel à une méthode drawLine (a, b, c).
    Pour le faire, aucun problème (J'ai réussit d'un coup, ça m'a même surprit ! o_O ). Mais voilà : J'ai voulu "agrandir" un peu mon code, en y ajoutant un menu. Et voilà le problème qui se presente à moi...
    Voilà mon main():
    import java.util.Scanner;
    
    
    public class main {
    
    
    	public static void main(String[] args) {
    		Scanner scan = new Scanner(System.in);
    		int choix = 0;
    		char reponse = 'R';
    		String reponse2;
    		
    		do{
    			do{
    				System.out.println("Que voulez-vous faire ?");
    				System.out.println("Utiliser la méthode drawLine (1)");
    				choix = scan.nextInt();
    				scan.nextLine();
    				if(choix != 1)
    					System.out.println("T'as écrit n'importe quoi, apprend à lire !");
    			}while(choix != 1);
    
    			switch (choix){
    		
    			case 1:
    			{
    				System.out.println("Entrez le nombre de tirets.");
    				int a = scan.nextInt();
    		
    				System.out.println("Entrez le nombre d'espaces entre les tirets.");
    				scan.nextLine();
    				int b = scan.nextInt();
    		
    				System.out.println("Entrez le nombre de fois que le patern se répètera.");
    				scan.nextLine();
    				int c = scan.nextInt();
    		
    				drawLine(a,b,c);
    				
    				do{
    					System.out.println("Recommencer ? [O/N]");
    					reponse2 = scan.nextLine();
    				}while(reponse2 != "O" || reponse2 != "N");
    				break;
    			}
    			default:
    			
    			}
    			
    			System.out.println("Retourner au menu ou quitter ? [R/Q]");
    			reponse = scan.nextLine().charAt(0);
    			
    		}while(reponse=='R');
    	}
    	
    	public static void drawLine(int i, int j, int k){
    		String tiret = "";
    		for(int a=0;a<i;a++)
    			tiret = tiret + "-";
    		
    		String espace = "";
    		for(int b=0;b<j;b++)
    			espace = espace + " ";
    		
    		String resolutionFinal = "";
    		for (int c=0;c<k;c++)
    			resolutionFinal = resolutionFinal + (tiret + espace);
    		System.out.println(resolutionFinal);
    			
    	}
    
    }
    


    Et la ligne qui me pose problème est apparemment celle-ci:
    System.out.println("Retourner au menu ou quitter ? [R/Q]");
    			reponse = scan.nextLine().charAt(0);
    


    Puisque dqns mq console, j'obtiens ça:
    Que voulez-vous faire ?
    Utiliser la méthode drawLine (1)
    1
    Entrez le nombre de tirets.
    2
    Entrez le nombre d'espaces entre les tirets.
    3
    Entrez le nombre de fois que le patern se répètera.
    4
    --   --   --   --   
    Recommencer ? [O/N]
    Recommencer ? [O/N]
    O
    Recommencer ? [O/N]
    sdf
    Recommencer ? [O/N]
    N
    Recommencer ? [O/N]
    


    Que se passe-t-il ?! :colere2:
    • Partager sur Facebook
    • Partager sur Twitter
      14 avril 2012 à 22:05:09

      }while(reponse2 != "O" || reponse2 != "N");
      


      Cette condition sera toujours vérifiée ;) .

      Cordialement, ^^
      • Partager sur Facebook
      • Partager sur Twitter
        14 avril 2012 à 23:06:16

        Oui, tu as confondu "||", qui signifie "ou" avec "&&" signifiant "et".
        Il faudrait :
        }while(reponse2 != "O" && reponse2 != "N");
        
        • Partager sur Facebook
        • Partager sur Twitter
          15 avril 2012 à 11:29:45

          Ah oui effectivement ^^ mais je reste toujours dans la boucle quand j'arrive au niveau du
          do{
          					System.out.println("Recommencer ? [O/N]");
          					reponse2 = scan.nextLine();
          				}while(reponse2 != "O" && reponse2 != "N");
          				break;
          


          Par exemple, dans la console j'obtiens 2 fois le "Recommencer ? [O/N]", et je n'en sors pas... Comme ça :
          Que voulez-vous faire ?
          Utiliser la méthode drawLine (1)
          1
          Entrez le nombre de tirets.
          1
          1Entrez le nombre d'espaces entre les tirets.
          
          1Entrez le nombre de fois que le patern se répètera.
          
          - 
          Recommencer ? [O/N]
          Recommencer ? [O/N]
          N
          Recommencer ? [O/N]
          N
          Recommencer ? [O/N]
          


          What is the fuque ? :o

          PS: sinon merci de votre réponse ! :)
          • Partager sur Facebook
          • Partager sur Twitter
            15 avril 2012 à 14:18:36

            Tu avais en effet confondu le || et le &&, mais ce n'est pas la seule raison pour laquelle cette condition est toujours vérifiée :

            Les chaines de caractères (Strings) sont des objets en Java.

            En écrivant ceci : reponse2 != "O", tu ne compare pas le contenu de ton objet avec la valeur "O" ; en réalité, tu crées à la volée un nouvel objet avec le contenu "O" et tu le compare avec ton premier objet, ce qui reviens en fait à savoir si ils représentent le même objet, c'est-à-dire si ils ont la même adresse mémoire, ce qui dans ton cas sera toujours faux, et donc ta condition sera toujours vérifiée.

            La comparaison du contenu des Strings en Java se fait via la méthode string1.equals(string2) qui retourne un booléen, ce qui transformerait ta condition en : }while(!reponse2.equals("O") && !reponse2.equals("N"));.

            Cordialement, ;)
            • Partager sur Facebook
            • Partager sur Twitter
              15 avril 2012 à 18:26:38

              Yep ça marche ! Merci beaucoup :D
              • Partager sur Facebook
              • Partager sur Twitter

              Problème débutant

              × 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