Array senza ripetizioni

di il
4 risposte

Array senza ripetizioni

Salve a tutti ragazzi. Da stamattina cerco di capire come risolvere questo problema: "Scrivere un programma che legga un numero determinato di interi (1000 al massimo) dalla console e li visualizzi nello stesso ordine e con la condizione che ogni intero sia scritto una sola volta. Ad esempio se si leggono dalla console i seguenti numeri 55 78 -25 55 24 -3 7, il programma dovrà visualizzare: 55 78 -25 24 -3 7. Trattare l'array con i puntatori.". Ora per facilitarmi un po' le cose ho scritto un programma che prende un vettore di 10 interi, lo visualizza, e poi ne dovrebbe dare quello modificato senza ripetizioni. La mia idea è stata questa: fare due cicli for per confrontare un elemento fisso dell'array con tutti gli altri, e se trova elementi uguali scambiarli di posto (ad esempio se il primo elemento dell'array a[0] è uguale ad a[5] scambio a[6] con a[5] in modo da portarmelo avanti a[5] anche al successivo confronto fino alla fine dell'array). Esempio numerico:
Vettore: 1 2 3 4 2 5 4 7 1 10
1° step: 1 2 3 4 2 5 4 7 10 1
2° step: 1 2 3 4 5 4 7 10 1 2 (Il 2 in posizione 4 me lo porto avanti fino all'ultimo)
3° step: 1 2 3 4 5 7 10 1 2 4 (Il 4 in posizione 5 me lo porto avanti fino all'ultimo)
Il vettore finale esatto dovrebbe essere uguale a quello del 3° step meno i tre elementi finali, ossia:
Vettore modificato: 1 2 3 4 5 7 10
Il mio programma non arriva fino al vettore modificato perchè non riesco ad implementare il fatto che la dimensione del vettore debba scendere di un numero pari alle ripetizioni che trova. Si ferma con un certo errore, nel senso che non stampa il vettore così come l'ho scritto prima (mette anche numeri strani) fino al 3° step. Come posso correggerlo? Incollo il codice:

#include <iostream>

using namespace std;

int main ()
{
    int *entrata=new int[10]; 
    
    cout << "Inserisci 10 numeri interi nel vettore: ";
    for (int i=0; i<10; i++) 
    cin >> entrata[i];
    
    cout << endl << "VETTORE: ";
    for (int i=0; i<10; i++)
    cout << entrata[i] << " ";
    
    int aux;
    cout << endl << "VETTORE MODIFICATO: ";
    for (int i=0; i<10; i++)
    {
    for (int j=i+1; j<10; j++)
    if (entrata[i]==entrata[j])
    {
    aux=entrata[j];
    entrata[j]=entrata[j+1];
    entrata[j+1]=aux;
    }
    }
    for (int i=0; i<10; i++)
    cout << entrata[i] << " ";
    delete [] entrata; 
    
    cout << endl << endl;   
    system ("PAUSE");
    return 0;
}

4 Risposte

  • Re: Array senza ripetizioni

    Non ho guardato ancora il tuo listato ma la mia idea è + semplice del tuo procedimento:
    Ad ogni inserimento vai a vedere se l'elemento esiste nel vettore. Se c'è lo scarti e non lo inserisci. se non c'è lo inserisci. Alla fine avrai il vettore come vuole l'esercizio.
  • Re: Array senza ripetizioni

    Ecco una cosa così
    
    
    #include <iostream>
    
    using namespace std;
    
    bool esiste(int v[],int maxElem, int num);
    
    int main ()
    {
    	int *entrata=new int[10];
    	int numElementiInserti = 0;
    	int num;
    
    	cout << "Inserisci 10 numeri interi nel vettore: ";
    	for (int i=0; i<10; i++)
    	{
    		cin >> num;
    		if(!esiste(entrata,numElementiInserti,num))
    		{
    			entrata[numElementiInserti] = num;
    			numElementiInserti++;
    		}
    	}
    
    	cout << endl << "VETTORE: ";
    	for (int i=0; i<numElementiInserti; i++)
    		cout << entrata[i] << " ";
    
    	delete [] entrata;
    	cout << endl << endl;   
    	system ("PAUSE");
    	return 0;
    }
    
    bool esiste(int v[],int maxElem, int num)
    {
    	for(int i = 0; i < maxElem; ++i)
    	{
    		if(v[i] == num)
    			return true;
    	}
    	return false;
    }
    
  • Re: Array senza ripetizioni

    Infatti cosi facendo guadagni pure nelle prestazioni... vorrei vedere in un arrai di mille cercare e spostare i doppioni... e poi la dimensione dell'array di mille quanto la faresti ? 1500? e se ci sono più di un doppione? sarebbe quanto meno imprevedibile no ?
  • Re: Array senza ripetizioni

    Grazie ragazzi ora è chiaro. Effettivamente la mia soluzione non è efficiente meglio controllare a run time se un elemento viene o meno inserito.
Devi accedere o registrarti per scrivere nel forum
4 risposte