Elimina i duplicati di un array

giuliomontenero
sto cercando di scrivere una funzione che dato un array mi restituisca un array che contenga gli stessi elementi senza i suoi duplicati
ecco qui il codice ma non ci riesco
lo faccio con gli array perchè con i vettori sarebbe troppo semplice e poi l'esercizio diceva di farlo con gli array
#include<iostream>
using namespace std;
void remove_duplicates(int [],int);
int main()
{
    const int da=9;
    int a[da]={1,4,9,16,9,7,4,9,11};

    remove_duplicates(a,da);

return 0;
}

void remove_duplicates(int x[],int dx)
{
    int c[dx];
    int dc=0;
    bool y[dx];
    for(int i=0;i<dx;i++)
    y[i]=false;

    for(int j=0;j<dx;j++)
    {
        if(y[j]==false)
        {
            c[dc]=x[j];
            dc++;
            y[j]=true;

        for(int s=0;s<dx;s++)
        {
            if(x[s]==x[j])
            x[s]=true;
        }
        }
    }

    for(int w=0;w<dc;w++)
    cout<<c[w]<<"  ";
}


Risposte
apatriarca
Per prima cosa un piccolo trucco per conoscere la dimensione di un array (nota che funziona solo nel blocco in cui l'array è stato definito). Nel tuo codice hai scritto:
const int da=9;
int a[da]= {1,4,9,16,9,7,4,9,11};

Il codice è certamente valido ma se decidessi di modificare l'array da non rappresenterebbe più necessariamente la sua dimensione e dovresti ricordarti di cambiarlo. Una soluzione alternativa è quello di farlo calcolare al tuo compilatore nel modo seguente:
int a[] = {1, 4,9,16,9,7,4,9,11};
const int da = sizeof(a)/sizeof(int);

Siccome sizeof calcola la dimensione in byte del suo argomento (che può essere una variabile o un tipo) stai calcolando il numero di elementi dividendo la dimensione in byte totale dell'array con la dimensione di un singolo elemento. Inoltre quando inizializzi un array in questo modo e vuoi che la dimensione sia calcolata automaticamente è sufficiente lasciare la dimensione vuota.

A questo punto una nota sul linguaggio C++. Il seguente codice non è valido:
void remove_duplicates(int x[],int dx)
{
    int c[dx];
    int dc=0;
    bool y[dx];

Non è infatti possibile dichiarare un array a partire da una variabile. Alcuni compilatori lo permettono come estensione, ma per lo standard queste righe sono sbagliate. Il metodo corretto sarebbe quello di usare l'allocazione dinamica della memoria. Ma ignorerò il problema nella correzione del codice.

Il motivo principale per cui il tuo programma non funziona è che nella seconda riga del seguente:
if(x[s]==x[j])
    x[s]=true;

hai scritto x al posto di y. Avrebbe infatti dovuto essere:
if(x[s]==x[j])
    y[s]=true;

Con questa modifica dovrebbe funzionare.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.