[c] Eliminazione dei duplicati (vettori)

Pubblicità

jolly

Utente Attivo
Messaggi
110
Reazioni
4
Punteggio
38
Salve ecco il testo dell'esercizio:
Utilizzate un vettore unidimensionale per risolvere il seguente problema.Leggete in input 20 numeri,ognuno dei quali sarà compreso tra 10 e 100,estremi inclusi.ogni volta che leggete un numero,visualizzatelo qualora non sia un duplicato di uno già letto.Preparatevi al "caso peggiore" in cui tutti i 20 numeri siano differenti.Utilizzate il vettore più piccolo possibile per risolvere questo problema

Scusate ma avevo sbagliato l'esercizio.

Ma non ho capito se i 20 numeri li devo inserire io oppure devono essere generati in modo casuale,presumo la seconda, giusto?
 
Ultima modifica:
Allora, visto che l' esercizio si basa sui vettori, usiamo i vettori...
Io farei così:
1 - crei il tuo array A e lo riempi con i numeri da tastiera;
2 - ti crei un secondo array TEMP con la stessa dimensione del primo, e lo lasci vuoto.
3 - prendi il primo elemento di A e lo metti dentro TEMP
4 - prendi il secondo elemento di A, controlli che non sia presente in TEMP (scorri con un for) e lo metti dentro temp
5 - esegui il punto 4 per gli elementi n-esimi rimanenti

Codice:
#define DIM 5


int array[DIM];
int temp[DIM];
int i = 0;
int j = 1;


/*Riempio l' array*/
printf("Dammi 5 numeri: ");
scanf("%d%d%d%d%d", &array[0], &array[1], &array[2], &array[3], &array[4]);


/*Il primo numero di array è per forza unico*/
temp[0] = array[0];


/*Se non sono presenti, agiungo gli altri numeri di array a temp*/
for(i = 1; i < DIM; i++) {
	if(array[i] != temp[1] && array[i] != temp[2] && array[i] != temp[3] && array[i] != temp[4]) {
		temp[j] = array[i];
		j++;
	}
}


/*Pongo gli eventuali spazi vuoti di temp a -1*/
for(i = j; j < DIM; j++) temp[j] = -1;


/*Stampo i numeri rimasti*/
for(i = 0; i < DIM; i++) {
	if(temp[i] != -1) printf("%d\n", temp[i]);
}
 
Chiedo scusa ho sbagliato la traccia del esercizio,ora ho modificato il post
 
Ultima modifica:
Allora, i numeri li devi leggere da tastiera (ma anche se fossero casuali, non cambierebbe molto).
Per il resto, direi che è ancora più semplice del precedente: ti metto la soluzione sotto spoiler, così puoi confrontarla quando hai finito

Codice:
#include <stdio.h>


#define DIM 20;


int array[20];


/*prototipo funzione*/
int control(int);


/*controllo che il numero non sia duplicato*/
/*1 - il numero non è presente*/
/*0 - il numero è presente*/
int control(int num, int temp) {


    int i;


    for(i = 0; i < temp; i++) if(array[i] == num) return 0;
    return 1;
}


int main() {


    int i, temp;


    for(i = 0; i < DIM; i++) {
        printf("Dammi un numero: ");
        scanf("%d", &array[i]);
        temp = i;
        if(control(array[i], temp) == 0) printf("Numero %d duplicato", i);
        else printf("Numero %d: %d", i, array[i]);
    }


    return 0;
}
 
da quanto ho capito però deve mettere nell'array solo i numeri che non sono duplicati, non tutti quanti, giusto?
 
praticamente ogni numero che leggo devo essere visualizzato qualora non sia un duplicato di uno già letto.
 
Ho provato il codice e devo dire che funziona,però non ho capito alcune cose:
1) La variabile temp cosa rappresenta?
Codice:
void main()
{

	int i, temp;

	for (i = 0; i < DIM; i++) {
		printf("Dammi un numero: ");
		scanf("%d", &array[i]);
		temp = i;
        
		if (control(array[i], temp) == 0) {
			printf("Numero %d duplicato\n", i);
		}
	
		else {
			printf("Numero %d: %d\n", i, array[i]);
		}
    	}

}

int control(int num, int tem) 
{

	int i;

	for (i = 0; i < tem; i++) {
    		
		if (array[i] == num) {
			return 0;
		}
	}
	
	return 1;
}
Allora noi passiamo alla funzione control una copia dell' argomento temp che sarebbe tem,ma poichè temp è uguale a i,e poichè inizializziamo i a 0,in questo caso
Codice:
for (i = 0; i < tem; i++)
se tem è uguale a 0,la condizione sarebbe falsa,ma invece funziona e non capisco perchè :boh:
 
Scusa il ritardo...
La variabile temp rappresenta l' indice dell' array a cui sei arrivato, ovvero: supponiamo che tu abbia inserito la quinta cifra nell' array, allora temp = 4 (l' array inizia da 0).
In questo modo, posso passare temp a control, in modo che che controlli che il numero che hai appena inserito non sia presente nell' array in posizione 0 - temp (ovvero nelle posizioni prima del tuo inserimento).
Guardando meglio però temp risulta inutile, prova a togliere temp e passare come parametro di control() direttamente i, dovrebbe funzionare

se tem vale 0, è vero control() non viene eseguito, ma se tem = 0 significa che nell' array è presente un solo elemento, quindi non ha senso controllare i doppi...
 
Ultima modifica da un moderatore:
Si infatti ho tolto la variabile temp ed ho passato alla funzione control direttamente i e funziona lo stesso,comunque ora ho capito il procedimento,grazie mille
 
Pubblicità
Pubblicità
Indietro
Top