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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    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
    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à

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    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 Expert
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    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 == .

  5. #5
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    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 confirmé
    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
    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ï

+ 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