Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Dal palco di Proofpoint Protect 2025 emerge la strategia per estendere la protezione dagli utenti agli agenti IA con il lancio di Satori Agents, nuove soluzioni di governance dei dati e partnership rafforzate che ridisegnano il panorama della cybersecurity
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
Recensione Borderlands 4, tra divertimento e problemi tecnici
Recensione Borderlands 4, tra divertimento e problemi tecnici
Gearbox Software rilancia la saga con Borderlands 4, ora disponibile su PS5, Xbox Series X|S e PC. Tra le novità spiccano nuove abilità di movimento, un pianeta inedito da esplorare e una campagna che lascia al giocatore piena libertà di approccio
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: 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.
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: 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;
}
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: 12843
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: 12843
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: 12843
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: 12843
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


Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Avio: contratto da 40 milioni di € da ES...
Claude Sonnet 4.5, il nuovo modello di A...
Silent Hill f è un successo: gi&a...
Nuova Jeep Compass: aperti i preordini p...
La PS5 Slim con SSD più piccolo s...
Zero combustibili fossili e controllo qu...
Corsair NAUTILUS 360 RS LCD: raffreddame...
Nuovo record nel mondo dei computer quan...
Sony e Universal combatteranno l'IA con....
Il Chips Act europeo attuale è un...
OnePlus 15: debutto globale con design '...
Amazon Prime: addio alla prova gratuita ...
Windows 11 25H2: guida passo-passo per l...
ECOVACS Deebot Mini sotto i 300€, robot ...
USA chiedono a Taiwan di produrre chip i...
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: 01:25.


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