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 :

Problème d'instruction break dans une boucle for


Sujet :

Langage Java

  1. #1
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut Problème d'instruction break dans une boucle for
    Bonjour à tous et à toutes,

    Dans le code suivant :

    Code java : 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 static void syracuse(int debut, int fin){
            int value= 0;
            int counter = 0;
            if (debut != fin) {
                for (int n = debut; n <= fin; n++) {
                    System.out.print(n + "");
                    while(value!= 1) {
                        if(n%2 == 0) {
                            value= n/2;
                            System.out.print(" " + value);
                        } else {
                            value= n*3 + 1;
                            System.out.print(" " + value);
                        }
                        counter +=1;
                        if (value==1) {
                            System.out.println();
                            counter -=1;
                            System.out.println("Fly duration is : " + counter);
                            break;
                        }
                        n = value;
                    }
                }
            }
        }

    l'instruction break me permet de sortir du traitement while par contre l'itération dans le for ne se fait plus.

    Merci d'avance.
    Transact

  2. #2
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    J'ai modifié mon code de la façon suivante :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     if (value ==1) {
                            counter -=1;
                            n = debut;
                            System.out.println(" => Fly duration is : " + counter);
                            break;
                        }

    en réinitialisant n, par contre l'itération ne se fait toujours pas.
    En fait après la première itération, la valeur de value vaut 1 donc le traitement du while(value != 1) ne se fait jamais.

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je ne comprends pas la logique de ton while.tu boucle pour n de début à fin. Mais dans ton while tu met n à 1 à chaque fois.

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    Comme tu l'as dis toi même et aussi tchize_, ta value vaut 1, donc après le 1er passage cela ne boucle plus !

    C'était ce que tu cherchais ? as tu encore besoin d'aide ?
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    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
    Je vais ressortir mon argument qui a tendance à créer un raz de marée de débats par forcément utile, mais en algorithmie, le break est une hérésie.
    Si on a une condition/un cas de sortie, on l'attribue à une variable et à un test qui permet de sortir proprement de la boucle désirée.

    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
     
    public static void syracuse(int debut, int fin){
            int value= 0;
            int counter = 0;
     
            if (debut != fin) {
                for (int n = debut; n <= fin; n++) {
                    boolean exitWhile = false;
                    System.out.print(n + "");
                    while(value!= 1 && !exitWhile) {
                        if(n%2 == 0) {
                            value= n/2;
                            System.out.print(" " + value);
                        } else {
                            value= n*3 + 1;
                            System.out.print(" " + value);
                        }
                        counter +=1;
                        if (value==1) {
                            System.out.println();
                            counter -=1;
                            System.out.println("Fly duration is : " + counter);
                            exitWhile = true;
                        } else {
                            n = value;
                        }
                    }
                }
            }
        }
    Je ne suis pas mort, j'ai du travail !

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par eulbobo Voir le message
    Je vais ressortir mon argument qui a tendance à créer un raz de marée de débats par forcément utile, mais en algorithmie, le break est une hérésie.
    Tout à fait, c'est pour ça que j'utilise toujours un break <label>, moins de confusion . On ne va pas rentrer dans le débat, dans certains cas le break est plus lisible qu'un marqueur. Ca dépends de la complexité de la boucle. Et c'est le même débat qu'entre le return dans le code ou à la fin de fonction. Il y a les règles de bases et les exceptions dans des cas particuliers. C'est comme le copier coller de code: ça peut se faire, mais ça doit être vachement justifié

    Au passage dans le code que tu donne, c'est un mauvais exemple, le exitWhile ne sert à rien. Il n'est à true que quand valeur==1, ce qui est déjà testé dans le while.

    PS: je suis curieux de voir comment tu gère tes switch sans break

  7. #7
    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 tchize_ Voir le message
    PS: je suis curieux de voir comment tu gère tes switch sans break
    Je fais pas de switch
    Et sinon, je mets des break dans mes switch mais on a pas trop le choix, c'est la forme du switch qui veut ça (même si des fois je n'en met pas... volontairement... puissant le switch !)

    Au passage dans le code que tu donne, c'est un mauvais exemple, le exitWhile ne sert à rien. Il n'est à true que quand valeur==1, ce qui est déjà testé dans le while.
    Je n'ai fait que reprendre le code existant en reprenant exactement la logique et en ajoutant une condition de sortie, je sais pas ce que le code de base est censé faire, du coup j'ai posté son équivalent avec une condition de sortie... Ce qui permet de voir d'un coup qu'effectivement il y a un soucis.

    Le break<label>, c'est violent, mais au moins, on est sûr de savoir où on retourne, donc je préfère à un break simple !
    Je ne suis pas mort, j'ai du travail !

  8. #8
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    En effet, il est plus pertinent de créer un booléen qui permettra de sortir "proprement" de la boucle le cas échéant.
    Cependant cela ne corrige pas mon problème , mais il s'agit davantage de l'écriture de la condition de continuité de la boucle while.
    En fin de compte ce que je voudrais, c'est que la boucle while puisse continuer à effectuer le calcul de la conjecture pour les autres valeurs de l'intervalle.
    Il faudrait qu'à la fin du premier élément de l'intervalle la valeur de value ne soit plus 1 mais soit réinitialisée.

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Le plus intelligent serait de faire une autre méthode, void syracuse(int n), et de l'appeler en boucle pour toutes les valeurs voulues. Plus d'imbrication, plus de confusion.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    Cette méthode existe déjà mais dans cette deuxième partie de l'exercice , il faut créer un intervalle de valeurs ... l'objectif est de complexifier l'exercice.

  11. #11
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    Tout compte fait, je fais ré-utiliser ma méthode void syracuse(int n) en faisant une boucle for sur un intervalle mis en paramètre , voici ce que cela me donne :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public static void syracuse(int start, int end){
            for (int i = start; i <end ; i++) {
                syracuse(i);
            }
        }

    Plus court et plus concis.
    Merci encore.

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Le problème étant bien sûr qu'on n'exploite pas les résultats déjà calculés d'un appel à l'autre.
    Tu n'essayais déjà pas de le faire dans tes boucles imbriquées et je pensais donc que ça ne t'intéressait pas.

    Mais si c'est un exercice, peut-être que la solution d'appeler la première méthode en boucle était évidente, et que donc il y avait encouragement à réfléchir pour ne pas calculer plusieurs fois la même chose. (Enfin, s'il faut vraiment indiquer toutes les étapes à chaque fois au lieu de juste le fly time, ce n'est pas vraiment possible de ne pas recalculer.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/01/2011, 11h38
  2. Problème d'écriture dans une boucle for
    Par manaliac dans le forum Général Python
    Réponses: 1
    Dernier message: 13/07/2010, 17h46
  3. [Embedded Function] Problème dans une boucle FOR-END
    Par roilait dans le forum Simulink
    Réponses: 6
    Dernier message: 19/04/2008, 15h55
  4. Problème d'indexage dans une boucle FOR-END
    Par RAMZOON dans le forum MATLAB
    Réponses: 3
    Dernier message: 19/10/2007, 01h59
  5. Problème avec une DLL dans une boucle For
    Par BraDim dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2005, 13h22

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