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

Langage Java Discussion :

Boucle sans fin ?!


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    En formation
    Inscrit en
    Septembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : En formation

    Informations forums :
    Inscription : Septembre 2015
    Messages : 15
    Par défaut Boucle sans fin ?!
    Bonjour,

    Voila je suis en train de bosser sur un TP qui d'après une plage donnée et un pas donné doit convertir les valeurs (celsius) en degrés fahrenheit, jusque là tout va bien, j'ai fait mon prog samedi ça marchait nickel, je le relance ce soir (mon PC est resté allumé et accessible à des petites mains peu soigneuses) et là c'est le drame le programme ne marche plus du tout comme samedi, il tourne en rond au niveau du premier deuxième do while.

    C'est comme si il ne lisait jamais le scanner : rep1 = scan2.nextLine().charAt(0); et je ne comprend pas pourquoi . . . .

    Je suis sur et certain que ça tient à rien du tout (bon du coup j'ai rebidouillé mon prog j'espère que j'ai pas foutu la merde )

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    package Basic;
    import java.util.Scanner;
     
    public class Farenheit {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int init=0,max=0,pas=0;
    		double far;
    		char rep1='N', rep2 = 'O';
    		Scanner scan = new Scanner(System.in);
    		Scanner scan2 = new Scanner(System.in);
    		double coeff = 9.0/5.0;
     
    		System.out.println("CONVERSION DE DEGRES CELSIUS EN DEGRES FARHENHEIT");
     
     
    	do {
     
    		do {
    		  // Demande Initialisation des bornes 
     
    			init= 0;
    			max= 0; 
    			pas = 0;
     
    			System.out.println("A partir de : ");
    			init = scan.nextInt();
     
    			System.out.println("Jusqu'à : ");
    			max = scan.nextInt();
     
    			System.out.println("Par pas de : ");
    			pas = scan.nextInt();
     
    			System.out.println("Assurez-vous que l'imprimante est prête");
     
    			System.out.println("Si vous êtes sur des bornes tapez *O*");
    			rep1 = scan2.nextLine().charAt(0);
     
    		 }
    			while (rep1 != 'O' || rep1 !='o');			
    			// Fin boucle Tant que réponse "êtes vous sur des bornes" !=O
     
    		System.out.println("Table de conversion de degrés Celsius en degrés Farhenheit");
    		System.out.println("Celsius      Farhenheit"); 
     
     
     
    		for (int i = init; i < max+1; i=i+pas) { // Conversion des valeurs pour les bornes init et max données 
     
    			far = (coeff*i + 32);
     
    			System.out.println(+i+ "              "+ far);
     
     
    		} // Fin boucle For 
     
    		System.out.println("Souhaitez vous éditer une autre table ? (O/N)");
    		rep2 = scan2.nextLine().charAt(0);
     
    	} while (rep2=='O' || rep2=='o') ; // Fin boucle éditer une table
     
    		System.out.println("Au revoir et à bientôt !");
     
     
    		scan.close();
    		scan2.close();
    			}
     
     
    		}

    Merci pour votre aide !!!!

    Ben

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Bonjour,

    Effectivement, c'est une petite erreur.
    Je vais juste te donnée la ligne et un indice.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (rep1 != 'O' || rep1 !='o');
    Porte logique OU-NON ou ET-NON ?

    Je pense qu'une fois que tu aura trouvé l'erreur tu ne comprendra pas pourquoi tu ne l'as pas trouvé plus tôt !

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    L'erreur que tu vois se situe ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (rep1 != 'O' || rep1 !='o');
    Ah bah oui, ça c'est une boucle sans fin, forcément.
    Si la première condition est vérifiée, alors la boucle continue. Sinon, alors rep1 == 'O' et donc quand on passe à la deuxième condition, c'est elle qui est validée et la boucle continue.
    Donc dans tous les cas, la boucle continue -_-°.


    À part ça :
    technique intéressante que d'avoir deux Scanners, un pour lire les tokens, et un pour lire les lignes.
    Je le reconnais, ça marche souvent. Mais il n'y a pas de raison que ça marche. Ce n'est pas garanti. Tu as juste de la chance que System.in et Scanner ont décidé de fonctionner d'une façon particulière qui fait que ça marche par hasard. Ce ne sera pas toujours le cas.

    Normalement on ne peut pas faire plus d'un Scanner sur le même flux. Donc on ne peut pas avoir scan et scan2. Il en faut un seul. Et quelque part tu devrais te rendre compte tout seul que tu n'as pas de raison de lire les entrées claviers à l'aide de deux objets différents.

    Mais, bien sûr, si on remplace tous les scan2 par scan, ça ne marche pas. Parce que nextLine().charAt(0), appelé juste après nextInt(), va lire tout ce qu'il y a après le dernier int lu, et jusqu'à la fin de la ligne. Tout, c'est à dire rien. Après le dernier int lu, on a appuyé sur Entrée et donc la fin de la ligne est tout de suite après. Donc nextLine() renvoie une ligne vide et on ne peut pas extraire son premier caractère. Ouf !

    La solution facile contre ça, est d'appeler nextLine() et d'en ignorer la valeur, après chaque nextInt(), nextDouble(), etc.
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    System.out.println("A partir de : ");
    init = scan.nextInt();
    scan.nextLine();
     
    System.out.println("Jusqu'à : ");
    max = scan.nextInt();
    scan.nextLine();
     
    System.out.println("Par pas de : ");
    pas = scan.nextInt();
    scan.nextLine();
    La solution plus élégante, est de ne jamais appeler nextInt(), nextDouble() etc quand on attend un appui sur Entrée. Parce que l'utilisateur risque de taper plusieurs choses et qu'on n'en lira qu'une. Ce n'est pas bon.
    Il vaut mieux faire uniquement des nextLine(), et parser ensuite en int (en faisant donc une erreur si l'utilisateur se trompe)

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    System.out.println("A partir de : ");
    init = Integer.parseInt(scan.nextLine());
     
    System.out.println("Jusqu'à : ");
    max = Integer.parseInt(scan.nextLine());
     
    System.out.println("Par pas de : ");
    pas = Integer.parseInt(scan.nextLine());
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Homme Profil pro
    En formation
    Inscrit en
    Septembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : En formation

    Informations forums :
    Inscription : Septembre 2015
    Messages : 15
    Par défaut
    Bonsoir,

    Tout d'abord merci de votre aide et de tes explications précises thelvin ! Je débute vraiment en JAVA (cours du soir à la maison) donc c'est vrai que mes codes sont pas franchement propres pour un initié...

    J'ai tenté diverses modifs, mais rien n'y fait je trouve pas la bonne solution.... je vais pas tarder à dézinguer mon pc

    J'ai modifié les scanners en un seul scanner comme indiqué par thelvin, mais je pense que ya un truc qui m'échappe sur le do while...

    Dans le cas ci-dessous, je sort automatiquement des deux boucles (c'est bien c'est l'inverse de tout à l'heure....)

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    package Basic;
    import java.util.Scanner;
     
    public class Farenheit {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int init=0,max=0,pas=0;
    		double far;
    		String rep1, rep2;
    		Scanner scan = new Scanner(System.in);
     
    		double coeff = 9.0/5.0;
     
    		System.out.println("CONVERSION DE DEGRES CELSIUS EN DEGRES FARHENHEIT");
     
     
    	do {
     
    		do {
    		  // Demande Initialisation des bornes 
     
    			init= 0;
    			max= 0; 
    			pas = 0;
     
    			System.out.println("A partir de : ");
    			init = Integer.parseInt(scan.nextLine());
     
     
    			System.out.println("Jusqu'à : ");
    			max = Integer.parseInt(scan.nextLine());
     
     
    			System.out.println("Par pas de : ");
    			pas = Integer.parseInt(scan.nextLine());
     
     
    			System.out.println("Assurez-vous que l'imprimante est prête");
     
    			System.out.println("Si vous êtes sur des bornes tapez(O/N)");
    			rep1 = scan.nextLine();
     
    		 }
    			while (rep1 == "N" || rep1 =="n");			
    			// Fin boucle Tant que réponse "êtes vous sur des bornes" !=O
     
    		System.out.println("Table de conversion de degrés Celsius en degrés Farhenheit");
    		System.out.println("Celsius      Farhenheit"); 
     
     
     
    		for (int i = init; i < max+1; i=i+pas) { // Conversion des valeurs pour les bornes init et max données 
     
    			far = (coeff*i + 32);
     
    			System.out.println(+i+ "              "+ far);
     
     
    		} // Fin boucle For 
     
    		System.out.println("Souhaitez vous éditer une autre table ? (O/N)");
    		rep2 = scan.nextLine();
     
    	} while (rep2=="O" || rep2=="o") ; // Fin boucle éditer une table
     
    		System.out.println("Au revoir et à bientôt !");
     
     
    		scan.close();
     
    			}
     
     
    		}

  5. #5
    Membre averti
    Homme Profil pro
    En formation
    Inscrit en
    Septembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : En formation

    Informations forums :
    Inscription : Septembre 2015
    Messages : 15
    Par défaut
    EUREKA !!!!!!!!!!!
    C'était sur la comparaison des String que je me viandais apparemment

    J'ai changé mes :
    while (rep1 == "N" || rep1 =="n");
    while (rep2=="O" || rep2=="o") ;

    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (rep1.equalsIgnoreCase("N"));	
    //et 
    while (rep2.equalsIgnoreCase("O"))
    Et là tout fonctionne à merveille ! ! ! ! !

    CHAMPAGNE !!!!! :p

    Merci à vous deux en tout cas

    Si vous aviez une autre solution n'hésitez pas ça me fera toujours l'occasion d'apprendre davantage !


    Ben

  6. #6
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Aujourd'hui tu as appris quelque chose : on ne compare jamais deux objets avec un == (sauf si on veut vérifier une égalité de pointeur, ce qui est rarement le cas)

    Toujours utiliser un equals (ou equalsIgnoreCase dans ton cas). Et vérifier que la chaine à comparer n'est pas null

    Du coup, il existe une astuce pour comparer les chaines de caractère en gérant les cas de nullité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while ("N".equalsIgnoreCase(rep1));	
    //et 
    while ("O".equalsIgnoreCase(rep2))
    Ici, pas besoin de tester la nullité de rep1 et rep2 avant, et aucun risque d'obtenir un NullPointerException

  7. #7
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Pour information :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (rep1 != 'O' || rep1 !='o');
    Retour toujours true, car soit on a rep1 != 'O' ou rep1 != 'o'. Car rep1 ne peut pas être ces deux caractères à la fois.
    Il faut donc remplacer le ou par un et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (rep1 != 'O' && rep1 !='o');
    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/11/2009, 16h22
  2. [Débutant]Boucle sans fin : Wend non reconnu
    Par SebHoule dans le forum IHM
    Réponses: 5
    Dernier message: 12/06/2006, 16h49
  3. C : utilisation de getopt - il boucle sans fin...
    Par moussmouss dans le forum C
    Réponses: 14
    Dernier message: 21/12/2005, 11h35
  4. Boucle sans fin : danger pour le serveur ?
    Par Rémiz dans le forum Langage
    Réponses: 4
    Dernier message: 09/12/2005, 16h52
  5. [SQL SERVER 2000] Fonction utilisateur : boucle sans fin
    Par galinijay dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 30/09/2005, 16h03

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