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 Perl Discussion :

probleme sur la fonction next dans 2 boucles for et foreach imbriquees


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 34
    Points
    34
    Par défaut probleme sur la fonction next dans 2 boucles for et foreach imbriquees
    Bonjour,

    voici mon probleme :

    Je possede le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $i; my $p;
    for  $i (0..10){ $p=0;
    if ($i == $p){next;}
    ci dessus, je veux que ma boucle for saute $p qui est pour le moment =0.C est ce $p qui me pose souci, vous comprendrez a la fin de mon explication...
    Ensuite, j effectue quelques operations necessaires pour mon programme:

    avec des operations qui contiennent $i et $p vous aurez compris...Je stocke les resultats dans des listes de hashs:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $resultat1=operation quelconque sur des variables avec $i et $p;
    tab0{$name[$i]}{resultat1}=$resultat1;
    tab0{$name[$i]}{indice}=$i;
    }

    Puis, j effectue un traitement avec une boucle foreach afin de trouver des indices $i et $p qui satisfont des conditions de mon algorithme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach $current_key (%tab0){if (tab0{$name[$i]}{resultat1}< 100000)
    { push @indice, tab0{$current_key}{indice};
    my $a=$indice[0];#meme si plusieurs indices correrspondent je n en veux que le premier
    }
    return $p;
    Et ici mon probleme arrive :
    si aucun indice satisfait ma condition, je veux pouvoir changer $p du debut, voila ce que j ecris mais qui ne fonctionne pas :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($indice[0] = undef) { $p+1=$p; next;}

    ce que je voudrais : si aucun indice n est trouve ,vis a vis des conditions,mon programme repart vers $p et le change en 1, s il ne trouve toujours pas, il recommence avec 2...jusqua trouver un indice qui existe, c est sur que mon programme trouve un indice qui satisfasse les conditions(vis a vis des donnees que je connais) et je voudrais recuperer donc le bon $p et bien sur $indice[0] qui existerait enfin...


    c etait l enonce de mon souci, mais voici en plus la continuite de mon code et je me demande s il n est pas possible de faire pplus simple

    je continue mon programme qui n est en fait que le meme que precedemment mais avec d autres $i et $p trouves grace au programme plus haut...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for  $i (0..10){ 
    if (($i == $p)||($i==$a)){next;}
    et je continue les memes operations que precedemment...


    Merci a celui ou celle qui pourra me sortir de cette galere...

  2. #2
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Points : 1 491
    Points
    1 491
    Par défaut
    déjà pour avoir plus d'aide, indente mieux ton code. c'est illisible et ça ne donne pas envie ...
    De plus, je n'ai pas saisi toutes tes explications.
    Sinon pour incrementer une variable, c'est
    voilà
    Cela demande du courage d'en tirer du plaisir
    Quand on n'a qu'un marteau, tous les problèmes ressemblent à un clou

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 34
    Points
    34
    Par défaut
    deja merci de me donner de l attention...

    Alors en gros , mon souci est le suivant :

    dans une boucle for, j initialise une variable $i a 0, et je lui fait prendre toutes les valeurs de 0 a 10

    puis je veux que cette boucle saute en premier le 0, donc j ecris le code avec une boucle if que voici, qui fonctionne tres bien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $p=0
    for $i (0..10){if ($i=$p){next;}
    Apres un long traitement de mon algorithme, a l aide de conditions, mon programme me retourne un $i qui repond aux criteres que je pose et je veux qu il m affiche le $p, qui est en l occurence 0 ici.En resume, je recupere $i et $p qui repondent a mes conditions posees...

    Le probleme est que si , apres ce long traitement de mon algorithme, aucun $i et $p ne sont retournes, c est qu ils n existent pas.Aucun $i et $p ne repondent a mes conditions..

    Alors je veux pouvoir changer mon $p, initialisé a 0 plus haut..

    Mais comment fait on pour que $p prenne la valeur 1, puis que mon algo fasse le traitement.Ensuite, si aucun $i et$pn est retourne, je veux qu il prenne la valeur 2...etc..????.jusqu a ce que $i et $p existent!

    Et ils existent forcement , donc pas de boucle else necessaire!

    :HELP:

  4. #4
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bonjour,

    Tes explications sont très confuses, mais je pense saisir le problème...
    Avant tout, if-else ne sont absolument pas des boucles ! Ce sont des tests conditionnels, ce qui n'a rien à voir. Ce n'est peut être qu'un problème de vocabulaire, mais pendant un moment j'ai cherché deux boucles et je ne troivais pas. Puis j'ai lu la fin du post et j'ai compris.

    Ensuite, ton test conditionnel ne marche pas comme tu veux. Pour comparer deux entier, il faut utiliser == et non = qui sert à l'affectation. Ton if s'exécutera à chaque tout de boucle, car si l'affectation se déroule bien (ce qui est toujours le cas sauf énorme problème), il renverra une valeur vraie. Remplace donc ton = par un == .
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 34
    Points
    34
    Par défaut
    je l ai fait ca ne fonctionne pas....J ai vraiment du mal a m exprimer,excusez moi...

    Je vais vous donner mon code, peut etre y verrai vous plus clair





    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    push @namememories,$name_memories{$namememories}{namememories};
    push @coordonneesX ,$name_memories{$namememories}{coordonnesmemoriesX};
    push @coordonneesY ,$name_memories{$namememories}{coordonnesmemoriesY};
    push @consumptionmemories,$name_memories{$namememories}{consumptionmemories};
    push @nbadresses,$name_memories{$namememories}{nbadresses};
    push @taillemot,$name_memories{$namememories}{taillemot};
    push @duree,$name_memories{$namememories}{duree};
     
     
     
    }
     
     
     
     
     
     
     
     
    for my $i ( 0 .. @namememories-1 ) {
    $p=0;
    if ($i == $p){next;}	
     
     
    $conso_ajoutee[$i]=$consumptionmemories[0]+$consumptionmemories[$i];				 
    my $consommation="$conso_ajoutee[$i]   ,  $namememories[0] et $namememories[$i]\n";		
    $dx2=(($coordonneesX[$i]-$coordonneesX[0])*($coordonneesX[$i]-$coordonneesX[0]));
    $dy2=(($coordonneesY[$i]-$coordonneesY[0])*($coordonneesY[$i]-$coordonneesY[0]));
    $di=sqrt($dx2+$dy2);
    my $duree_difference= abs ($duree[0]-$duree[$i]);	
    my $nbadresses_difference= abs ($nbadresses[0]-$nbadresses[$i]);		
    $tab0{$namememories[$i]}{conso_ajoutee}=$conso_ajoutee[$i];
    $tab0{$namememories[$i]}{distance}=$di;
    $tab0{$namememories[$i]}{duree_difference}=$duree_difference;
    $duree_affichee=abs ($tab0{$namememories[$i]}{duree_difference}- $duree[0]);
    $tab0{$namememories[$i]}{nbadresses_difference}=$nbadresses_difference;	
    $tab0{$namememories[$i]}{duree_affichee}=$duree_affichee;
    $tab0{$namememories[$i]}{coordonneesX}=$coordonneesX[$i];
    $tab0{$namememories[$i]}{coordonneesY}=$coordonneesY[$i];
    $tab0{$namememories[$i]}{nbadresses}=$nbadresses[$i];
    $tab0{$namememories[$i]}{indice}=$i;
     
     
        foreach $current_key (keys %tab0) {    
          					if (($tab0{$current_key}{conso_ajoutee} <(my $conso_ajoutee_max=50000))
    					&&($tab0{$current_key}{distance}>(my $distance_min=17000))
    					&&($tab0{$current_key}{duree_difference}<(my $duree_difference_max=100))
    					&&($tab0{$current_key}{nbadresses_difference}<(my $nbadresses_difference_max=100))) 
    						{	
    							push @indice,$tab0{$current_key}{indice};
    							push @nbadresses_courante, $tab0{$current_key}{nbadresses};
    							push @coordonneesX_courante,$tab0{$current_key}{coordonneesX};
    							push @coordonneesY_courante,$tab0{$current_key}{coordonneesY};							
    							push @duree_courante,$tab0{$current_key}{duree_affichee};							
    							push @conso_courante, $tab0{$current_key}{conso_ajoutee};
    							push @key,$current_key;		
    							push  @bonnes_memoires,$namememories[0];
    							push  @bonnes_memoires, $key[0];
    							$a=$indice[0];
    							return $p;
     
    						}
    				}		   
    while ($a == undef){$p++;next;}}

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    On te l'a déjà dit plusieurs fois, mais tu sembles sourd à ce conseil : indente proprement !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for my $i ( 0 .. @namememories-1 ) {
    $p=0;
    if ($i == $p){next;}
    Pratiquement illisible !
    Et une fois indenté proprement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for my $i ( 0 .. @namememories-1 ) {
        $p=0;
        if ($i == $p) {
            next;
        }
     
        # ...
    }
    Ou plus idiomatique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for my $i ( 0 .. $#namememories ) {
        $p = 0;
        next if $i == $p;
     
        # ...
    }
    En tout cas avec cette indentation, on s'aperçoit immédiatement que ton code remet $p à 0 juste avant de le comparer à $i... Donc quoique tu fasses ailleurs à $p, cela n'a absolument aucune influence.

    Il faut initialiser $p en dehors de la boucle en tout cas (je n'ai pas vérifié le reste du programme, je ne saurais donc dire si cela va marcher).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $p = 0;
     
    for my $i ( 0 .. $#namememories ) {
        next if $i == $p;
     
        # ...
    }
    --
    Jedaï

  7. #7
    Membre habitué Avatar de crochepatte
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 206
    Points : 145
    Points
    145
    Par défaut
    Juste une petit remarque peut etre debile, mais bon:
    Si tu veux sauter la valeur $i = 0, pourquoi ne pas commencer ta boucle à $i = 1???

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Citation Envoyé par crochepatte
    Juste une petit remarque peut etre debile, mais bon:
    Si tu veux sauter la valeur $i = 0, pourquoi ne pas commencer ta boucle à $i = 1???

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 34
    Points
    34
    Par défaut
    Je te remercie pour tes remarques....

    Je veux incrementer automatiquement ce saut, c est pour ca que je ne place pas ma variable en dur

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 34
    Points
    34
    Par défaut
    N y a t il donc personne qui me comprenne?

  11. #11
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu as le droit de lire ma réponse...

    --
    Jedaï

  12. #12
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Citation Envoyé par norachaouia
    N y a t il donc personne qui me comprenne?
    Tu n'ai pas vraiment clair. En tout cas, j'ai vraiment du mal à saisir ce que tu veux faire.
    Explique le but de ton script le plus simplement possible .
    De plus, pour ce faire comprendre, il faut présenter un code propre et bien indenté, et bien tenir compte des réponses ou suggestions de tout le monde.
    Jedai t'avais fais une remarque et je ne sais même pas si tu en as tenu compte.
    crochepatte t'en as fait une autre.

    Bref, lit déjà les suggestion des chacun, propose un code propre et sois simple et clair

  13. #13
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 34
    Points
    34
    Par défaut
    Alors evidemment, je lis toutes les reponses mais, bien que ca me donne des indications, ca ne resoud pas

    Une question : tout le monde me dit , indente bien ton code.Je suis autodidacte, et je ne sais pas ce que veux dire, bien indenter le code
    Comment doit on placer les accolades afin d etre dans une bonne indentation?

  14. #14
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Pour ça au moins, c'est facile : une tabulation en plus à partir de la ligne suivant une accolade ouvrante, une tabulation en moins sur la ligne contenant une accolade fermante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while (...)
    {
       if (...)
       {
          for (...)
          {
             print "Toto";
          }
       }
    }
    Si ton bloc ne contient qu'une instruction utilise la notation préfixée :
    Ensuite, en ce qui concerne l'affectation, $p + 1 = $p ne veut rien dire du tout. Tu dois mettre $p = $p + 1 ou $p++ .

    Pour ce qui est de sauter un tour de boucle dans deux boucles imbriquées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BOUCLE1: foreach (...)
    {
       #ici du code
       foreach (...)
       {
          #ici ton code
       }
       #ici du code
    }
    Pour sauter une tour de la première boucle, c'est next BOUCLE1; et pour sauter un tour de la deuxième boucle, c'est next; tout court (à n'utiliser que dans le second foreach évidemment).
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  15. #15
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Ce genre de notation n'est pas préconisé en perl, c'est le style BSD.
    Le style GNU n'est pas également conseillé.
    Il est préconisé le style K&R qui nécissite des lignes de code en moins.
    De plus, En cas de plusieurs bloc de code ou boucle imbriquée, on ne se retrouve pas avec beaucoup de lignes supplémentaires.

    D'un niveau sémantique, on cherche généralement où se termine l'accolade d'un un for, foreach. Et d'un point de vu personnel, c'est mieux pour la visibilité.

    Donc voilà ce que je suggère :
    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
     
    BOUCLE1: 
    foreach (...) {
       #ici du code
       foreach (...) {
          #ici ton code
       }
       #ici du code
    }
     
    if (condition) {
        #code
    }
    else {
        #code
    }

  16. #16
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 34
    Points
    34
    Par défaut
    Merci d avoir ete patients avec moi, parce que CA MARCHE!
    TU AS RAISON! CE CODE FONCTIONNE!


    MIlle merci a tous ceux qui m ont apporte de l aide!

  17. #17
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Citation Envoyé par djibril
    Ce genre de notation n'est pas préconisé en perl, c'est le style BSD.
    Le style GNU n'est pas également conseillé.
    Il est préconisé le style K&R qui nécissite des lignes de code en moins.
    De plus, En cas de plusieurs bloc de code ou boucle imbriquée, on ne se retrouve pas avec beaucoup de lignes supplémentaires.
    Je ne supporte pas ce style, même si je sais qu'il est conseillé en Perl, donc je ne l'applique pas
    Mais bon, honnêtement, je pense que c'est plus une question d'habitude qu'autre chose. On ne peut pas nier que mon code est bien indenté, ni que le tient l'est également
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  18. #18
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Citation Envoyé par Woufeil
    Je ne supporte pas ce style, même si je sais qu'il est conseillé en Perl, donc je ne l'applique pas

    Citation Envoyé par Woufeil
    Mais bon, honnêtement, je pense que c'est plus une question d'habitude qu'autre chose. On ne peut pas nier que mon code est bien indenté, ni que le tient l'est également
    biensur que ton code est bien indenté. c''était juste un conseil, mais tout est question de gout.

    norachaouia oublie pas de mettre ton thread en résolu

  19. #19
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 34
    Points
    34
    Par défaut
    ca va vous paraitre debile, mais autant pour la derniere discussion que j ai ouverte l, j ai su mettre le thread en resolu, autant je ne vois pas ou est le bouton qui me permet de mettre cette discussion en "resolu"


    Je ne le vois po?????

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

Discussions similaires

  1. Probleme dans une boucle for, faisant appel a une fonction
    Par mapotam dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 22/01/2010, 21h41
  2. Fonction system() dans une boucle for
    Par banban56 dans le forum C
    Réponses: 3
    Dernier message: 16/06/2007, 18h48
  3. Réponses: 3
    Dernier message: 01/09/2005, 11h56
  4. Probleme sur une fonction vérif
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/10/2004, 13h25
  5. Réponses: 3
    Dernier message: 06/07/2004, 10h21

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