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

C Discussion :

question sur une boucle et un break


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut question sur une boucle et un break
    Bonjour

    j'aurai une question à demander.
    si j'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for (i=0;i<2;i++) 
    {
          if (T[i][colonne_pivot]>0)
           {
             bornee=1;
             break; 
           }
          else
           {
             bornee=0;
           }
    }
    je voudrai que le programme sort de la boucle for avec mon "break" si bornee=1 mais qu'il reste dans la boucle for si break=0.

    DONC dans mon code, le break me permet de sortir du if mais sort t'il aussi de la boucle for? ou alors je dois rajouter un 2ème break juste avant la dernière accolade pour sortir de la boucle for?

    je veux que si mon programme rencontre la valeur 1 alors il sort de la boucle for (en mettant bornee=1).
    Si mon programme rencontre la valeur (-2) alors il sort de la boucle if (en mettant bornee=0) et ensuite quand il rencontre la valeur (1) il sort de la boucle for (en mettant bornee=1).

    je ne suis pas sûr de mon code avec le break , s'il sort que du if ou si je dois rajouter un autre break pour qu'il sorte de la boucle for.

    merci

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut Rappel: les boucles sont interchangeables ;)
    Salut,

    Tu as deux solutions:

    Soit tu utilises une autre sorte de boucle (un do... while() semble l'idéal)

    Soit tu force la valeur de i dans ton test de manière à ce que tu n'entre plus dans la boucle...

    Le code avec la boucle "pour":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for (i=0;i<2;i++) 
    {
          if (T[i][colonne_pivot]>0)
           {
             bornee=1;
             i=2;/* ou n'importe quelle valeur qui ne soit pas plus petite que 2 */
           }
          else
           {
             bornee=0;
           }
    }
    qui pourrait logiquement etre améliorée sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    bornee=0;/*par défaut, ce n'est pas borné ;) */
    for (i=0;i<2;i++) 
    {
          if (T[i][colonne_pivot]>0)
           {
             bornee=1;
             i=2;/* ou n'importe quelle valeur qui ne soit pas plus petite que 2 */
           }
    /* plus besoin de dire que bornee vaut 0 si le test n'est pas vérifié ;) */
    }
    avec une boucle do... while()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    i=0;
    bornee=0 /* par défaut, ce n'est pas borné ;) */
    do
    {
        if (T[i][colonne_pivot]>0)
        {
            bornee=1;
        }
        ++i;
    }while(i>=2 && bornee!=1);

  3. #3
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    je trouve que c'est plus lisible avec un bon gros break en plein milieu plutot que de trippoter les indices de boucle ...

    m'enfin, ça n'engage que moi.

    DONC dans mon code, le break me permet de sortir du if mais sort t'il aussi de la boucle for? ou alors je dois rajouter un 2ème break juste avant la dernière accolade pour sortir de la boucle for?
    hmm ...
    break permet de "sortir" (de maniere <<violente>>) d'une boucle (ou d'un switch).
    break n'as aucun effet sur ton 'if', placé la ou il est, il s'applique a la boucle for.

    --
    pour reprendre le 'do while', mais avec un for. (pas forcement plus lisible)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i=0,borne=0;i<2 && borne==0;i++) 
    {
          if (T[i][colonne_pivot]>0)
             bornee=1;
    }

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par Dark_Ebola
    je trouve que c'est plus lisible avec un bon gros break en plein milieu plutot que de trippoter les indices de boucle ...

    m'enfin, ça n'engage que moi.
    Au temps pour moi...

    A me relire, c'est vrai que je donne l'impression qu'il n'y a que les deux solutions que j'ai données...

    Personnellement, mais cela n'engage aussi que moi, j'ai un faible pour l'implémentation sous forme de boucle do while() qui, à mon gout, reflete peut etre mieux ce que l'on veut faire...

    Il est vrai que tripoter l'indice de la boucle est quelque chose que je n'aime pas énormément non plus... mais que je préfère quand meme à l'utilisation d'un break dans une boucle itérative...

    C'est encore une fois la preuve qu'il n'y a pas de mauvaise manière de faire mais qu'il n'y a que des manières préférées

  5. #5
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut Dans la série les goûts et les couleurs...
    Si tu es soumis à des règles de codage qui t'interdisent:

    -l'utilisation des breaks (assez fréquent),
    -la modification d'un compteur de boucle dans une boucle for (plus rare),
    -l'utilisation de goto (très fréquent),

    tu peux aussi introduire un indicateur de terminaison que tu testes à chaque itération en même temps que l'évolution du indice de boucle.

    J'avoue que, personnellement et sans contraintes, j'ai plutôt tendance à utiliser la modification du compteur, mais s'il y a une règle je la respecte même lorsqu'elle me semble à la limite de la paranoïa.

    Même des règles de codage "mauvaises" ont au moins l'avantage de standardiser le style de codage et donc de faciliter la maintenance.
    Chaque développeur à un style différent (on viens de voir à l'instant que les 3 avis solicités sont différents ).
    Si un soft doit voir passer une quinzaine de développeurs il vaut mieux lisser les différences sinon .

  6. #6
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    Le code posté dans la question est correct.

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par isidore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for (i=0;i<2;i++) 
    {
          if (T[i][colonne_pivot]>0)
           {
             bornee=1;
             break; 
           }
          else
           {
             bornee=0;
           }
    }
    je voudrai que le programme sort de la boucle for avec mon "break" si bornee=1 mais qu'il reste dans la boucle for si break=0.
    C'est pas très bien rédigé, mais OK.
    (Tel que le code est écrit, la condition de sortie est 'T[i][colonne_pivot]>0' et non la valeur de 'bornee' qui en est la conséquence...)

    Ta description correspond à ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       for (i=0; i < 2; i++) 
       {
          bornee = T[i][colonne_pivot] > 0;
          if (bornee)
          {
             break; 
          }
       }
    C'est plus comme ça que j'aurais écrit ce code... (je rappelle qu'une expression logique retourne 0 ou 1) voire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       int bornee = 0;
       for (i = 0; !bornee && i < 2; i++) 
       {
          bornee = T[i][colonne_pivot] > 0;
       }
    Ce que je trouve encore plus simple et plus clair.
    DONC dans mon code, le break me permet de sortir du if mais sort t'il aussi de la boucle for? ou alors je dois rajouter un 2ème break juste avant la dernière accolade pour sortir de la boucle for?
    Confusion ! Un break permet de sortir d'une structure de code itérative (for, while, do-while), ou d'un switch-case, mais pas d'un if ni d'un if-else.

    Le code est donc correct.

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Dark_Ebola
    je trouve que c'est plus lisible avec un bon gros break en plein milieu plutot que de trippoter les indices de boucle ...
    +1 ou alors utiliser le flag dans la condition de sortie.

  9. #9
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut
    Le problème de la lisibilité vient lorsque l'on a plusieurs niveaux d'imbrication de boucles.
    Mais bon, c'est une question d'habitude et de style...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    Merci Lunixinclar pour sa réponse claire

    thanks to others pour les différentes manières de coder

    perso je préfère un for plutot qu'un do while et éviter les &&

    un code plus long mais plus explicite donc un break est pour moi plus logique (on sort point barre), c + simple pour moi

    merci encore pour toutes vos réponses

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par isidore
    Merci Lunixinclar pour sa réponse claire

    thanks to others pour les différentes manières de coder

    perso je préfère un for plutot qu'un do while et éviter les &&

    un code plus long mais plus explicite donc un break est pour moi plus logique (on sort point barre), c + simple pour moi

    merci encore pour toutes vos réponses
    Comme je l'ai écrit plus haut, les égouts et les couleuvres, ca se discute pas...

    (heuuu... pardon... "les gouts et les couleurs", ca ne se discute pas).

    A titre purement personnel, je dois dire que j'ai horreur de forcer la sortie d'une boucle en dehors du test de la condition pour y retourner...

    J'ai donc, mais ce n'est qu'un avis strictement personnel, tendance à honnir les codes du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for(;;)
    {
        ...
        if(condition)
            break;
    }
    ou du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while(1)
    {
        ...
        if(condition)
            break;
    }
    que ce soit avec une boucle "do while" ou une boucle "while", d'ailleurs...

    Simplement parce que j'ai tendance à estimer que le la décision de rentrer ou non dans une boucle doit etre effectué une seule et unique fois (dans la condition du while(condition) ou du do while(condition) )

    J'ai d'ailleurs tout autant tendance à honnir le fait de mettre un test ou une valeur supplémentaire dans une boucle pour de genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(i=0; (autre condition) && i<N; i++)
    ou pire
    for(i=0,j=0;i<N; i++,j++)
    qui sont pourtant syntaxiquement tout à fait correctes...

    Simplement, parce que j'ai tendance à considérer que la boucle pour est faite pour... utiliser le compteur qu'elle sous entend, et que les valeurs de ce compteur sont prévue pour aller d'une valeur de départ définie à une valeur d'arrivée définie en respectant un pas donné... je dirais presque "betement sans se soucier de ce qui pourrait nous empecher de le faire"...

    C'est sans doute lié à une ou plusieurs solutions parmis
    • la méthode d'algorithmie que j'utilise
    • les habitudes prises lors de mes cours ou apres
    • un certain coté "obtus" que je revendique
    • le bon "air pagne de la campure" que je respire


    etje ne prétend nullement que mon point de vue est le seul point de vue valide...

    Mais je prétend que c'est un point de vue qui en vaut un autre

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

Discussions similaires

  1. [PPT-2010] Questions sur une boucle
    Par droopy1702 dans le forum Powerpoint
    Réponses: 2
    Dernier message: 03/02/2014, 11h08
  2. [SHELL]Question délicate sur une boucle
    Par magellan94 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 31/12/2011, 22h03
  3. Réponses: 4
    Dernier message: 20/01/2006, 17h03
  4. [Newbies] Question sur une technologie XML a utiliser
    Par superraider dans le forum Windows
    Réponses: 3
    Dernier message: 21/10/2005, 11h01
  5. [jdbc] question sur une connection
    Par berg dans le forum JDBC
    Réponses: 2
    Dernier message: 10/09/2005, 09h29

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