J'ai essayé d'écrire un programme qui supprime les valeurs en double d'un tableau. J'ai en partie réussi à le faire puisque mon programme est capable de supprimer l'un des nombres qui sont répétés DEUX FOIS dans le tableau. Le problème est que si un nombre est répété trois fois, un seul des nombres est supprimé, c'est-à-dire que les deux autres sont toujours laissés dans le tableau, même si plus d'un nombre est répété même alors seul le nombre qui vient en premier le tableau est supprimé. Je ne comprends vraiment pas ce qui ne va pas avec mon code et pourquoi est-il incapable de supprimer les nombres qui sont répétés plus de deux fois. J'ai déjà surfé sur Internet à propos de ce problème et même si j'ai différentes façons de supprimer les éléments en double, je ne sais toujours pas ce qui ne va pas avec mon code.

#include <stdio.h>
#include <stdlib.h>

int dup(int [],int);
int main() 
{
    int i,n,index,a[20];
    printf("Enter n value \n");
    scanf("%d",&n);
    printf("Enter array values \n");
    for(i=0;i<n;++i)
        scanf("%d",&a[i]);
    for(i=0;i<n;++i)
    {
        index=dup(a,n);
        if(index==-1)
        {
            printf("No duplicate elements");
            break;
        }
        else
        {
            a[index]=0;
            for(i=index;i<n;i++)
                a[i]=a[i+1];
            n-=1;
        }
    }
    printf("Output: \n");
    for(i=0;i<n;++i)
        printf("%d\n",a[i]);

    return (EXIT_SUCCESS);
}
int dup(int a[],int size)
{
    int i,j,pos=-1;
    for(i=0;i<size;i++)
    {
        for(j=i+1;j<size;j++)
        {
            if(a[i]==a[j])
            {
                pos=j;
                return pos;
            }
        }
    }
    if(pos==-1)
        return pos;
}

PRODUCTION

Entrez la valeur n

5

Entrez les valeurs du tableau

12

24

3

12

24

Production:

12

24

3

24

Il ne supprime manifestement pas l'autre élément répété «24». De plus, si un nombre était répété trois fois, un seul des nombres serait supprimé.

-2
Vishist Varugeese 25 janv. 2017 à 10:10

4 réponses

Meilleure réponse
for(i=0;i<n;++i)  // <-------------------------------------- for i
{
    index=dup(a,n);
    if(index==-1)
    {
        printf("No duplicate elements");
        break;
    }
    else
    {
        a[index]=0;
        for(i=index;i<n;i++) // <--------------------------- for i
            a[i]=a[i+1];
        n-=1;
    }
}

Vous utilisez la même variable de boucle pour deux boucles, l'une imbriquée dans l'autre. Cela ne peut pas fonctionner. Utilisez différentes variables. Démo en direct.

2
n. 'pronouns' m. 25 janv. 2017 à 07:19

Vous devriez mieux nommer vos variables d'itérateur afin de ne pas les confondre dans des boucles imbriquées, ou comme vous le faites, utilisez les mêmes deux fois dans une boucle imbriquée. Cela ignore toutes les variables après votre première suppression.

Et tu n'as pas à faire ça

if(pos==-1)
    return pos;

Sautez le if car ce n'est pas nécessaire et si à cette position pos n'est pas -1 alors vous n'auriez aucun retour qui serait UB je pense.

0
Goodbye SE 25 janv. 2017 à 07:39

Mon erreur, à première vue, je pensais que vous aviez un problème avec n après avoir exécuté cela, cela a fonctionné.

#include <stdio.h>
#include <stdlib.h>

int dup(int [],int);
int main()
{
    int i,n,index,a[20], count;
    printf("Enter n value \n");
    scanf("%d",&n);
    count = n;
    int j;
    printf("Enter array values \n");
    for(i=0;i<n;++i)
        scanf("%d",&a[i]);
    for(i=0;i<n;++i)
    {
        index=dup(a,n);
        if(index==-1)
        {
            printf("No duplicate elements");
            break;
        }
        else
        {
            a[index]=0;
            for(j=index;j<n;j++)
                a[j]=a[j+1];
            n-=1;
        }
    }
    printf("Output: \n");
    for(i=0;i<n;++i)
        printf("%d\n",a[i]);

    return (EXIT_SUCCESS);
}
int dup(int a[],int size)
{
    int i,j,pos=-1;
    for(i=0;i<size;i++)
    {
        for(j=i+1;j<size;j++)
        {
            if(a[i]==a[j])
            {
                pos=j;
                return pos;
            }
        }
    }
    if(pos==-1)
        return pos;
}

PRODUCTION

Entrez la valeur n

5

Entrez les valeurs du tableau

12

24

3

12

24

Production:

12

24

3

0
Tony Tannous 25 janv. 2017 à 07:23

Le problème semble résider dans la condition if dans la deuxième boucle.

for (k = j; k < size; k++) {
           arr[k] = arr[k + 1];
        }

Mettez simplement ce morceau de code après votre condition if

if(a[i]==a[j])

et ça marchera.

0
Seeker 25 janv. 2017 à 07:18