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 :

Retourner une liste privée des multiples d'un nombre


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Retourner une liste privée des multiples d'un nombre
    Bonjour,

    j'ai écrit une fonction Intervalle(n,x) qui permet de retirer l'élément n d'une liste allant de 1 à n.
    Je souhaite utiliser cette fonction pour retirer tous les multiples de x qui sont dans cet intervalle.
    La fonction NonMult(n,x) doit faire celà
    Le problème est que cette dernière fonction ne fonctionne pas comme je le souhaite.

    Voici mon 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/usr/bin/perl
    use strict;
     
    sub Intervalle
    {
        my ($n,$x) = @_;
        my @tab;
        for(my ($i)=1; $i<$x; $i++){
    	push(@tab,$i);
        }
        for(my ($j)=$x+1; $j<=$n; $j++){
    	push(@tab,$j);
        }
        return @tab;
    }
     
    sub NonMult
    {
        my ($n,$x) = @_;
        my @t;
        for(my ($i)=1; $i*$x<=$n; $i++){
    	@t = Intervalle($n,$i*$x);
        }
        return @t;
    }
     
    print join(" ",Intervalle(10,7))."\n";
    print join(" ",NonMult(20,3))."\n";

  2. #2
    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
    Ton problème est un problème d'algorithmique plus que de Perl : dans ton cas, la fonction Intervalle() crée une nouvelle liste à chaque appel (liste des nombres de 1 à n privé de x), dans la fonction NonMult, @t contient donc le résultat du dernier appel à Intervalle dans ta boucle, c'est à dire 1 à n privé du dernier multiple de x dans [1,n]...
    Tu peux faire 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
    16
    17
     
    sub Intervalle {
      my ($n, $x) = @_;
      die "x doit être dans 1..n !\n" if( $x < 1 or $x > $n );
      return 1..($x-1), ($x+1)..$n;
    }
     
    sub NonMult {
      my ($n, $x) = @_;
      die "x doit être dans 1..n !\n" if( $x < 1 or $x > $n );
      my @result;
      my $i;
      for( $i = 1; $i * $x < $n; $i++ ) {
        push @result, ( ($i-1) * $x + 1 )..( $i * $x - 1 );
      }
      return @result, ( ($i-1) * $x + 1 )..$n;
    }
    --
    Jedaï

  3. #3
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Que veux-tu faire exactement? Tu veux pouvoir retirer les multiples, disons de 5, d'une liste de 1 à n? Si c'est cela, pourquoi ne pas utiliser le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sub retirer_multiples {
        my ($limite, $multiple) = @_;
        my @range = 1 .. $limite;
     
        return grep { $_ % $multiple } @range;
    }
     
    my @liste = retirer_multiples(23, 5);
    print "@liste\n";
    Est-ce que ça fait ce que tu veux? Si oui, ne trouves-tu pas que c'est plus lisible?

Discussions similaires

  1. Coder des une liste de choix multiples pour Tableaux croisés
    Par piflechien73 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/11/2011, 22h04
  2. actualisation des cellules a partir d'une liste de choix multiples
    Par crachzero dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/03/2008, 20h42
  3. Réponses: 22
    Dernier message: 19/09/2005, 14h49
  4. [MFC] creer une liste avec des check????
    Par ginounet dans le forum MFC
    Réponses: 4
    Dernier message: 16/06/2004, 11h47
  5. [MFC] Retourner une liste d'objets
    Par 1cado dans le forum MFC
    Réponses: 10
    Dernier message: 28/07/2003, 12h11

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