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 :

[langage] incrementation de variable dans une boucle


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 22
    Points : 14
    Points
    14
    Par défaut [langage] incrementation de variable dans une boucle
    Bonjour,
    g un fichier texte avec des nombres.
    j'aimerai compter combien de fois apparait chaque nombre.
    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
     
    for($i=0; $i<100; $i ++)
       {
           nb_occurence=0;
           foreach $ligne (<fichier>)
               {
                    if ($ligne =~ /(\S*) fois/)  #(\S*) recupere le nombre à compter
                           {
                               $nombre=$1;
                               if ($nombre == $i)
                                     {  
                                           $nb_occurence++;
                                     }
                          }
                 }
          print "$nb_occurence avec $i fois\n";
       }
    le probleme est qu'il fait bien la 1ere boucle mais apres il n'arrive plus à compter. $i s'incrémente correctement mais sa nouvelle valeur n'est pas prise en compte dans ma boucle foreach.
    vous avez une idée?
    merci!

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Salut,

    Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    my @tab;
    for (my $i=0;$i<100;$i++) {$tab[$i]=0;}
    while (my $ligne=<fichier>)
    {
      if ($ligne =~ /(\S*) fois/)
      {
        my $nombre=$1;
        $tab[$nombre]++;
      }
    }
    et dans chaque élément du tableau, tu as son occurence. $j est apparu $tab[$j] fois.

    Attention, code non testé......
    Dis moi ce que ca fait!

    Severine

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    tiens, je viens de m'apercevoir que tu as oublié le $ devant le premier nb_occurence.
    je sais pas si c'est ca mais déjà, ca fera une faute en moins .

  4. #4
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    non c pas ça la faute, c que g mal recopié mon code...oups...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    T'as bien déclaré la variable $nombre avec un my $nombre?
    Bon, ca ne doit pas être ca le problème mais avec de la magie dès fois...
    T'as essayé mon code? ca donne quoi?
    A quoi ressemble ton fichier <fichier>? tu peux en mettre un extrait, stp.

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    mon fichier texte est du style:

    Albert
    3 fois
    Henri
    2 fois
    Jerome
    1 fois
    Paul
    2 fois

    et je voudrai combien de fois apparait "1 fois", "2 fois"... pour faire des statistiques.
    G essayé ton code mais il m'affiche un tableau avec des valeurs qui ne correspondent à rien, en tout cas pas à ce que je veux...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Je t'avoue que j'ai un peu de mal à faire du code, si je ne peux pas le tester, et là, en ce moment, je ne peux pas!
    je voulais que mon code donne: tab[0]=0; tab[1]=1; tab[2]=2; tab[3]=1 avec le fichier que tu as mis au-dessus. et il donne quoi, stp?

    Severine

  8. #8
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    g bien un tableau de valeurs mais je ne sais pas à quoi correspondent ces valeurs

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    g bien un tableau de valeurs mais je ne sais pas à quoi correspondent ces valeurs

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Ce sont quoi ces valeurs, stp???
    avec le fichier que tu m'as mis au-dessus par exemple.
    Juste pour que je vois où ca se plante

    Severine

  11. #11
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    ah non excuse moi, c que j'avais des cases du tableau vide et je ne comprenais pas. mais ton code est bon!
    autant pour moi!
    merci :-)

  12. #12
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par mimilie
    mon fichier texte est du style:

    Albert
    3 fois
    Henri
    2 fois
    Jerome
    1 fois
    Paul
    2 fois

    et je voudrai combien de fois apparait "1 fois", "2 fois"... pour faire des statistiques.
    G essayé ton code mais il m'affiche un tableau avec des valeurs qui ne correspondent à rien, en tout cas pas à ce que je veux...
    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
    my %Compteur;
    open(FICHIER, "mon_fichier") or die("cannot open file : $!\n");
    while(<FICHIER>)
    {
        if (/(\d)+ fois/)
        {
            ++$Compteur{$1};
        }
    }
    close(FICHIER);
     
    foreach (sort {$a <=> $b} keys(%Compteur))
    {
        print "$_ fois apparait : $Compteur{$_} fois\n";
    }
    Pas essayé non plus mais je pense ne pas m'être gourré

  13. #13
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    merci merci!!!! ça marche!!
    youpi!

  14. #14
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    juste un détail, quand tu fais ça, le 0 n'est pas pris en compte.
    y a t_il un moyen de compter égalmeent les "0 fois"?

  15. #15
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par mimilie
    juste un détail, quand tu fais ça, le 0 n'est pas pris en compte.
    y a t_il un moyen de compter égalmeent les "0 fois"?
    ah oui, très juste

    Heu, Jedai, t'es passé où encore ?

  16. #16
    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
    Le code de Severine marche très bien (même si personnellement, j'aurais plutôt mis "\d" au lieu de "\S" pour des raisons de lisibilité), je viens de tester.
    Ton code ne marche pas, parce que tu lis une fois ton fichier en entier pour 0 avec ton foreach (qui par ailleurs est une mauvaise idée, ici tu dois utiliser un while, sinon tu perd tout l'intérêt de lire ligne par ligne), et ensuite tu essaie de faire pareil avec 1, mais tu es déjà à la fin du fichier, et il ne reste plus de lignes à lire, donc ton foreach ne marche plus... Il faut remettre ton fichier au début, ainsi :
    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
     
    for(my $i=0; $i<100; $i++)
    {
        my $nb_occurence=0;
        my $ligne;
        while( $ligne = <fichier>)
            {
                if ($ligne =~ /\b$i fois/) 
                {
                    $nb_occurence++;
                }
            }
        print "$nb_occurence avec $i fois\n";
        seek fichier, 0, 0;
    }
    Ce code marche aussi, j'ai vérifié, mais il est moins bon que le code de Severine car il parcourt n fois (n étant le maximum qu'on expecte de trouver dans le fichier) le fichier, là où le code de Severine ne parcourt qu'une seule fois le fichier.

    EDIT : @Arioch > Dans ton code, tu utilises un hash ce qui est probablement une mauvaise idée ici bien que ça soit la technique standard, vu que les clés sont des nombres à faible valeur, par ailleurs, tu devrais utiliser "(\d+)" plutôt que "(\d)+" parce que sinon tu risques d'avoir des problème avec les nombres à plusieurs chiffres...
    Je proposerais bien ceci, à partir du code de Severine :
    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
     
    #! /usr/bin/perl
     
    use strict;
    use warnings;
     
    my @tab;
    open FICHIER, '<', "le_fichier" or die "N'arrive pas à ouvrir le_fichier : $!";
     
    while (my $ligne=<FICHIER>)
    {
        if ($ligne =~ /(\d+) fois/)
        {
            $tab[$1]++;
        }
    } 
     
    close FICHIER;
     
    foreach my $i ( 0..$#tab )
    {
        if ( defined $tab[$i] ) { print "$tab[$i] avec $i fois\n" }
        else { print "0 avec $i fois\n" }
    }
    L'avantage de ce code, c'est qu'il imprimera "0 avec 0 fois" mais qu'il s'arrêtera au nombre le plus grand se trouvant dans le fichier. Maintenant, ça dépend de ce que tu veux faire.
    --
    Jedaï

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 10/01/2013, 11h07
  2. [ANT] affectation de variables dans une boucle
    Par dino_xrc dans le forum ANT
    Réponses: 6
    Dernier message: 17/12/2007, 19h47
  3. [VB.net] Declaration variable dans une boucle for
    Par nico10gbb dans le forum Windows Forms
    Réponses: 4
    Dernier message: 10/05/2006, 11h45
  4. Réponses: 6
    Dernier message: 17/03/2006, 12h23
  5. Réponses: 3
    Dernier message: 01/09/2005, 11h56

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