Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C] unire 2 vettori in modo ordinato
Forum - C/C++ - [C] unire 2 vettori in modo ordinato

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Premoli (Normal User)
Pro


Messaggi: 108
Iscritto: 25/06/2009

Segnala al moderatore
Postato alle 17:38
Lunedì, 24/08/2009
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ì :
http://codepad.org/uRqTeJ7O
però evidentemente non ho considerato tutti i casi, perchè diciamo che funziona un po' a fortuna :rotfl:

vi ringrazio anticipatamente per eventuali risposte...

PM Quote
Avatar
oretovalley (Normal User)
Pro


Messaggi: 109
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 18:37
Lunedì, 24/08/2009
Io eseguirei il lavoro da te richiesto in questo modo, spero di aver capito le tue intenzioni e che questo codice possa esserti utile :)

Codice sorgente - presumibilmente C++

  1. int fondi_vet(int *v1, int *v2, int *v3, int n1, int n2)
  2. {
  3.     int i = 0, j = 0;
  4.     for(;i<n1;++i) {
  5.        v3[i] = v1[i];
  6.     }
  7.     j = n1;
  8.     for(i=0;i<n2;++i) {
  9.        v3[j] = v2[i];
  10.        j++;
  11.     }
  12.     int indice = 1, k = v3[0], contatore = 0, pos = 0;    
  13.     do {                    
  14.         for(;indice < j; ++indice) {
  15.                  if(k > v3[indice]) {
  16.                       k = v3[indice];
  17.                       pos = indice;
  18.                  }                
  19.         }
  20.         v3[pos] = v3[contatore];  
  21.         v3[contatore] = k;    
  22.         contatore += 1;
  23.         k = v3[contatore];
  24.         indice = contatore + 1;              
  25.      }while(contatore < j - 1);
  26.  
  27.     return j;
  28. }



scusa ho letto ora il fattore delle presenze ora vedo di scriverti un codice funzionante anche per quello :asd:

Ultima modifica effettuata da oretovalley il 24/08/2009 alle 18:52
PM Quote
Avatar
Premoli (Normal User)
Pro


Messaggi: 108
Iscritto: 25/06/2009

Segnala al moderatore
Postato alle 18:48
Lunedì, 24/08/2009
ti ringrazio per avermi risposto, però anche con la tua soluzione si verificano dei problemi :(

PM Quote
Avatar
oretovalley (Normal User)
Pro


Messaggi: 109
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 18:52
Lunedì, 24/08/2009
Testo quotato

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

PM Quote
Avatar
oretovalley (Normal User)
Pro


Messaggi: 109
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 19:43
Lunedì, 24/08/2009
Allora ecco il codice che ti serviva:

Codice sorgente - presumibilmente C++

  1. int fondi_vet(int *v1, int *v2, int *v3, int n1, int n2)
  2. {
  3.    
  4.     int i = 0, j = 0,k = 0, somma = 0,somma2 = 0,contatore = 0,contatore2 = 0,trovato = 0;
  5.    
  6.     for(i = 0;i<n1;++i) {
  7.         k = v1[i];
  8.         trovato = 0;
  9.         for(j = 0; j < contatore;j++) {
  10.             if(v3[j]==v1[i]) {
  11.                 trovato = 1;
  12.             }
  13.           }
  14.           if(trovato == 0) {
  15.             for(j = 0 ;j < n1;++j) {
  16.                 if(k == v1[j]) {
  17.                     somma += 1;
  18.                 }
  19.             }
  20.                         for(j = 0; j < n2; ++j) {
  21.                                 if(k == v2[j]) {
  22.                                         somma2 +=1;
  23.                                 }
  24.                     }    
  25.                         if(somma > somma2) {
  26.                                 for(j = 0; j < somma; ++j) {
  27.                                         v3[contatore] = k;
  28.                                         contatore++;
  29.                                 }  
  30.                     } else {
  31.                                 if(somma2 > somma) {
  32.                                         for(j = 0; j < somma2; ++j) {
  33.                                                 v3[contatore] = k;
  34.                                                 contatore++;
  35.                                         }
  36.                                 } else {
  37.                                         v3[contatore] = k;
  38.                                         contatore++;
  39.                                 }                                    
  40.                     }              
  41.                    somma = 0;
  42.                    somma2 = 0;
  43.                 }  
  44.     }
  45.        
  46.     contatore2 = contatore;
  47.    
  48.     contatore = n1;
  49.    
  50.     for(i = 0;i<n2;++i) {
  51.         trovato = 0;
  52.         for(j = 0; j < contatore;j++) {
  53.             if(v3[j]==v2[i]) {
  54.                 trovato = 1;
  55.             }
  56.         }
  57.         if(trovato == 0) {          
  58.             v3[contatore] = v2[i];
  59.             contatore++;
  60.         }
  61.     }
  62.              
  63.     qsort (v3, contatore, sizeof(int), compare);
  64.    
  65.     return contatore;
  66. }



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

Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2.  
  3. int fondi_vet(int *v1, int *v2, int *v3,int n1,int n2);
  4.  
  5. int main() {
  6.     int *v1,*v2,*v3,n1,n2,n3,k,i;
  7.     printf("Inserisci il numero di elementi del primo vettore:\n");
  8.     scanf("%d",&n1);
  9.     v1 = (int*)malloc(n1*sizeof(int));
  10.     for(i = 0; i < n1; ++i) {
  11.         printf("Inserisci il %d numero: ",i+1);
  12.         scanf("%d",&v1[i]);
  13.     }
  14.     printf("Inserisci il numero di elementi del secondo vettore:\n");
  15.     scanf("%d",&n2);
  16.     v2 = (int*)malloc(n2*sizeof(int));
  17.     for(i = 0; i < n2; ++i) {
  18.         printf("Inserisci il %d numero: ",i+1);
  19.         scanf("%d",&v2[i]);
  20.     }
  21.     n3 = n1+n2;
  22.     v3 = (int*)malloc(n3*sizeof(int));
  23.     k = fondi_vet(v1,v2,v3,n1,n2);
  24.     system("pause");
  25. }
  26.  
  27. int compare (const void * a, const void * b)
  28. {
  29.   return ( *(int*)a - *(int*)b );
  30. }
  31.  
  32. int fondi_vet(int *v1, int *v2, int *v3, int n1, int n2)
  33. {
  34.    
  35.     int i = 0, j = 0,k = 0, somma = 0,somma2 = 0,contatore = 0,contatore2 = 0,trovato = 0;
  36.    
  37.     for(i = 0;i<n1;++i) {
  38.         k = v1[i];
  39.         trovato = 0;
  40.         for(j = 0; j < contatore;j++) {
  41.             if(v3[j]==v1[i]) {
  42.                 trovato = 1;
  43.             }
  44.           }
  45.           if(trovato == 0) {
  46.             for(j = 0 ;j < n1;++j) {
  47.                 if(k == v1[j]) {
  48.                     somma += 1;
  49.                 }
  50.             }
  51.                         for(j = 0; j < n2; ++j) {
  52.                                 if(k == v2[j]) {
  53.                                         somma2 +=1;
  54.                                 }
  55.                     }    
  56.                         if(somma > somma2) {
  57.                                 for(j = 0; j < somma; ++j) {
  58.                                         v3[contatore] = k;
  59.                                         contatore++;
  60.                                 }  
  61.                     } else {
  62.                                 if(somma2 > somma) {
  63.                                         for(j = 0; j < somma2; ++j) {
  64.                                                 v3[contatore] = k;
  65.                                                 contatore++;
  66.                                         }
  67.                                 } else {
  68.                                         v3[contatore] = k;
  69.                                         contatore++;
  70.                                 }                                    
  71.                     }              
  72.                    somma = 0;
  73.                    somma2 = 0;
  74.                 }  
  75.     }
  76.        
  77.     contatore2 = contatore;
  78.    
  79.     contatore = n1;
  80.    
  81.     for(i = 0;i<n2;++i) {
  82.         trovato = 0;
  83.         for(j = 0; j < contatore;j++) {
  84.             if(v3[j]==v2[i]) {
  85.                 trovato = 1;
  86.             }
  87.         }
  88.         if(trovato == 0) {          
  89.             v3[contatore] = v2[i];
  90.             contatore++;
  91.         }
  92.     }
  93.              
  94.     qsort (v3, contatore, sizeof(int), compare);
  95.    
  96.     for(i = 0; i < contatore; ++i) {
  97.         printf("%d\n",v3[i]);
  98.     }
  99.    
  100.     return contatore;
  101. }



Fammi sapere :)

PM Quote
Avatar
Premoli (Normal User)
Pro


Messaggi: 108
Iscritto: 25/06/2009

Segnala al moderatore
Postato alle 20:33
Lunedì, 24/08/2009
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!

PM Quote
Avatar
oretovalley (Normal User)
Pro


Messaggi: 109
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 20:37
Lunedì, 24/08/2009
beh potresti dirmi dove hai riscontrato l'errore cosi magari vedo di risolverlo anche nel mio codice :)

PM Quote
Avatar
oretovalley (Normal User)
Pro


Messaggi: 109
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 21:07
Lunedì, 24/08/2009
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:

Codice sorgente - presumibilmente C++

  1. int fondi_vet(int *v1, int *v2, int *v3, int n1, int n2)
  2. {
  3.    
  4.     int i = 0, j = 0,k = 0, somma = 0,somma2 = 0,contatore = 0,trovato = 0;
  5.    
  6.     for(i = 0;i<n1;++i) {
  7.         k = v1[i];
  8.         trovato = 0;
  9.         for(j = 0; j < contatore;j++) {
  10.             if(v3[j]==v1[i]) {
  11.                 trovato = 1;
  12.             }
  13.           }
  14.           if(trovato == 0) {
  15.             for(j = 0 ;j < n1;++j) {
  16.                 if(k == v1[j]) {
  17.                      
  18.                     somma++;
  19.                 }
  20.             }
  21.                         for(j = 0; j < n2; ++j) {
  22.                                 if(k == v2[j]) {
  23.                                         somma2++;
  24.                                 }
  25.                     }
  26.                         if(somma > somma2) {
  27.                                 for(j = 0; j < somma; ++j) {
  28.                                         v3[contatore] = k;
  29.                                         contatore++;
  30.                                 }  
  31.                     } else {
  32.                                 if(somma2 > somma) {
  33.                                         for(j = 0; j < somma2; ++j) {
  34.                                                 v3[contatore] = k;
  35.                                                 contatore++;
  36.                                         }
  37.                                 } else {
  38.                                         v3[contatore] = k;
  39.                                         contatore++;
  40.                                 }                                    
  41.                     }              
  42.                    somma = 0;
  43.                    somma2 = 0;
  44.                 }  
  45.     }
  46.    
  47.     for(i = 0;i<n2;++i) {
  48.         trovato = 0;
  49.         for(j = 0; j < contatore;j++) {
  50.             if(v3[j]==v2[i]) {
  51.                 trovato = 1;
  52.             }
  53.         }
  54.         if(trovato == 0) {          
  55.             v3[contatore] = v2[i];
  56.             contatore++;
  57.         }
  58.     }
  59.              
  60.     qsort (v3, contatore, sizeof(int), compare);
  61.    
  62.     for(i = 0; i < contatore; ++i) {
  63.         printf("%d\n",v3[i]);
  64.     }
  65.    
  66.     return contatore;
  67. }



spero che abbia risolto i tuoi problemi :)

PM Quote
Avatar
Premoli (Normal User)
Pro


Messaggi: 108
Iscritto: 25/06/2009

Segnala al moderatore
Postato alle 21:16
Lunedì, 24/08/2009
il codice non mi da nessun errore in fase di compilazione però in esecuzione se ad esempio
carico i vettori così

v1={1,1,1,2}
v2={1,1,4,5,5}

come output mi da

v3={1,1,1,2,4,5}

invece avrebbe dovuto darmi

v3={1,1,1,2,4,5,5}


PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo