Oppure

Loading
24/08/09 15:38
Premoli
ciao a tutti!!!
ho un problema con una funzione che non riesco ad implementare, in pratica la funzione riceve in ingresso 3 vettori v1 v2 v3 di cui v1 e v2 caricati in precedenza dall'utente e successivamente ordinati, ora in v3 ci devo inserire in modo ordinato il contenuto dei due vettori (v1 e v2) e, se un elemento x è presente più volte nei due vettori, va inserito in v3 tante volte quanto è il massimo tra le presenze di x in v1 e v2.(Unione tra due collezioni).

ma forse un esempio renderà il concetto più chiaro:

v1={1,2,5,5,6,6,6}
v2={3,4,5,6,6,7}
allora
v3={1,2,3,4,5,5,6,6,6,7}

io la funzione l'ho implementata così :
codepad.org/…
però evidentemente non ho considerato tutti i casi, perchè diciamo che funziona un po' a fortuna :rotfl:

vi ringrazio anticipatamente per eventuali risposte...
aaa
24/08/09 16:37
oretovalley
Io eseguirei il lavoro da te richiesto in questo modo, spero di aver capito le tue intenzioni e che questo codice possa esserti utile :)

int fondi_vet(int *v1, int *v2, int *v3, int n1, int n2)
{
    int i = 0, j = 0;
    for(;i<n1;++i) {
       v3[i] = v1[i];
    }
    j = n1;
    for(i=0;i<n2;++i) {
       v3[j] = v2[i];
       j++;
    }
    int indice = 1, k = v3[0], contatore = 0, pos = 0;    
    do {                    
        for(;indice < j; ++indice) {
                 if(k > v3[indice]) {
                      k = v3[indice];
                      pos = indice;
                 }                 
        }
        v3[pos] = v3[contatore];   
        v3[contatore] = k;     
        contatore += 1;
        k = v3[contatore]; 
        indice = contatore + 1;               
     }while(contatore < j - 1);

    return j;
}


scusa ho letto ora il fattore delle presenze ora vedo di scriverti un codice funzionante anche per quello :asd:
Ultima modifica effettuata da oretovalley 24/08/09 16:52
aaa
24/08/09 16:48
Premoli
ti ringrazio per avermi risposto, però anche con la tua soluzione si verificano dei problemi :(
aaa
24/08/09 16:52
oretovalley
Postato originariamente da Premoli:

ti ringrazio per avermi risposto, però anche con la tua soluzione si verificano dei problemi :(


no è che non avevo letto la questione delle presenze ora te lo sistemo subito
aaa
24/08/09 17:43
oretovalley
Allora ecco il codice che ti serviva:

int fondi_vet(int *v1, int *v2, int *v3, int n1, int n2)
{
    
    int i = 0, j = 0,k = 0, somma = 0,somma2 = 0,contatore = 0,contatore2 = 0,trovato = 0;
    
    for(i = 0;i<n1;++i) {
        k = v1[i];
        trovato = 0;
        for(j = 0; j < contatore;j++) {
            if(v3[j]==v1[i]) {
                trovato = 1;
            }
          }
          if(trovato == 0) {
            for(j = 0 ;j < n1;++j) {
                if(k == v1[j]) {
                    somma += 1;
                }
            }
			for(j = 0; j < n2; ++j) {
				if(k == v2[j]) {
					somma2 +=1;
				}
		    }    
			if(somma > somma2) {
				for(j = 0; j < somma; ++j) {
					v3[contatore] = k;
					contatore++;
				}  
		    } else {
				if(somma2 > somma) {
					for(j = 0; j < somma2; ++j) {
						v3[contatore] = k;
						contatore++;
					}
				} else {
					v3[contatore] = k;
					contatore++;
				}                                    
		    }               
		   somma = 0;
		   somma2 = 0;
		}   
    }
        
    contatore2 = contatore;
    
    contatore = n1;
    
    for(i = 0;i<n2;++i) {
        trovato = 0;
        for(j = 0; j < contatore;j++) {
            if(v3[j]==v2[i]) {
                trovato = 1;
            }
        }
        if(trovato == 0) {          
            v3[contatore] = v2[i];
            contatore++;
        }
    }
              
    qsort (v3, contatore, sizeof(int), compare); 
    
    return contatore;
} 


questo codice è perfettamente funzionante ed è stato testato. ti posto il codice completo che ho utilizzato per provare il perfetto funzionamento:

#include<stdio.h>

int fondi_vet(int *v1, int *v2, int *v3,int n1,int n2);

int main() {
    int *v1,*v2,*v3,n1,n2,n3,k,i;
    printf("Inserisci il numero di elementi del primo vettore:\n");
    scanf("%d",&n1);
    v1 = (int*)malloc(n1*sizeof(int));
    for(i = 0; i < n1; ++i) {
        printf("Inserisci il %d numero: ",i+1);
        scanf("%d",&v1[i]); 
    }
    printf("Inserisci il numero di elementi del secondo vettore:\n");
    scanf("%d",&n2);
    v2 = (int*)malloc(n2*sizeof(int));
    for(i = 0; i < n2; ++i) {
        printf("Inserisci il %d numero: ",i+1);
        scanf("%d",&v2[i]); 
    }
    n3 = n1+n2;
    v3 = (int*)malloc(n3*sizeof(int));
    k = fondi_vet(v1,v2,v3,n1,n2);
    system("pause");
}

int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

int fondi_vet(int *v1, int *v2, int *v3, int n1, int n2)
{
    
    int i = 0, j = 0,k = 0, somma = 0,somma2 = 0,contatore = 0,contatore2 = 0,trovato = 0;
    
    for(i = 0;i<n1;++i) {
        k = v1[i];
        trovato = 0;
        for(j = 0; j < contatore;j++) {
            if(v3[j]==v1[i]) {
                trovato = 1;
            }
          }
          if(trovato == 0) {
            for(j = 0 ;j < n1;++j) {
                if(k == v1[j]) {
                    somma += 1;
                }
            }
			for(j = 0; j < n2; ++j) {
				if(k == v2[j]) {
					somma2 +=1;
				}
		    }    
			if(somma > somma2) {
				for(j = 0; j < somma; ++j) {
					v3[contatore] = k;
					contatore++;
				}  
		    } else {
				if(somma2 > somma) {
					for(j = 0; j < somma2; ++j) {
						v3[contatore] = k;
						contatore++;
					}
				} else {
					v3[contatore] = k;
					contatore++;
				}                                    
		    }               
		   somma = 0;
		   somma2 = 0;
		}   
    }
        
    contatore2 = contatore;
    
    contatore = n1;
    
    for(i = 0;i<n2;++i) {
        trovato = 0;
        for(j = 0; j < contatore;j++) {
            if(v3[j]==v2[i]) {
                trovato = 1;
            }
        }
        if(trovato == 0) {          
            v3[contatore] = v2[i];
            contatore++;
        }
    }
              
    qsort (v3, contatore, sizeof(int), compare); 
    
    for(i = 0; i < contatore; ++i) {
        printf("%d\n",v3[i]);
    }
    
    return contatore;
} 


Fammi sapere :)
aaa
24/08/09 18:33
Premoli
oretovalley sei stato veramente gentilissimo...
purtroppo qualche imperfezione c'è ancora... però hai già fatto più del dovuto... ora mi studio un po' il tuo codice e vedo se riesco anche a capire dov'è l'errore...

ti ringrazio!
aaa
24/08/09 18:37
oretovalley
beh potresti dirmi dove hai riscontrato l'errore cosi magari vedo di risolverlo anche nel mio codice :)
aaa
24/08/09 19:07
oretovalley
già che ci sono ho deciso di migliorare il mio codice ho fixato qualche bug è tolto una variabile, continua a funzionare bene, ti riposto il codice:

int fondi_vet(int *v1, int *v2, int *v3, int n1, int n2)
{
    
    int i = 0, j = 0,k = 0, somma = 0,somma2 = 0,contatore = 0,trovato = 0;
    
    for(i = 0;i<n1;++i) {
        k = v1[i];
        trovato = 0; 
        for(j = 0; j < contatore;j++) {
            if(v3[j]==v1[i]) {
                trovato = 1;
            }
          }
          if(trovato == 0) {
            for(j = 0 ;j < n1;++j) {
                if(k == v1[j]) {
                     
                    somma++;
                }
            }
			for(j = 0; j < n2; ++j) {
				if(k == v2[j]) {
					somma2++;
				}
		    }
			if(somma > somma2) {
				for(j = 0; j < somma; ++j) {
					v3[contatore] = k;
					contatore++;
				}  
		    } else {
				if(somma2 > somma) {
					for(j = 0; j < somma2; ++j) {
						v3[contatore] = k;
						contatore++;
					}
				} else {
					v3[contatore] = k;
					contatore++;
				}                                    
		    }               
		   somma = 0;
		   somma2 = 0;
		}   
    }
    
    for(i = 0;i<n2;++i) {
        trovato = 0;
        for(j = 0; j < contatore;j++) {
            if(v3[j]==v2[i]) {
                trovato = 1;
            }
        }
        if(trovato == 0) {          
            v3[contatore] = v2[i];
            contatore++;
        }
    }
              
    qsort (v3, contatore, sizeof(int), compare); 
    
    for(i = 0; i < contatore; ++i) {
        printf("%d\n",v3[i]);
    }
    
    return contatore;
} 



spero che abbia risolto i tuoi problemi :)
aaa