|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jan 2009
Messaggi: 54
|
[C] Programma sui vettori
ciao a tutti mi servirebbe una mano con questo programma che non sono riuscito a fare
abbiamo due vettori uno di dimensione M uno di dimensione N in ordine crescente bisogna fare la differenza...(non mi ricordo il nome) e metterla in ordine crescente nel vettore c di dimensioni non piu di M+N se per esempio abbiamo il vettore a {1,2,3,5,6} e il b{2,4,5,7} il vettore c sara {1 ,3 ,4 ,6 ,7 } in ordine crescente ed i numeri uguali non si ripetono grazie per l aiuto se non avete capito qualcosa del problema chiedete magari mi sono spiegato male in qualche punto |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
ti basta fare un merge (come quello del merge sort) con una leggera modifica per non mettere due numeri uguali nel nuovo vettore
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Jan 2009
Messaggi: 54
|
grazie ho letto questo merce ma se io non l ho studiamo come mi faceva a venire in mente una cosa del genere ..
non cè un metodo alternativo a questo merce??' mi sono scordato di dire che all inizio di questo problema non c era scritto algoritmo ricorsivo ma iterativo Ultima modifica di ziomerio : 13-03-2011 alle 11:00. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
La versione più semplice ti richiede di fare 2 cicli per controllare se un elemento è nell'altro vettore.
Se devi calcolare A - B ciò significa che vanno presi tutti gli elementi di A che non sono in B. Quindi scorri il vettore A e per ogni elemento controlli se il vettore B non contiene quell'elemento. Se B non lo contiene allora lo inserisci nel vettore di destinazione. Nota bene: Una versione un po' più sofisticata tiene conto del fatto che i vettori sono in ordine crescente, in particolare se stai testando {x, elemento di A, appartiene a B?} il ciclo interno si interromperà non appena trovi un y > x (x appartiene ad A e y appartiene a B). Esempio: A {1, 2, 3, 5, 6} B {2, 4, 5, 7} 1 presente in B? In B trovi 2, esci dal ciclo interno perché sai che sicuramente 1 non c'è, copi 1 in C. 2 presente in B? Trovi 2, non fai nulla 3 presente in B? Trovo 2, proseguo, trovo 4, esco dal ciclo, poiché 3 non c'è lo copio in C (edit: nell'esempio sopra ho corretto l'errore) E così via. Naturalmente gli elementi inseriti sono inseriti in ordine crescente, perché sei sicuro che ad ogni passo del ciclo ti trovi davanti ad un elemento maggiore del precedente. Nota bene: si può ottimizzare ulteriormente tenendo traccia dell'ultimo elemento controllato in B e quindi usare l'indice salvato per ripartire da lì!!! Così facendo fai pochissimi confronti nel ciclo interno, nell'ordine di O(n+m) anziché O(n*m). Ultima modifica di WarDuck : 14-03-2011 alle 09:49. |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Jan 2009
Messaggi: 54
|
il problema è che io ho capito come si risolve teoricamente il problema è la pratica perchè mi mettono in difficolta quelle dimensioni M ed N
quindi potrei chiamare l indice a[0] ma visto che non so M quanto sia se 5 o 6 non so dove fermarmi ... non so se mi hai capito . io dichiaro il vettore a[M] e il vettore b[N] quindi dovrei avere un contatore tipo int i per a e uno per b j e magari trovare i loro valori con un for(i=0,i<M,i++) { e qui dentro metto un altro for per la N e poi metto a confronto a[i] con b[j] diciamo questa era la mia idea ma probabilmente sbaglio |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
Ma i vettori devono essere letti da tastiera o da file?
Perché altrimenti ti basta metterli nel codice, avendo le dimensioni note a priori: Codice:
#include ... #define N 6 #define M 5 int main(void) { int a[] = { ... }; // dichiari gli N elementi del vettore A int b[] = { ... }; // dichiari gli M elementi del vettore B for (int i=0; i<N; i++) { for (int j=0; j<M; j++) { ... } } return 0; } ![]() |
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Jan 2009
Messaggi: 54
|
Quote:
i vettori gia sono definiti non li devi inserire tu =D ed il mio problem è che il vettore c gli do come grandezza M+N e non riesco a fare a[i]=c[k] non riesco a fare il passaggio da i vettori a e b a il vettore c:S Ultima modifica di ziomerio : 13-03-2011 alle 14:57. |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
Il vettore C sarà dichiarato come:
Codice:
#include ... #define N 6 #define M 5 ... int c[M+N]; ... Codice:
k=0; for (..) { ... if ( condizione su a e b verificata ) { c[k] = ... k++; } } ![]() Intanto fallo funzionare anche in maniera "semplice" (ovvero facendo tutti i controlli), poi guardiamo ad eventuali ottimizzazioni. Ultima modifica di WarDuck : 13-03-2011 alle 16:15. |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Voglio darti un piccolo consiglio.... Per facilitarti la situazione (molto semplice di per se e risolvibile nei modi in cui ti hanno già consigliato) potresti crearti una funzione che prende come parametri un array, la sua dimensione, e l'elemento da cercare. Una cosa del tipo
Codice:
int funzione(array, dim, elem){ cerchi l'elemento in tutto l'array se trovato return 1 al termine della scansione dell'array ritorni 0 Codice:
int funzione(array, dim, elem); int main(int argv, char ** argp){ arrayA arrayB dimA dimB nuovoArrayC per ogni c elem di arrA se funzione(arrayB, dimA, c) == 1 aggiungi c in nuovoArrayC ps come ha già detto warduck possono esserci degli accorgimenti per "lavorare" di meno dato che gli array sono ordinati, ma non ne ho tenuto conto |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Jan 2009
Messaggi: 54
|
niente piu ci provo meno mi riesce non so che fare ....
e cmq per warduck non devo inserire i valori uguali ai due vettori ma quelli differenti A {1, 2, 3, 5, 6} B {2, 4, 5, 7} 1 presente in B? In B trovi 2, esci dal ciclo interno perché sai che sicuramente 1 non c'è. 2 presente in B? Trovi 2 e lo copi in C 3 presente in B? Trovo 2, proseguo, trovo 4, esco magari ho inteso male quello che hai scritto Ultima modifica di ziomerio : 13-03-2011 alle 19:44. |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Dato che ti vedo molto in difficoltà scrivi il codice di ricerca di un intero in un array di interi e postalo
|
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Jan 2009
Messaggi: 54
|
scrivo solo la funzione
int ricerca(int array[],int key,int size) key sarebbe il numero che inserisco { int n=0; for(n=0; n=< size - 1;n++) if (array[n]==key) return n; return -1 } |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
perfetto e adesso basta fare un ciclo (nel main) che scorre l'altro array e per ogni suo elemento chiama la funzione e per ogni return diverso da -1 lo aggiunge nel nuovo array...
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Ops chiedo scusa ho capito male il problema.. comunque è uguale... per ogni return uguale a -1 lo aggiungi nel vettore..
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Effettivamente sono stato troppo frettoloso non avevo capito bene il problema... spero di non averlo confuso troppo!
|
![]() |
![]() |
![]() |
#17 |
Member
Iscritto dal: Jan 2009
Messaggi: 54
|
quindi non mi conviene usare la ricerca nei vettori???
![]() |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
No allora ricapitoliamo, ti serve la ricerca di un elemento in un vettore.
Scansioni tutto il vettore A cercando elemento per elemento se questo è contenuto nel vettore B. Se non c'è lo copi in C, altrimenti passi avanti. Intanto implementa questa cosa, poi penseremo a sfruttare l'informazione dell'array ordinato per ottimizzare la ricerca. |
![]() |
![]() |
![]() |
#19 |
Member
Iscritto dal: Jan 2009
Messaggi: 54
|
io non ci riesco
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:25.