A voir également:
- Eliminer un entier doublons [C]
- Supprimer les doublons excel - Guide
- Doublons photos - Guide
- Supprimer les doublons photos gratuit - Télécharger - Nettoyage
- Éliminer les cookies - Guide
- Comment imprimer un tableau excel en entier - Guide
1 réponse
Le code indiqué plante car il y a 2 boucles qui font appel à la même variable i; donc la 2ème modifie la 1ère!
On pourrait alors changer le nom de la 2ème variable ou faire une déclaration de type: for (int i=...)
D'autre part le code est un peu lourd, dans le sens où l'on remplit des zéros en place de doublons (ce qui au passage interdit d'avoir des zéros dans le tableau) et que plus tard on va retester pour détecter les zéros puis éventuellement modifier. On peut donc raisonnablement envisager une solution qui n'effectue qu'une seule recopie; il suffit de faire directement un double balayage:
int i, j, taille;
if (n == 0)
return (0); // Elimination de ce cas bien ennuyeux
// A priori le tableau fera au moins un élément puisque le 1er élément ne peut être doublon à lui tout seul
for (taille=i=1; i<n; i++) // i va balayer sur tout le tableau sauf le 1er élément qui reste à sa place
{
for (j=0; j<taille; j++) // j va balayer les éléments déjà remplis pour comparaison avec un élément pointé par i
if (tab[j] == tab[i])
break; // Il s'agit d'un doublon
if (j == taille) // Vrai s'il ne s'agit pas d'un doublon
tab[taille++] = tab[i];
}
return (taille); // Taille utile du tableau, il faut bien en informer l'appelant
On pourrait alors changer le nom de la 2ème variable ou faire une déclaration de type: for (int i=...)
D'autre part le code est un peu lourd, dans le sens où l'on remplit des zéros en place de doublons (ce qui au passage interdit d'avoir des zéros dans le tableau) et que plus tard on va retester pour détecter les zéros puis éventuellement modifier. On peut donc raisonnablement envisager une solution qui n'effectue qu'une seule recopie; il suffit de faire directement un double balayage:
int i, j, taille;
if (n == 0)
return (0); // Elimination de ce cas bien ennuyeux
// A priori le tableau fera au moins un élément puisque le 1er élément ne peut être doublon à lui tout seul
for (taille=i=1; i<n; i++) // i va balayer sur tout le tableau sauf le 1er élément qui reste à sa place
{
for (j=0; j<taille; j++) // j va balayer les éléments déjà remplis pour comparaison avec un élément pointé par i
if (tab[j] == tab[i])
break; // Il s'agit d'un doublon
if (j == taille) // Vrai s'il ne s'agit pas d'un doublon
tab[taille++] = tab[i];
}
return (taille); // Taille utile du tableau, il faut bien en informer l'appelant