Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-03-2011, 10:30   #1
ziomerio
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
ziomerio è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2011, 10:37   #2
tuccio`
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
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2011, 10:38   #3
ziomerio
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.
ziomerio è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2011, 11:21   #4
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12847
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.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2011, 11:39   #5
ziomerio
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
ziomerio è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2011, 11:55   #6
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12847
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;
}
In ogni caso così facendo scansioni tutti gli elementi di B, e come ti ho fatto notare prima non è necessario, sfruttando proprio l'informazione che gli array sono già ordinati, che credo vi sia stata data appositamente per cercare di ragionarci sopra .
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2011, 13:59   #7
ziomerio
Member
 
Iscritto dal: Jan 2009
Messaggi: 54
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
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;
}
In ogni caso così facendo scansioni tutti gli elementi di B, e come ti ho fatto notare prima non è necessario, sfruttando proprio l'informazione che gli array sono già ordinati, che credo vi sia stata data appositamente per cercare di ragionarci sopra .
Quindi tu cosa consigli di fare ????
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.
ziomerio è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2011, 16:10   #8
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12847
Il vettore C sarà dichiarato come:

Codice:
#include ...
#define N 6
#define M 5
...
int c[M+N];
...
A quel punto devi capire cosa devi mettere nella posizione c[k], dove k viene incrementato dopo ogni assegnazione, ovvero avrai una cosa del genere:

Codice:
k=0;
for (..)
{
    ...
    if ( condizione su a e b verificata )
    {
        c[k] = ...
        k++;
    }
}
Più di questo non posso dirti, dato che hai detto di aver compreso da solo cosa fare e comunque nei post precedenti ho scritto tutto quello che c'è da sapere .

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.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2011, 16:52   #9
clockover
Senior Member
 
L'Avatar di clockover
 
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
ti verrebbe una cosa del genere
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
questo pseudocodice dovrebbe aiutarti molto. Ovviamente se puoi proseguire per la strada vecchia che stavi seguendo, ma comunque sono equivalenti...

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
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2011, 19:41   #10
ziomerio
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.
ziomerio è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2011, 20:04   #11
clockover
Senior Member
 
L'Avatar di clockover
 
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
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2011, 20:17   #12
ziomerio
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
}
ziomerio è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2011, 20:30   #13
clockover
Senior Member
 
L'Avatar di clockover
 
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...
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2011, 20:52   #14
clockover
Senior Member
 
L'Avatar di clockover
 
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..
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2011, 09:46   #15
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12847
Quote:
Originariamente inviato da ziomerio Guarda i messaggi
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

[...]
magari ho inteso male quello che hai scritto
Hai ragione, è il contrario, adesso correggo .
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2011, 10:09   #16
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Effettivamente sono stato troppo frettoloso non avevo capito bene il problema... spero di non averlo confuso troppo!
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2011, 16:44   #17
ziomerio
Member
 
Iscritto dal: Jan 2009
Messaggi: 54
quindi non mi conviene usare la ricerca nei vettori???
ziomerio è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2011, 16:52   #18
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12847
Quote:
Originariamente inviato da ziomerio Guarda i messaggi
quindi non mi conviene usare la ricerca nei vettori???
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.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2011, 17:17   #19
ziomerio
Member
 
Iscritto dal: Jan 2009
Messaggi: 54
io non ci riesco
ziomerio è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2011, 17:58   #20
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12847
Quote:
Originariamente inviato da ziomerio Guarda i messaggi
io non ci riesco
Posta il codice che hai scritto e vediamo cosa c'è che non va.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Alcune partite NBA saranno trasmesse in ...
Intel Core 13000 e 14000 aumentano uffic...
Gemini sta per arrivare in Google Maps: ...
2 minuti per vedere le 27 offerte imperd...
Ray-Ban Meta Display: tecnologia sorpren...
Un mini PC a prezzo stracciato, non cerc...
Al via i coupon nascosti di ottobre: qua...
Ferrari Elettrica si aggiorna solo in of...
Doppio sconto sugli smartphone top Xiaom...
Samsung è sempre più prota...
ChatGPT ha pregiudizi politici? Ecco cos...
Un solo iPhone rubato ha portato alla sc...
Xiaomi 17 Ultra sta arrivando: ecco come...
Il Motorola Edge 70 non ha più se...
Alcuni Galaxy S26 utilizzeranno il chip ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:20.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v