Eliminare elmenti uguali da vettore

di il
12 risposte

Eliminare elmenti uguali da vettore

Io ho pensato a qualcosa del genere, ma mi riduce il riempimento del vettore di troppo

:S
int min1 =v1[0];
	int temp;
	cout <<min1;
		//ordino il primo vettore
	for (int i=0;i<r1;i++){
		if(v1[i]<min1){
			temp=min1;
			min1=v1[i];
			v1[i]=temp;
			}
		}
	
		//elimino elementi uguali
	for(int i=0;i<r1;i++){
		for(int j=i+1;j<r1;j++){
			if(v1[i]==v1[j]){
				
				for(i=j;j<r1;j++){
					v1[i]=v1[i+1];
					r1--;
				}
			}
		}
	}
				
	cout<<endl;
	
	for(int i=0;i<r1;i++)
		cout<< v1[i]<<" ";

12 Risposte

  • Re: Eliminare elmenti uguali da vettore

    Sto ripartendo da capo.
    In principio :
    devo leggere da file una serie di interi, e calcolarne, nel caso, quante volte ogni elemento si ripete;
    dunque:

    apro il file e ne inserisco (fin quando non è finito il file stesso)il contenuto in un array di record (che ha due campi: valore e occorrenza)

    scorro l'array dei valori ;

    Se un elemento si ripete più volte, incremento il campo delle occorrenze di tante volte quante si ripete il numero nell'array dei valori.
  • Re: Eliminare elmenti uguali da vettore

    Ragazzi vi prego aiutatemi con l' algoritmo per la ricerca dell' elemento uguale, ma devo prima ordinare il vettore?
  • Re: Eliminare elmenti uguali da vettore

    Mhh provo ad aiutarti io anche se come saprai non sono bravissimo
    se lo ordini l'algoritmo verrà più corto altrimenti possiamo farlo senza ordinarlo ma dovrebbe essere più lungo xD
  • Re: Eliminare elmenti uguali da vettore

    1mm0rt4le ha scritto:


    mhh provo ad aiutarti io anche se come saprai non sono bravissimo
    se lo ordini l'algoritmo verrà più corto altrimenti possiamo farlo senza ordinarlo ma dovrebbe essere più lungo xD
    Gentilissimo, ti spego scrivo la funzione che non va:
    
    
    void calcolaOccorrenze(vettore v,int r){
        
                              for(int i=0;i<r;i++){
                                      int occ=1;
                                      v[i].occ=0;
                              for(int j=i+1;j<r;j++)
                                      if(v[i].val==v[j].val){
                                                          occ++;
                                      v[i].occ=occ;
                                    
                                      }
                                      if( v[i].occ!=0)
                                       cout<<"\n Il numero "<< v[i].val<<" si ripete "<<v[i].occ<< " volte";
                              }
                              
    }
    
    
    v è un array di record che ha due campi : valore e occorrenza

    il problema sussiste nel momento in cui un numero si ripete più di 2 volte, infatti:

    nell'ipotesi che il mio vettore sia costituito da : 1 2 2 3 4 5 6 3 7 8 9 6 6 5

    il mio programma mi mostra il seguente risultato:
    il numero 2 si ripete 2 volte
    il numero 3 si ripete 2 volte
    il numero 5 si ripete 2 volte
    il numero 6 si ripete 3 volte
    il numero 6 si ripete 2 volte
  • Re: Eliminare elmenti uguali da vettore

    Mhh proviamo così:

    void calcolaOccorrenze(vettore v,int r){
        
        int salta[r];//non so se il tuo compilatore lo compilerà
                              for(int i=0;i<r;i++){
                                      int occ=1;
                                      
                                      v[i].occ=0;
                              for(int j=i+1;j<r;j++)
                                      if(v[i].val==v[j].val){
                                                          occ++;
                                                          salta[j]=1;
                                      v[i].occ=occ;
                                    
                                      }
                                      if( v[i].occ!=0&&salta[i]!=1)
                                       cout<<"\n Il numero "<< v[i].val<<" si ripete "<<v[i].occ<< " volte";
                              }
                              
    }
    anche se non so se funziona
  • Re: Eliminare elmenti uguali da vettore

    Allora state faccendo diventare una cosa semplice, molto complicata. Questi dati vengono letti da file da quel che capisco. Crea un vettore di record. Ad ogni lettura vai a vedere se l'elemento esiste nei record se no aggiungi elemento e metti la sua occorrenza ad 1, se si incrementi occorrenza.
    
    int maxPosAttuale = 0; 
    int val = 0;
    
    while(in >> val)
    {
       int pos = esisteNeiRecord(records,maxPosAttuale,val);
       if(pos != -1)
           records[pos].occ++;
       else
       {
          records[maxPosAttuale].val = val;
          records[maxPosAttuale].occ = 1;
          maxPosAttuale++;
       }
    }
    
    
    .............
    
    //ritorna -1 se non trova il valore, altrimenti ritorna la posizione dove viene trovata.
    int esisteNeiRecord(const records[],int size, int val)
    {
          for(int i = 0; i < size; i++)
           {
                 if(records[i].val == val)
                    return i;     
           }    
    
        return -1;
    }
    
  • Re: Eliminare elmenti uguali da vettore

    Giusto Volevo modificare solo il suo codice non ci avevo pensato ad un altro approccio
  • Re: Eliminare elmenti uguali da vettore

    skynet ha scritto:


    Allora state faccendo diventare una cosa semplice, molto complicata. Questi dati vengono letti da file da quel che capisco. Crea un vettore di record. Ad ogni lettura vai a vedere se l'elemento esiste nei record se no aggiungi elemento e metti la sua occorrenza ad 1, se si incrementi occorrenza.
    
    int maxPosAttuale = 0; 
    int val = 0;
    
    while(in >> val)
    {
       int pos = esisteNeiRecord(records,maxPosAttuale,val);
       if(pos != -1)
           records[pos].occ++;
       else
       {
          records[maxPosAttuale].val = val;
          records[maxPosAttuale].occ = 1;
          maxPosAttuale++;
       }
    }
    
    
    .............
    
    //ritorna -1 se non trova il valore, altrimenti ritorna la posizione dove viene trovata.
    int esisteNeiRecord(const records[],int size, int val)
    {
          for(int i = 0; i < size; i++)
           {
                 if(records[i].val == val)
                    return i;     
           }    
    
        return -1;
    }
    
    perché mi complico la vita, sky ma da quanti anni programmi?
  • Re: Eliminare elmenti uguali da vettore

    Ti bastano 15?
  • Re: Eliminare elmenti uguali da vettore

    Ora mi spiego perché hai la soluzione a tutto, e sempre così geniale !
  • Re: Eliminare elmenti uguali da vettore

    Ricordati che c'è sempre da imparare, infatti sto linguaggio non ha mai limiti se non dalla propria creatività.
  • Re: Eliminare elmenti uguali da vettore

    skynet ha scritto:


    ricordati che c'è sempre da imparare, infatti sto linguaggio non ha mai limiti se non dalla propria creatività.
    ne farò tesoro
Devi accedere o registrarti per scrivere nel forum
12 risposte