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 :

mon while fonctionne pas comme je veux


Sujet :

avec Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 684
    Points : 147
    Points
    147
    Par défaut mon while fonctionne pas comme je veux
    Bonjour
    je m'explique en exécutant mon prg,
    quand je saisi 3eme no:0,
    il me demande 4eme no aussi;
    normalement dès qu'on saisi le 0, la saisi des nombre doit arrêter.
    veuillez m'aidez svp
    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
     
    import java.util.Scanner;
    public class Testing3 
    {	
    	public static void main(String[] args) 
    	{
    			      int PG=0; //PG veut plus grand
    			      int PPG=0;  //PPG veut dire position de plus grand
     
    			      for(int i=1; i<5; i++)
    			      {
    			    	System.out.println("saissisez un no  :");
    			        Scanner valeur=new Scanner(System.in);
    			        //int N=valeur.nextInt();
    			        int N;
    					while ((N= valeur.nextInt()) != 0) 
    					{
    			          if(i==1 || N>PG)
    			          {
    			 		   PG=N;
    			           PPG=i;
    			          }
    			         break;
    			        }
    			    } 
    			    System.out.println("Le nombre le plus grand était: "+PG) ;
    			    System.out.println("Il a été saisi en position numéro: "+PPG) ;
    		}
    	}
    vous voyez mon output:
    saissisez un no :
    4
    saissisez un no :
    6
    saissisez un no :
    0
    saissisez un no :
    0
    Le nombre le plus grand était: 6
    Il a été saisi en position numéro: 2

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

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    			      for(int i=1; i<5; i++) {
    Tu as fait une boucle à qui tu demandes de tourner 4 fois quoi qu'il arrive là. Faudrait peut-être rajouter une autre condition de sortie comme la dernière saisie


    Et dans la structure de ton programme, vu que tu veux que la saisie se fasse au moins une fois, tu devrais t'orienter vers une boucle de type do{...} while();

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Ton while n'est pas nécessaire est n'est pas logique dans ton cas.

    Ce que tu veux, c'est lire au maximum 4 fois la console et annoncé le plus grand à la fin.

    Voici le code commenté de ce que tu devrais avoir:
    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
    package org.k.developpez.forum;
    import java.util.Scanner;
     
    public class TrouvePlusGrand {
    	public static void main(String[] args) {
    		// On met dans plusGrand la valeur la plus petite possible pour être sur qu'on met mettra à jour cette valeur.
    		int plusGrand = Integer.MIN_VALUE;
    		int positionPlusGrand = 0;
     
    		// On déclare le scanner en dehors de la boucle. Cela évite de le redéclarer à chaque itération.
    		Scanner console = new Scanner(System.in);
    		// On utilse <= pour que le nombre donnée soit le nombre de boucle à réaliser.
    		for (int i = 1; i <= 4; i++) {
    			System.out.println("saissisez un no  :");
    			// On récupère ce que l'utilisateur nous donne.
    			int n = console.nextInt();
    			// Ici on considère que 0 n'est pas à prendre en compte.
    			if (n == 0) {
    				break;
    			}
    			// Mise à jours du plus grand.
    			if (n > plusGrand) {
    				plusGrand = n;
    				positionPlusGrand = i;
    			}
    			// On pourrait prendre en compte la valeur 0 en placant le test pour sortir de la boucle ici.
    		}
    		// On ferme le flux à la fin pour être propre.
    		console.close();
    		System.out.println("Le nombre le plus grand était: " + plusGrand);
    		System.out.println("Il a été saisi en position numéro: " + positionPlusGrand);
    	}
    }
    Cordialement,
    Patrick Kolodziejczyk.

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

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par kolodz Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    			// Ici on considère que 0 n'est pas à prendre en compte.
    			if (n == 0) {
    				break;
    			}
    Non.... Pitié... Pas un break là dedans...
    Faut arrêter d'utiliser des break/continue qui ne sont que des solutions moches pour forcer la sortie d'un algo qui peut être propre !

    Ce qu'on veut faire, c'est ça :
    - Lire un chiffre
    - vérifier s'il est le plus grand, si oui on stocke son rang et sa valeur
    Jusqu'à ce que le chiffre saisi soit 0
    Afficher la valeur et son rang

    Du coup, on fait ça

    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
     
    public static void main(String[] args) {
    		int PG = 0; // PG veut plus grand
    		int PPG = 0; // PPG veut dire position de plus grand
     
    		int nbSaisi = 0;
    		int i = 1;
    		Scanner valeur = new Scanner(System.in);
    		do {
    			System.out.println("saissisez un no  :");
     
    			nbSaisi = valeur.nextInt();
    			if (i == 1 || nbSaisi > PG) {
    				PG = nbSaisi;
    				PPG = i;
    			}
    			i++;
    		} while (nbSaisi != 0 || i < 5);
    		valeur.close();
    		System.out.println("Le nombre le plus grand était: " + PG);
    		System.out.println("Il a été saisi en position numéro: " + PPG);
    	}
    Plus court, plus simple, plus lisible, plus proche de ce qu'on veut faire réellement

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 684
    Points : 147
    Points
    147
    Par défaut
    Citation Envoyé par eulbobo Voir le message
    Non.... Pitié... Pas un break là dedans...
    Faut arrêter d'utiliser des break/continue qui ne sont que des solutions moches pour forcer la sortie d'un algo qui peut être propre !

    Ce qu'on veut faire, c'est ça :
    - Lire un chiffre
    - vérifier s'il est le plus grand, si oui on stocke son rang et sa valeur
    Jusqu'à ce que le chiffre saisi soit 0
    Afficher la valeur et son rang

    Du coup, on fait ça

    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
     
    public static void main(String[] args) {
    		int PG = 0; // PG veut plus grand
    		int PPG = 0; // PPG veut dire position de plus grand
     
    		int nbSaisi = 0;
    		int i = 1;
    		Scanner valeur = new Scanner(System.in);
    		do {
    			System.out.println("saissisez un no  :");
     
    			nbSaisi = valeur.nextInt();
    			if (i == 1 || nbSaisi > PG) {
    				PG = nbSaisi;
    				PPG = i;
    			}
    			i++;
    		} while (nbSaisi != 0 || i < 5);
    		valeur.close();
    		System.out.println("Le nombre le plus grand était: " + PG);
    		System.out.println("Il a été saisi en position numéro: " + PPG);
    	}
    j'attire l'attention de
    Plus court, plus simple, plus lisible, plus proche de ce qu'on veut faire réellement
    mais avez vous vérifier output de votre prg, ça donne même résultat que la mienne
    output est:
    saissisez un no :
    2
    saissisez un no :
    3
    saissisez un no :
    0
    saissisez un no :
    0
    Le nombre le plus grand était: 3
    Il a été saisi en position numéro: 2

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 085
    Points : 8 002
    Points
    8 002
    Par défaut
    Parce que la condition du while n'est pas bonne, à cause du OU. Un cas basique que tu aurais put toi même corrigé. Mais il manquera le cas du quand on tappe 0 comme premier chiffre a traiter en plus.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 684
    Points : 147
    Points
    147
    Par défaut
    Citation Envoyé par kolodz Voir le message
    Ton while n'est pas nécessaire est n'est pas logique dans ton cas.

    Ce que tu veux, c'est lire au maximum 4 fois la console et annoncé le plus grand à la fin.

    Voici le code commenté de ce que tu devrais avoir:
    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
    package org.k.developpez.forum;
    import java.util.Scanner;
     
    public class TrouvePlusGrand {
    	public static void main(String[] args) {
    		// On met dans plusGrand la valeur la plus petite possible pour être sur qu'on met mettra à jour cette valeur.
    		int plusGrand = Integer.MIN_VALUE;
    		int positionPlusGrand = 0;
     
    		// On déclare le scanner en dehors de la boucle. Cela évite de le redéclarer à chaque itération.
    		Scanner console = new Scanner(System.in);
    		// On utilse <= pour que le nombre donnée soit le nombre de boucle à réaliser.
    		for (int i = 1; i <= 4; i++) {
    			System.out.println("saissisez un no  :");
    			// On récupère ce que l'utilisateur nous donne.
    			int n = console.nextInt();
    			// Ici on considère que 0 n'est pas à prendre en compte.
    			if (n == 0) {
    				break;
    			}
    			// Mise à jours du plus grand.
    			if (n > plusGrand) {
    				plusGrand = n;
    				positionPlusGrand = i;
    			}
    			// On pourrait prendre en compte la valeur 0 en placant le test pour sortir de la boucle ici.
    		}
    		// On ferme le flux à la fin pour être propre.
    		console.close();
    		System.out.println("Le nombre le plus grand était: " + plusGrand);
    		System.out.println("Il a été saisi en position numéro: " + positionPlusGrand);
    	}
    }
    Cordialement,
    Patrick Kolodziejczyk.
    merci beaucoup

  8. #8
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Citation Envoyé par eulbobo Voir le message
    Non.... Pitié... Pas un break là dedans...
    Faut arrêter d'utiliser des break/continue qui ne sont que des solutions moches pour forcer la sortie d'un algo qui peut être propre !

    Ce qu'on veut faire, c'est ça :
    - Lire un chiffre
    - vérifier s'il est le plus grand, si oui on stocke son rang et sa valeur
    Jusqu'à ce que le chiffre saisi soit 0
    Afficher la valeur et son rang

    Du coup, on fait ça

    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
     
    public static void main(String[] args) {
    		int PG = 0; // PG veut plus grand
    		int PPG = 0; // PPG veut dire position de plus grand
     
    		int nbSaisi = 0;
    		int i = 1;
    		Scanner valeur = new Scanner(System.in);
    		do {
    			System.out.println("saissisez un no  :");
     
    			nbSaisi = valeur.nextInt();
    			if (i == 1 || nbSaisi > PG) {
    				PG = nbSaisi;
    				PPG = i;
    			}
    			i++;
    		} while (nbSaisi != 0 || i < 5);
    		valeur.close();
    		System.out.println("Le nombre le plus grand était: " + PG);
    		System.out.println("Il a été saisi en position numéro: " + PPG);
    	}
    Plus court, plus simple, plus lisible, plus proche de ce qu'on veut faire réellement
    Sauf que dans ton cas, tu ne maitrise pas quand tu réalise ton test à l'intérieur de la boucle. Ce qui fait que si tu ne veux pas prendre en compte la valeur 0... Tu ne peux pas.

    Les break et les continue ne sont pas des solutions moches. Pas plus que la logique du return en milieu de fonction. Pour rappel, le standard Java en est truffé ! Et on ne peux pas dire que le code de l'API standard soit "moche". (A ce niveau là c'est du foutage de gueule.)

    D'autant plus que ta proposition ne retiens rien des bonnes pratiques.
    Le while n'est pas à utiliser dans le cas où tu incrémente un variable à chaque passage dans la boucle. Car on se retrouve avec l'incrémentation dans le corps de la boucle. Ce fameux i++; n'est là par un défaut de choix dans la structure de boucle utilisé.

    De même, le cas spécifique pour i==0, que j'avais corrigé et expliqué et présent dans ton code. Or quand on fait du code propre, on évite les cas spécifique le plus possible.

    A la limite, si tu considère que le break n'est pas propre tu devrais avoir un code ressemblant à cela :

    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
    package org.k.developpez.forum;
    import java.util.Scanner;
     
    public class TrouvePlusGrand {
    	public static void main(String[] args) {
    		// On met dans plusGrand la valeur la plus petite possible pour être sur qu'on met mettra à jour cette valeur.
    		int plusGrand = Integer.MIN_VALUE;
    		int positionPlusGrand = 0;
     
    		// On déclare le scanner en dehors de la boucle. Cela évite de le redéclarer à chaque itération.
    		Scanner console = new Scanner(System.in);
    		// On utilse <= pour que le nombre donnée soit le nombre de boucle à réaliser.
    		boolean finBoucle = false;
    		for (int i = 1; i <= 4 && !finBoucle; i++) {
    			System.out.println("saissisez un no  :");
    			// On récupère ce que l'utilisateur nous donne.
    			int n = console.nextInt();
    			// Ici on considère que 0 n'est pas à prendre en compte.
    			if (n == 0) {
    				finBoucle=true;
    			}
    			// Mise à jours du plus grand.
    			if (n > plusGrand) {
    				plusGrand = n;
    				positionPlusGrand = i;
    			}
    			// On pourrait prendre en compte la valeur 0 en placant le test pour sortir de la boucle ici.
    		}
    		// On ferme le flux à la fin pour être propre.
    		console.close();
    		System.out.println("Le nombre le plus grand était: " + plusGrand);
    		System.out.println("Il a été saisi en position numéro: " + positionPlusGrand);
    	}
    }
    Mais dans tout les cas, on ne code au grand jamais un while pour faire un for.

    Après, si tu veux continuer à affirmer que les break et continue sont à proscrire. Merci de me citer une source qui justifie cela. Car, je n'ai jamais entendu cela. Les goto rendaient le code incompréhensible. Mais ceux-ci ne sont pas présent en Java pour cette raison.

    Cordialement,
    Patrick Kolodziejczyk.

Discussions similaires

  1. Ma boucle ne fonctionne pas comme je le veux !
    Par Noob380 dans le forum Débuter
    Réponses: 9
    Dernier message: 29/11/2011, 17h03
  2. Mon programme ne fonctionne pas comme je veux
    Par menoulette dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 22/04/2011, 01h16
  3. Mon filtre automatique ne fonctionne pas comme je veux
    Par La Zélie dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/11/2008, 18h32
  4. un if qui ne fonctionne pas comme je veux
    Par Kelly182 dans le forum Access
    Réponses: 4
    Dernier message: 27/07/2006, 16h12
  5. [Tableaux] boucle while qui ne boucle pas comme je veux
    Par oceane751 dans le forum Langage
    Réponses: 5
    Dernier message: 05/06/2006, 01h42

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