Eliminare duplicati

di il
18 risposte

Eliminare duplicati

Ciao ragazzi, ho dei problemi con un esercizio di c++
il comando è: inserire nel vettore B i valori del vettore A senza duplicati (nel caso ci fossero inserire il valore solo una volta)
io ho provato a scriverlo ma non capisco come inserire solo uno dei valori dei duplicati, vi allego quello che ho scritto io.
 #include <iostream>
#define DIM 5
using namespace std;
int main()
{
	int a[DIM], b[DIM], i,j, cont,k;
	for (i = 0; i < DIM; i++)
	{
		cin >> a[i];
	}
	k = 0;
	for (i = 0; i < DIM; i++)
	{
		cont = 0;
		for (j = 0; j < DIM && k<DIM; j++)
		{
			if (a[i] == a[j] && i!=j)
			{
				cont++;
			}
			
		}
		if (cont > 0)
		{
			b[k] = a[i];
			k++;
		}

	}
	return 0;
}

18 Risposte

  • Re: Eliminare duplicati

    Perchè nel terzo ciclo hai posto anche k<DIM ?
  • Re: Eliminare duplicati

    Perchè nel vettore B non devono essere inseriti più valori rispetto alla dimensione
  • Re: Eliminare duplicati

    Continuo a non capire, se già nel ciclo poni j<DIM come fai a inserire più valori della dimensione? poi controlla cosa fa la k nel ciclo, metti un cout<<k e vedrai con i tuoi occhi che non ha senso. Infine hai in mente un ragionamento (anche senza codice) per come evitare di ripetere i valori identici?
  • Re: Eliminare duplicati

    Dovrei confrontare ogni numero per tutto il vettore e se trova il valore diversi lo inserisco in B se trova valori uguali non li considera
  • Re: Eliminare duplicati

    Quando ero piccolo(*), prima di scrivere una sola riga di codice sul mio fido MSX con CP/M, prendevo un blocco di fogli A4, una matita, una gomma e mi mettevo a fare degli schemi a blocchi del programma, che poi traducevo in macroistruzioni, che finalmente diventavano un programma. Nel tuo caso avrei disegnato il vettore A come una serie di caselline numerate con un numero dentro, ed il vettore B come una serie di caselline numerate, vuote. Poi avrei iniziato a ragionare su come copiare i valori da A a B. Il primo risultato dovrebbe essere un "algoritmo basico" che potrebbe essere il seguente:
  • Re: Eliminare duplicati

    ylenia987654321 ha scritto:


    Dovrei confrontare ogni numero per tutto il vettore e se trova il valore diversi lo inserisco in B se trova valori uguali non li considera
    Lo puoi fare in diversi modi, quello che ti consiglio però è di prendere un libro e studiare il capitolo riguardante gli array dove quasi sicuramente troverai spiegato quello che cerchi, e ti consiglio anche di dare un occhiata alla parte relativa alle iterazioni. Comunque un modo per risolvere l'esercizio potrebbe essere utilizzare due cicli annidati e il secondo lo inizializzi all'indice del primo +1, poi crei una condizione e vedi se i vettori con gli indici sono uguali. Ma ripeto studia bene questo argomento prima di buttarti a scrivere codici.
  • Re: Eliminare duplicati

    Però scusami iniziare il for da j=i+1 o mettere i!=j nell'if non viene fuori lo stesso risultato?
    inoltre con j=i+1 si analizza solo il successivo non tutto il vettore vero?
    cioè se i=0 verrà confrontato solo con j=1
  • Re: Eliminare duplicati

    L'ho rifatto, i duplicati li inserisce bene (cioè inserisce solo un numero di due) adesso il problema è che però non mi inserisce i valori che non hanno duplicati
    #include <iostream>
    #define DIM 5
    using namespace std;
    int main()
    {
    	int a[DIM], b[DIM], i, j, cont, k;
    	for (i = 0; i < DIM; i++)
    	{
    		cin >> a[i];
    	}
    	k = 0;
    	for (i = 0; i < DIM; i++)
    	{
    		cont = 0;
    		for (j = i + 1; j < DIM; j++)
    		{
    			if (a[i] == a[j])
    			{
    
    				cont++;
    			}
    		}
    		if (cont > 0)
    		{
    			b[k] = a[i];
    			k++;
    		}
    	}
    	return 0;
    } 
  • Re: Eliminare duplicati

    Scusa ... da cosa vedi il risultato?

    E comunque, quel codice è da ripensare ... io farei qualcosa del genere appoggiandomi ad un altro vettore t
    
    	int i, j, k;
    	int a[DIM], b[DIM];
    	int t[DIM] = { 0 };
    	
    	for (i = 0; i < DIM; i++)
    	{
    		cin >> a[i];
    		
    		if (i)
    			for (j = i-1; j >= 0; j--)
    				if (a[i] == a[j])
    					t[i] = 1;
    	}
    
    	for (i = k = 0; i < DIM; i++)
    		if (t[i]==0)
    			b[k++] = a[i];
    
    	for (i = 0; i < k; i++)
    		printf("%d ", b[i]);
    
    	printf("\n");
    
    Vedi se ne comprendi il semplice funzionamento
  • Re: Eliminare duplicati

    Si ho capito la tua scrittura, ma non posso usare vettori in più altrimenti mi annullano la prova
  • Re: Eliminare duplicati

    Comunque con il codice che ho fatto io quando inserisco i valori 1,2,1,3,4 mi esce 1 (ovvero uno solo dei valori dei duplicati) non so come mettere anche 2,3,4
  • Re: Eliminare duplicati

    ylenia987654321 ha scritto:


    Si ho capito la tua scrittura, ma non posso usare vettori in più altrimenti mi annullano la prova
    Beh bastava dirlo prima...
  • Re: Eliminare duplicati

    ylenia987654321 ha scritto:


    Comunque con il codice che ho fatto io....
    Se mi permetti, il tuo codice è completamente fuori strada

    Inserisce tutti e solo i duplicati
    In realtà scarta i valori singoli e la prima occorrenza dei duplicati

    Fidati se ti dico che fai prima a ripartire da zero

    Ti hanno dato tanti consigli validi, quindi io non voglio ripeterli

    Fai un bel respiro, fumati una sigaretta, rilassati
    Poi riparti da capo: butta via tutto (ma proprio tutto) quello che hai scritto
    E parti da leggere i consigli

    Ci vogliono 5 minuti (fidati ho provato) a risolvere la consegna
    Con metodo e calma ci puoi riuscire
  • Re: Eliminare duplicati

    ylenia987654321 ha scritto:


    Comunque con il codice che ho fatto io quando inserisco i valori 1,2,1,3,4 mi esce 1 (ovvero uno solo dei valori dei duplicati) non so come mettere anche 2,3,4
    Hai risolto? Provato a scrivere il codice con i consigli avuti?
    Facci sapere
Devi accedere o registrarti per scrivere nel forum
18 risposte