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 :

Sortir de deux boucles imbriquées


Sujet :

C

  1. #1
    Inactif
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 38
    Points
    38
    Par défaut Sortir de deux boucles imbriquées
    Bonsoir,

    Tout est dans le titre : d'habitude, j'utiliserais une variable booléenne pour quitter deux boucles emboîtées à la fois :
    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
    quitter = 0;
    i = 0;
     
    while (i < nbLignes && !quitter)
    {
      j = 0;
      while (j < nbColonnes && !quitter)
      {
        if (tab[i][j] == UNE_CERTAINE_VALEUR)
        {
          quitter = 1;
          ...
        }
     
        j++;
      }
      i++;
    }
    J'aimerais savoir s'il y a une autre solution, plus élégante, en utilisant l'instruction break ? Car je ne vois pas comment sortir de la boucle i :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (i = 0; i < nbLignes; i++)
      for (j = 0; j < nbColonnes, j++)
      {
        if (...)
          break; /* Ce break permet uniquement de quitter la boucle j, mais comment faire pour quitter la boucle i aussi */
      }

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Pas plus elegant :


    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
     
    quitter = 0 ;
    for (i = 0; i < nbLignes; i++)
    {
      for (j = 0; j < nbColonnes, j++)
      {
        if (...)
        {
          quitter = 1 ;
          break; 
         }
      }
     if ( quitter )
       break ;
    }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Inactif
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Pas plus elegant :
    Donc, le code que j'avais proposé est le plus élégant et le plus naturel !

    Citation Envoyé par souviron34 Voir le message
    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
     
    quitter = 0 ;
    for (i = 0; i < nbLignes; i++)
    {
      for (j = 0; j < nbColonnes, j++)
      {
        if (...)
        {
          quitter = 1 ;
          break; 
         }
      }
     if ( quitter )
       break ;
    }
    Oui, j'avais que ça en tête, donc il n'y a pas de solution purement "break" ?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    break interrompt l'instruction en cours...

    Dans 2 boucles imbriquees, c'est donc impossible avec un seul...

    Il peut y avoir une solution si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for (k = 0; k < nbLignes*nbColonnes; k++)
      {
         i = k % nbColonnes ;
         j = k - i ;
     
        if (tab[i][j] == UNE_CERTAINE_VALEUR)
        {
          break; 
         }
      }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Inactif
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for (k = 0; k < nbLignes*nbColonnes; k++)
      {
         i = k % nbColonnes ;
         j = k - i ;
     
        if (tab[i][j] == UNE_CERTAINE_VALEUR)
        {
          break; 
         }
      }
    Peut-être que tu voulais écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      j = k % nbColonnes ;
      i = k - j ;
    /*-----------Ou bien-------------*/
      i = k % nbLignes ;
      j = k - i ;
    Car le compteur des lignes "i" n'a rien à voir avec le nombre de colonnes "nbColonnes" !

    Dans tous les cas, le code que tu as proposé est faux (même les miens), car (prenons ton code) si k = nbColonnes alors i = 0 et par conséquent j = nbColonnes, ce qui représentre une case inaccessible qui se trouve en dehors de la matrice nbLignes * nbColonnes !

    Une solution encore moins propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      for (i = 0; i < nbLignes; i++)
        for (j = 0; j < nbColonnes; j++)
        {
          if (...)
          {
            i = nbLignes + 1;
            j = nbColonnes + 1;
          }
        }

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    tu peux utilise l'instruction goto aussi pour sortir d'une boucle genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      for (i = 0; i < nbLignes; i++)
        for (j = 0; j < nbColonnes; j++)
        {
          if (...)
          {
            goto sortie /* nom de l'etiquette */
          }
        }
     
    sortie : (...) /* reprise du code apres avoir executer goto */

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par paronyme Voir le message
    Peut-être que tu voulais écrire :
    Non je voulais dire / au lieu de % :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      i = k / nbColonnes ;
      j = k - i ;

    Citation Envoyé par paronyme Voir le message
    Car le compteur des lignes "i" n'a rien à voir avec le nombre de colonnes "nbColonnes" !
    Eh bien si...

    Dans le cas d'un indice continu, c'est comme un tableau ....

    k = 0 => i = 0, j=0
    k=NbColones => i = 1, j = 0,
    k = NbColonnes + 1 => i = 1, j = 1
    ........
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Pas plus elegant :


    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
     
    quitter = 0 ;
    for (i = 0; i < nbLignes; i++)
    {
      for (j = 0; j < nbColonnes, j++)
      {
        if (...)
        {
          quitter = 1 ;
          break; 
         }
      }
     if ( quitter )
       break ;
    }
    Pourquoi pas simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    quitter = 0 ;
    for (i = 0; quitter == 0 && i < nbLignes; i++)
    {
        for (j = 0; quitter == 0 && j < nbColonnes, j++)
        {
            if (...)
            {
                quitter = 1 ;
            }
        }
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  9. #9
    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 : 67
    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 paronyme Voir le message
    Tout est dans le titre : d'habitude, j'utiliserais une variable booléenne pour quitter deux boucles emboîtées à la fois :
    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
    quitter = 0;
    i = 0;
     
    while (i < nbLignes && !quitter)
    {
      j = 0;
      while (j < nbColonnes && !quitter)
      {
        if (tab[i][j] == UNE_CERTAINE_VALEUR)
        {
          quitter = 1;
          ...
        }
     
        j++;
      }
      i++;
    }
    J'aimerais savoir s'il y a une autre solution, plus élégante, en utilisant
    Non. C'est déjà la solution courante et propre.
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut petite erreur dans la 4eme ligne du code, correction en rouge
    Citation Envoyé par souviron34 Voir le message
    break interrompt l'instruction en cours...

    Dans 2 boucles imbriquees, c'est donc impossible avec un seul...

    Il peut y avoir une solution si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for (k = 0; k < nbLignes*nbColonnes; k++)
      {
         i = k % nbColonnes ;
         j = (k - i)/nbLignes ;
    
        if (tab[i][j] == UNE_CERTAINE_VALEUR)
        {
          break; 
         }
      }

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

Discussions similaires

  1. [Batch] faire deux boucles imbriques
    Par fk04 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 17/03/2010, 12h32
  2. Sortir de deux boucles FOR-END imbriquées
    Par Nabuchodonosor15 dans le forum MATLAB
    Réponses: 5
    Dernier message: 31/08/2009, 09h58
  3. [JSTL] Deux boucles imbriquées
    Par Esil2008 dans le forum Taglibs
    Réponses: 1
    Dernier message: 31/07/2007, 18h46
  4. Sortire de deux boucle en une foi
    Par mcdonald dans le forum Général Python
    Réponses: 5
    Dernier message: 08/08/2006, 15h11
  5. empêcher un break de sortir de plusieurs boucles imbriquées
    Par quidam66 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/06/2006, 21h52

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