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
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
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 :
Bonne chance
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
A+
PS: S'il ne s'agit pas d'un exo, je suis prêt à rentrer un peu plus dans le code.
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
Utilise les balises [code] et non pas [color] stp ...
@+ Haypo
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.
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 :
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 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;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager