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

 C Discussion :

supprimer élement du tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 22
    Par défaut supprimer élement du tableau
    salut
    j'ai deux tableaux A et B et je veux supprimer les élement de A qui se trouve dans B . comment j'ai pensé mettre ces élement redendant a -1 mais j'ai remarqué que les élements des deux tableau peuevnt étre négative ..comment je peux procéder ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut,

    Il y a plein de solutions possibles. J'en vois trois principales, mais y en a peut-être d'autres :

    1)

    Si tu n'utilises qu'une plage de valeurs pour remplir ton tableau B, il suffit alors de trouver une valeur autre que -1 pour indiquer que cet élément est "supprimé". Par exemple, si tu n'utilises que les valeurs comprises entre -999 et 999, tu peux désigner -1000 comme valeur indiquant une case vide du tableau.
    C'est la solution la plus simple, mais si elle est impossible à mettre en oeuvre (i.e. si tu n'utilises pas de plage de valeurs), il faut voir les deux autres solutions, juste après.

    2)

    Tu déclares une variable (par exemple "nombre_valeurs") correspondant au nombre de valeurs contenues dans ton tableau B. Si tu veux supprimer une valeur dans ce tableau, tu décales tout ce qui suit cette valeur dans le tableau d'un cran vers la gauche et tu décrémente de 1 la variable.
    Par exemple si ton tableau B contient 10 valeurs utiles, composé de :
    1 2 3 4 5 6 7 8 9 10
    Ta variable "nombre_valeurs" est à 10.

    Si tu veux supprimer par exemple la valeur 5, tu décales d'un cran vers la gauche toutes les valeurs qui suivent :
    1 2 3 4 6 7 8 9 10 10
    Tu te retrouves maintenant avec deux fois la valeur 10, mais ce n'est pas grave car il suffit alors de décrémenter de 1 la variable "nombre_valeurs", qui se trouve maintenant à 9, ce qui fait que les valeurs du tableau qui nous intéressent réellement sont :
    1 2 3 4 6 7 8 9 10

    Si tu utilises de gros tableaux, cela risque de devenir lent, car à chaque valeur à supprimer, il faut décaler tout le reste vers la gauche.

    3)

    Tu peux créer un tableau temporaire de même taille que le tableau B, dont ses valeurs (0 ou 1) t'indiquent quels éléments du tableau B on doit garder.
    Exemple, si tu as un tableau B composé de 10 éléments
    8 3 1 2 15 97 24 18 67 13
    ton tableau temporaire est donc composé lui aussi de 10 éléments, chaque élément est mis à 1 au début. Ce 1 indique que tous les éléments du tableau B sont à considérer.
    Ensuite, si par exemple tu veux supprimer la 5ème valeur du tableau B, c'est-à-dire la valeur 15, il suffit tout simplement de mettre la 5ème valeur du tableau temporaire à 0.
    Une fois que tu as fini de scanner ton tableau A, tu sais alors quels éléments du tableau B tu veux garder : si le 'n'ième élément du tableau temporaire est à 0, alors l'élément 'n' du tableau B est supprimé.

    Cette méthode est plus rapide que la solution 2 (surtout pour les gros tableaux), mais cela oblige à créer un autre tableau et donc à consommer plus de mémoire (c'est toutefois optimisable).

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    On peut envisager cette solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    1- Définir une position de lecture Lec et d'écriture Ecr dans le tableau A.
    2- Positionner Lec et Ecr au début du tableau A
    3- Tant que la position Lec n'est pas arrivée au dernier élément du tableau A (inclus):
       3.1- Si la valeur en position Lec n'est pas dans le tableau B :
            3.1.1- l'écrire en position Ecr
            3.1.2- incrémenter la position Ecr
       3.2- Incrémenter la position Lec

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Après relecture, je constate maintenant que j'avais en fait mal compris la question de départ... Du coup, j'ai inversé tableau A et tableau B.

  5. #5
    Membre averti
    Inscrit en
    Février 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 22
    Par défaut
    Citation Envoyé par diogene Voir le message
    On peut envisager cette solution :
    [code]1- Définir une position de lecture Lec et d'écriture Ecr dans le tableau A.

    3.1- Si la valeur en position Lec n'est pas dans le tableau B :
    3.1.1- l'écrire en position Ecr
    salut.
    qu'est que tu entend dire par écrire !!!
    le tableau A est initialement rempli. mais je pense que tu as pensé dire , remplir un 3 ème tableau RES avec LEc parcourant A et ECR parcourant RES.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    il y a plus rapide et simple :


    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
    k = 0 ;
     
    for ( i = 0 ; i < NA ; i++ )
      {
          Ok = 1 ;
     
          for ( j = 0 ; j <  NB ; j++ )
            {
                 if ( A[i] == B[j] )
                   {
                        Ok = 0 ;
                        break ;
                   }
            }
     
          if ( Ok )
            {
                A[k] = A[i] ;
                k++ ;
            }
      }
     
    NA = k + 1 ;

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    @Débutant_ASM
    le tableau A est initialement rempli. mais je pense que tu as pensé dire , remplir un 3 ème tableau RES avec LEc parcourant A et ECR parcourant RES.
    Non, il n'y a pas besoin d'un troisième tableau Lec et Ecr parcourent le même tableau A. C'est écrit noir sur blanc ici :
    1- Définir une position de lecture Lec et d'écriture Ecr dans le tableau A.
    @souviron34
    il y a plus rapide et simple :
    Le code que tu montres est une implémentation de l'algo proposé. Tu appelles simplement i et k ce que j'ai appelé Lec et Ecr.
    La variable Ok est d'ailleurs inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    k = 0 ;
    for (i = 0 ; i < NA ; i++)
    {
          for (j = 0 ; j <  NB && A[i] != B[j]  ; j++) {} 
          if (j == NB)
          {
                A[k] = A[i] ;
                k++ ;
          }
    } 
    NA = k + 1 ;

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

Discussions similaires

  1. supprimer élements commun->tableau de hash
    Par pontarose dans le forum Langage
    Réponses: 2
    Dernier message: 08/07/2011, 11h54
  2. [PHP 5.2] [Tableaux] Supprimer élement d'un Tableau
    Par KOUTO dans le forum Langage
    Réponses: 4
    Dernier message: 14/06/2009, 11h28
  3. Réponses: 4
    Dernier message: 25/11/2008, 09h46
  4. supprimer ligne de tableau ou div
    Par trax44 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/11/2006, 11h32

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