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

MATLAB Discussion :

Sortie d'une boucle


Sujet :

MATLAB

  1. #1
    Membre confirmé Avatar de NELLLY
    Inscrit en
    Mars 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 94
    Par défaut Sortie d'une boucle
    SALUT
    voila un petit exp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for n=1:2
       for h=3:7
          Q
       end
    end
    pour chaq valeur de n et h une matrice Q est calculé(depend de n et h). le calcul se fait pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    n=1 h=3
    n=1 h=4
    ....
    Ce que je veux faire c'est le suivant
    si pour un n et h donné, le determinant de l'inverse de Q est egale à 0 on sort completement de la boucle h
    exp si n=2 et h=3 inv(Q)==0 on ne calcule plus pour n=2 h=4... on sort on passe à n=3 et h=3...
    comment faire?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    Tu veux pas sortir d'une boucle mais plutôt sauter une itération, non ?

    La fonction "break" te permets de sortir d'une boucle

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par christophe_halgand Voir le message
    La fonction "break" te permets de sortir d'une boucle
    et uniquement de la boucle où le BREAK est positionné, ça tombe bien

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    Je n'avais pas vu que la valeur de départ était 3...

    Mais le "break" le fera sortir de son "if" mais pas de son "for"

    Il faudrait faire quelque chose de ce type là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for n=1:2
      fin_h=7;
      for h=3:fin_h
        Q
        if (ta cond est vrai)
          fin_h=h;
        end
      end
    end
    Comme çà, tu le forces à quitter ta boucle

  5. #5
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Par défaut
    Hello,

    Une petite precision:
    break fera toujours sortir d'une boucle for et non du if.

    donc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for ....
       for ....
          if .... 
             break % sort du for imbrique.
          end
       end
    end
    est bien la solution correcte.

    L'autre solution proposee est incorrecte.

    Salutations,

    Gregoire

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 90
    Par défaut
    Salut,

    break fera toujours sortir d'une boucle for et non du if.
    uniquement de la boucle où le BREAK est positionné
    Tout cela est vrai, mais... son application n'est pas correcte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for ....
       for ....
          if .... 
             break % sort du for imbrique.
          end
       end
    end
    break fait sortir d'une seule boucle mais pas d'une boucle if imbriquée.

    Ce dernier code doit être modifié comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for i=1:5
        for j=2:5
            if (i+j==4) 
                i
                j
                break 
            end
        end
        if (i+j==4)
            break
        end
    end
    La 1ère break sort de la boucle j et le programme tourne encore pour i. Il faut ajouter le même test.

    Pour le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for n=1:2
      fin_h=7;
      for h=3:fin_h
        Q
        if (ta cond est vrai)
          fin_h=h;
        end
      end
    end
    Si la condition est satisfaite pour h=k, la boucle continue à tourner et sort à la boucle k+1, sans oublier que c'est pour une seule boucle. En somme ça ne répond pas au besoin

    A bientôt.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    Je ne vois pas où est le problème dans mon code par rapport au problème demandé... Je rappelle qu'il est demandé de sortir de la boucle h et non aussi de n... Ou alors la question n'était pas en français...

    Je réponds entièrement à la question... Même si c'est du bricolage...

    Et j'ai essayé un exemple simple pour l'utilisation du break et ça n'a pas marché donc pour moi break sort uniquement du "if" et pas du "for"...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 90
    Par défaut
    Salut Chrisophe,

    Je présente mes excuses et j'admets que je n'ai pas bien lu ce que cherchait NELLY et que je me suis lancée dans la double boucle, la question était bien en français .

    Est ce que tu as bien testé ton exemple? Car il ne marche toujours pas chez moi. Merci de m'envoyer ton code test.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for n=1:2
      fin_h=7;
      for h=3:fin_h
        Q
        if (ta cond est vrai)
          fin_h=h;
        end
      end
    end
    Il suffit d'exécuter ce bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    % l'exemple de christophe qui ne marche pas
    for n=1:3
      fin_h=7;
      for h=2:fin_h
        if (n+h==5)
          fin_h=h;
        end
        n
        h
        fin_h
        pause
      end
    end
    J'aime bien savoir pourquoi il tourne encore dans la boucle.

    J'ai modifié mon exemple précédent pour qu'il s'adapte au besoin, voila:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for n=1:4
        for h=3:7
            if (n+h==7)
                break 
            end
                n
                h
                pause
        end
    end
    Le break me fait toujours sortir de la boucle for, enfin c'est ce que matlab me donne.
    Encore un exemple très simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for g=1:5
        g
        pause
        if(g==3)
            break
        end
    end
    Il sort à g=3.


    Enfin si le break continue à causer des problèmes, voilà une autre solution sans break:
    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
    fin_h=7;
    for n=1:5
        t=0;
        h=1;
        while (t~=1)&(h<fin_h)
            % Calcul de G
            h=h+1;
            if (n+h==4) 
                t=1;
            end
            n
            h
            pause
        end
    end
    J'espère que mes codes donnent les mêmes résultats, sinon merci de me le signaler.

    A bientôt

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    Oki, pas de problème pour moi...

    Je pensais que mon code était logique mais il ne fonctionne pas... Si quelqu'un savait pourquoi, ça serait cool...

    Ce que je comprends c'est que la boucle for doit mettre en mémoire la valeur initiale et finale en mémoire sans possibilité de la modifier...

    Ton "break" fonctionne aussi, il faudra que je retrouve mon test où ça ne marchait pas pour mieux comprendre.

    Sinon, le while est une autre possibilité...

    Pour le choix finale, je prendrais celle qui prend le moins de temps (à tester avec "tic/toc")

    Merci et à bientôt

  10. #10
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par christophe_halgand Voir le message
    Ce que je comprends c'est que la boucle for doit mettre en mémoire la valeur initiale et finale en mémoire sans possibilité de la modifier...
    C'est exactement ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for n=1:3
       n=rand
    end
    retourne :
    n =

    0.8147


    n =

    0.9058


    n =

    0.1270

  11. #11
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Par défaut
    Citation Envoyé par fatenov Voir le message
    Salut,





    Tout cela est vrai, mais... son application n'est pas correcte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for ....
       for ....
          if .... 
             break % sort du for imbrique.
          end
       end
    end
    break fait sortir d'une seule boucle mais pas d'une boucle if imbriquée.
    >> alors la, j'insiste encore une fois: NON: un break fait sortir d'un FOR, meme s'il est imbrique dans un IF.
    La 1ère break sort de la boucle j et le programme tourne encore pour i. Il faut ajouter le même test.

    >> non et je vous invite a le verifier par vous meme.

    Pour le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for n=1:2
      fin_h=7;
      for h=3:fin_h
        Q
        if (ta cond est vrai)
          fin_h=h;
        end
      end
    end
    Si la condition est satisfaite pour h=k, la boucle continue à tourner et sort à la boucle k+1, sans oublier que c'est pour une seule boucle. En somme ça ne répond pas au besoin
    le probleme ici est le suivant:
    quand on ecrit en matlab
    L'intervale 3:fin_h est calcule UNE fois pour toutes. modifier fin_h a l'interieur de la boucle est donc sans utilite, et du reste je recommanderai meme de ne pas modifier les variables d'intervales de boucle for afin de rendre le code plus clair.


    A bientôt.
    Salutations,

    Gregoire

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 90
    Par défaut
    Salut Paradize3,

    Oui j'affirme bien que break sort de la boucle for (c'est ce que j'ai dit), mais mon intervention était pour les boucles for imbriquée l'une dans l'autre (car je n'ai pas fait attention au besoin)

    Pour l'exemple qui modifie la borne de la boucle, je n'ai pas bien choisit les bornes et donc les résultats m'ont fait des illusions Oui la boucle continue à tourner.

    A bientôt.

Discussions similaires

  1. Problème de sortie d'une boucle
    Par sebdu94 dans le forum C
    Réponses: 12
    Dernier message: 19/01/2008, 09h43
  2. Réponses: 1
    Dernier message: 18/10/2007, 17h13
  3. vérification à la sortie d'une boucle
    Par freestyler dans le forum Delphi
    Réponses: 4
    Dernier message: 10/10/2006, 15h44
  4. [langage] condition de sortie d'une boucle
    Par perlaud dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2004, 10h25

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