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

[LG]Suppression de doublons


Sujet :

Langage Pascal

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2003
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [LG]Suppression de doublons
    Bonjour,
    Je suis super débutante en pascal, j'aimerais savoir comment supprimer des doublons dans un tableau d'entier rempli alléatoirement
    Merci de votre réponse

    Moustique31

  2. #2
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Alors de deux choses l'une : soit tu n'es pas poursuivie par le manque de mémoire, auquel cas l'usage de deux tableaux te simplifiera grandement la vie, soit la mémoire te fait défaut, auquel cas il faudra se débrouiller avec un seul et unique tableau : c'est pas vraiment joyeux.

    Comme je ne sais pas trop à quoi est destiné ce programme (les demandes de résolution d'exercices se multiplient ces temps-ci, je deviens soupçonneux), je vais rester assez vague, tout en donnant un nombre de détails suffisant.

    Je ne parlerai ici que de la méthode à deux tableaux. Celle à un tableau est tout à fait réalisable malgré. Seulement plus lente et lourde.

    Appelons A notre tableau d'entiers original, et B le tableau destination. Appelons ACount et BCount le nombre d'éléments dans les tableaux A et B respectivement.

    Le principe est simple : on parcourt A de 1 à ACount. A chaque itération, on pose n l'entier à vérifier. On parcourt alors B de 1 à BCount en vérifiant si n n'est pas déjà présent dedans. Si on le trouve, alors on casse la boucle de parcourt de B et on passe à l'élément suivant de A. Sinon, on ajoute n à la position BCount + 1 dans le tableau B et on incrémente BCount. On peut alors passer à l'élément suivant de A.

    En algo, ça donne à peu près ça :

    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
     
    Variables :
    A, B: tableaux d'entiers;
    ACount, BCount: entiers;
    n, i, j: entiers;
     
    Corps :
    ACount = ?;  // A définir
    BCount = 0;
     
    Pour i allant de 1 à ACount faire : (*1)
    | n = élément n°"i" du tableau A
    | Pour j allant de 1 à BCount faire : (*2)
    |  | Si n correspond à l'élément n°"j" du tableau B, continuer (*1)
    |  | Continuer (*2)
    | // Si on arrive ici, c'est que n n'a pas été trouvé
    | Ajouter n au tableau B
    | BCount = BCount + 1
    | Continuer (*1)
     
    // Le tableau B contient les éléments de A sans doublon
    Fin
    Bonne chance

    A+

    PS: S'il ne s'agit pas d'un exo, je suis prêt à rentrer un peu plus dans le code.
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2003
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Un grand merci pour cette réponse.
    Je suis étudiante,mais ce n'est pas un exercice de cours. J'essaie juste de me mettre à niveau.

    Je vous mets ici, la procédure qui contient l'effacement des doublons peut être vous comprendrez mieux mon problème

    Procedure enlever_doublons (Var tab,tab_new:array of Integer; nb_lignes:Integer);
    Var
    i,j:Integer;
    Begin
    For i:=1 to nb_lignes do
    Begin
    For j:=1 to nb_lignes do
    Begin
    IF (tab[j]<>tab[i]) THEN
    Begin
    tab_new[i]:=tab[j];
    End;
    End;
    End;
    End;

    Merci encore pour toutes ses réponses

    Moustique31

  4. #4
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    Utilise les balises [code] et non pas [color] stp ...

    @+ Haypo

  5. #5
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bzzz salut Moust... PAF (c'est plus fort que moi, je déteste ces bestioles).
    Sans méchanceté, bien sûr !

    A ta place, je n'utiliserais pas de boucle for pour le second tableau, mais simplement un indice incrémenté dans la boucle de lecture du premier tableau.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  6. #6
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    J'ai peur que tu aies de mauvaises surprises avec ton algo : ton tableau "new_tab" va comporter des trous plutôt gênants, car remplis avec tout et n'importe quoi.

    En effet, tu pars du principe qu'à l'élément n°i tu tableau original correspond l'élément n°i du nouveau tableau. C'est faux ! Car si tu supprimes un élément dans le tableau, il n'aura plus la même position dans le nouveau tableau. Ta méthode n'est donc pas trop mal, à ce problème prêt.

    La solution reste simple à trouver : utiliser un compteur pour savoir où tu en es dans le nouveau tableau. Et puis, dans ta boucle for interne, tu peux te passer de vérifier tous les éléments précédant celui que tu souhaites insérer : ceux-ci sont déjà passés à la moulinette.

    Ca pourrait nous donner ça donc :

    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
     
    Procedure enlever_doublons (Var tab,tab_new:array of Integer; nb_lignes:Integer; var NouvTaille: Integer); 
    Var 
      i,j:Integer; 
    Begin 
    NouvTaille := 0;
    For i:=1 to nb_lignes do 
      Begin 
      For j:=i to nb_lignes do 
        Begin 
        IF (tab[j]<>tab[i]) THEN 
          Begin 
          Inc(NouvTaille);
          tab_new[NouvTaille - 1]:=tab[j]; 
          End; 
        End; 
      End; 
    End;
    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

Discussions similaires

  1. suppression des doublons
    Par LuckySoft dans le forum Requêtes
    Réponses: 9
    Dernier message: 04/08/2006, 12h29
  2. Suppression de doublons et insertion
    Par Samish dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/08/2005, 21h57
  3. Réponses: 17
    Dernier message: 03/12/2004, 11h17
  4. [langage] Suppression de doublon dans tableau
    Par LFC dans le forum Langage
    Réponses: 5
    Dernier message: 15/04/2004, 14h08
  5. Requête de suppression de doublons : besoin d'aide
    Par biocorp dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2004, 17h04

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