.dsy:it.
Show 150 posts per page

.dsy:it. (http://www.dsy.it/forum/)
- Algoritmi e strutture dati (http://www.dsy.it/forum/forumdisplay.php?forumid=207)
-- Progetto "Componenti Elettroniche" (http://www.dsy.it/forum/showthread.php?threadid=40479)


Posted by carla86 on 25-05-2010 17:11:

Progetto "Componenti Elettroniche"

E' uscito il nuovo progetto di Algoritmi.

Apro un thread per chi come me pensa (deve) farlo x l'8 giugno!!


Posted by Guepe on 25-05-2010 18:39:

ci son dentro ankio in quel "deve", se voglio laurearmi a dicembre. Per ora gli ho dato una prima lettura veloce e pensavo peggio.


Posted by BeppeGoal on 25-05-2010 19:02:

Boh, vediamo un po'... teniamo questo thread come riferimento :)


Posted by carla86 on 25-05-2010 20:39:

Anke io mi "devo" laureare a dicembre....
Onestamente anche io pensavo peggio, invece tutto sommato per giugno (forse è x questo ke danno meno gg del solito) non è poi cosi catastrofico come pensavo...
Spero d nn dovermi ricredere!!!


Posted by pirlo21 on 25-05-2010 22:18:

mi aggiungo al coro dei "devo" e vi lascio già un dubbio...
ho guardato gli esempi di codice da provare e i relativi messaggi...
nel primo L (lineare) ovvero l'istruzione
l 2 7 17 24 26
il risultato del professore è:
69:
[
3 2 10 5 5, 2 (c5)
12 3 6 4 3, 7 (c1)
100 2 5 3 8, 17 (c3)
74 7 4 2 4, 24 (c6)
]

Nelle direttive del testo però dice che l'istruzione lineare può dare diverse soluzioni e infatti in questo caso le soluzioni possibili equivalenti sono:

c5 c1 c3 c6 (quella indicata dal professore)
c5 c2 c3 c6
c5 c3 c1 c6
c5 c3 c2 c6

Mi verrebbe da pensare che sia indifferente postare una o l'altra soluzione, ma più volte nella creazione dei dispositivi si dice che conta l'ordine dei componenti...quindi la soluzione giusta è solo la prima??


Posted by carla86 on 26-05-2010 08:18:

allora nel testo dice che un dispositivo è lineare se le posizioni dei componenti sono in ordine crescente, e se la posizione di una componente+la larghezza da esso occupata è minore o uguale della posizione del componente dopo.
quindi credo che sia x questo che ha scelto solo la prima xke sono tutti dispositivi ma la funzione lineare deve restituire solo il dispositivo lineare che ha la massima occupazione


Posted by BeppeGoal on 26-05-2010 09:07:

Che struttura dati ipotizzate?


Posted by Guepe on 26-05-2010 12:17:

Rileggendo mi sembra che l'idea migliore sarebbe di avere una lista normale per i componenti e un albero rosso-nero.
Secondo voi?

cmq anche il secondo dispositivo (c5 c2 c3 c6) ha la stessa estensione del primo e soddisfa la proprietà di linearità. L'unica differenza sta nel secondo componente che è un 6x2 invece del c1 del (c5 c1 c3 c6) che è un 4x3 ma l'estensione rimane sempre la stessa.
Rileggendo ho notato che c'è scritto che il dispositivo lineare da x a xk+1 non per forza deve essere unico. Quindi entrambe le soluzione proposte dovrebbero andare bene come risultato (c5 c2 c3 c6) e (c5 c1 c3 c6). Per le altre due invece, che hanno gli stessi componenti del primo disp (c5 c1 c3 c6), ci deve essere qualcosa sull'ordine dei componenti che mi sfugge...


Posted by pirlo21 on 26-05-2010 12:47:

Infatti quando viene spiegata la funzione "lineare" si dice che ci possono essere più soluzioni, però mi chiedevo se era indifferente darne una o l'altra oppure va indicata in ordine di costruzione del componente... Il professore dice che l'ordine di fissaggio è rilevante...
Le ultime due soluzioni penso sia valide altrettanto perchè vengono rispettati i vincoli ed essendo uguali i pezzi anche l'estensione resta invariata...

Per quanto riguarda la struttura anche a me è venuta subito in mente una lista...infondo non ci sono eliminazioni, bisogna fare qualche inserimento e molte ricerche... forse utilizzando un grafo si migliorerebbe il tempo di ricerca però sarebbe difficile indicizzarlo perchè bisognerebbe capire bene qual'è il parametro da indicizzare...
Se conta l'ordine di inserimento la lista facilita tutto, altrimenti con il grafo si potrebbe indicizzare per codice (velocizza gli inserimenti) o per lunghezza/estensione (velocizza la funzione lineare)...


Posted by Guepe on 26-05-2010 14:10:

Ho riletto più volte, ma a parte trovare la frase " L'ordine di fissaggio delle componenti è rilevante" più volte non riesco a capire il perchè di tutta questa rilevanza :D :D boh...
Per ora mi riguardo un po di C con cui non ho molta dimestichezza prima di incominciare a scrivere codice a caso pieno di errori :D


Posted by carla86 on 26-05-2010 14:21:

Io ho pensato a un grafo/albero per quanto riguarda le componenti, facendo inserimento in ordine di codice identificativo
Il fatto è ke ci sono 3 funzioni di ordinamento che però hanno criteri diversi:
ordina devi stampare tutti i componenti secondo il costo; mentre stampa devi stampare i componenti in ordine di codice, e stampa f idem solo ke devi controllare ke facciano parte di una sola famiglia.

però ho due dubbi:
1. nelle componenti voi memorizzate lunghezza e altezza o anche l'area visto che nella funzione lineare l'estensione del dispositivo è la somma delle aree?
2. i dispositivi li memorizzate in una struttura oppure non ce ne bisogno visto che lavoriamo in tutte e 5 le funzioni solo con le componenti?


Posted by kalbiz on 26-05-2010 15:25:

ciao mi aggiungo per appello di giugno...
la domanda è come cercare ed ordinare una lista secondo i dati satellite ?
cioè come stampare i componenti in ordine di codice, se ho una lista con chiave costo?
avevo pensato ad inserire ogni componente nelle 3 liste ordiante secondo 3 diversi criteri... costo , codice, famiglia
per la parte dei dispositivi avevo persato ad un ulteriore struttura ad albero...
che ne pensate ?

oltretutto per le componenti non ho visto la parte di cancellazione o mi sbaglio


Posted by carla86 on 26-05-2010 16:04:

Originally posted by Guepe
Per ora mi riguardo un po di C con cui non ho molta dimestichezza prima di incominciare a scrivere codice a caso pieno di errori :D


Anke io mi sto riguardando un po d C, visto ke nn ho molta dimestichezza con i puntatori e cn la storia del passaggio dei paramentri x indirizzo...

Cmq ripensando alla struttura dati, secondo me una lista non va bene xke nella definizione della funzione componente dice: "se esiste già una componente con codice di identificativo i sostituisce la nuova definizione a quella esistente."
E siccome i componenti non dice che li inserisci in codice identificativo ordinato, o tieni la lista ordinata per codice identificato e quindi ad ogni inserimento devi scorrere la lista x vedere dove mettere il nuovo componente...
Invece in un grafo/albero binario (ancora non ho ben deciso quale dei due) il controllo che esista gia un componente con quel il codice identificativo è più rapida...

Siccome non sono tanto ferrata su queste cose chiedo conferma dei miei dubbi!!!


Posted by pirlo21 on 26-05-2010 19:27:

hai ragione...questo vorrebbe dire però che se non usiamo una lista ma un grafo, le componenti debbano essere indicizzate in base al codice indentificativo... però nell'ordinamento per costo e nella funzione lineare, ci andiamo a complicare la vita...il tutto senza contare che se bisogna veramente tenere conto dell'ordine di fissaggio è ancora più complicato


Posted by elrod on 27-05-2010 08:25:

Ciao a tutti,

io sono rimasto un passo indietro... non riesco a capire nell'esempio con i due dispositivi:

D1 = ((c6,20),(c5,19),c1,4),(c4,2),c2,7)) e D2=((c2,1),(c3,8),(c1,11))

come ha fatto a calcolare l'estensione del primo dispositivo... il secondo l'ho capito... è la somma delle aree ma il primo no....

grazie ;)


Posted by carla86 on 27-05-2010 12:33:

Originally posted by pirlo21
hai ragione...questo vorrebbe dire però che se non usiamo una lista ma un grafo, le componenti debbano essere indicizzate in base al codice indentificativo... però nell'ordinamento per costo e nella funzione lineare, ci andiamo a complicare la vita...il tutto senza contare che se bisogna veramente tenere conto dell'ordine di fissaggio è ancora più complicato



appunto xke ci sono più criteri di ricerca che secondo me dobbiamo usare la struttura dati su cui la ricerca costa meno.
poi conta che su due funzioni componente (in cui cmq devi cercare se gia esiste) e in stampa, devi ordinare le componenti in ordine di codice, in una di costo e in stampa in base alla famiglia è sempre in ordine di codice..
quindi io credo ke opterò x indicizzare su codice identificativo.


Posted by carla86 on 27-05-2010 12:46:

Originally posted by elrod
Ciao a tutti,

io sono rimasto un passo indietro... non riesco a capire nell'esempio con i due dispositivi:

D1 = ((c6,20),(c5,19),c1,4),(c4,2),c2,7)) e D2=((c2,1),(c3,8),(c1,11))

come ha fatto a calcolare l'estensione del primo dispositivo... il secondo l'ho capito... è la somma delle aree ma il primo no....

grazie ;)



l'estensione del primo dispositivo la devi calcolare calcolando le aree dei componenti, ma facendo attenzione ha sommare una volta sola le aree sovrapposte.
Io ti dico come l'ho calcolata io:
-parto da il componente che hai in posizione 19 che è il componente c5 che ha area 5x5; il componente in posizione 20, ossia c c6 è completamente sovrapposto dal componente c5 di cui hai gia calcolato l'area quindi c6 nn lo consideri senno riconsidereresti due volte la stessa area.
- hai in posizione 2 il componente di area 10x1, ma in realtà ha solo 2 unità della sua area non sovrapposte da nessun altro componente
-poi ce il componente in posizione 4 ossia il componente c1 che ha area 4x3
-e poi ce il componente in posizione 7, ossia il componente c2 che però è in parte sovrapposto dal componente c1 di cui hai gia calcolato l'area quindi da questo devi togliere la parte sovrapposta.
calcolato cosi ti viene esattamente 49 come da lui calcolato.


Posted by elrod on 27-05-2010 13:12:

Originally posted by carla86
l'estensione del primo dispositivo la devi calcolare calcolando le aree dei componenti, ma facendo attenzione ha sommare una volta sola le aree sovrapposte.
Io ti dico come l'ho calcolata io:
-parto da il componente che hai in posizione 19 che è il componente c5 che ha area 5x5; il componente in posizione 20, ossia c c6 è completamente sovrapposto dal componente c5 di cui hai gia calcolato l'area quindi c6 nn lo consideri senno riconsidereresti due volte la stessa area.
- hai in posizione 2 il componente di area 10x1, ma in realtà ha solo 2 unità della sua area non sovrapposte da nessun altro componente
-poi ce il componente in posizione 4 ossia il componente c1 che ha area 4x3
-e poi ce il componente in posizione 7, ossia il componente c2 che però è in parte sovrapposto dal componente c1 di cui hai gia calcolato l'area quindi da questo devi togliere la parte sovrapposta.
calcolato cosi ti viene esattamente 49 come da lui calcolato.


Grazie mille... non riuscivo a capire da dove saltava fuori il 49...


Posted by kalbiz on 27-05-2010 18:32:

Originally posted by carla86
appunto xke ci sono più criteri di ricerca che secondo me dobbiamo usare la struttura dati su cui la ricerca costa meno.
poi conta che su due funzioni componente (in cui cmq devi cercare se gia esiste) e in stampa, devi ordinare le componenti in ordine di codice, in una di costo e in stampa in base alla famiglia è sempre in ordine di codice..
quindi io credo ke opterò x indicizzare su codice identificativo.


mi sembra corretto, utilizziamo una struttura dati ad albero.
probabilmente mi sfugge però qualcosa a prescindere dalla struttura utilizzata, quando faccio una ricerca, la faccio per chiave ...
se memorizzo nel mio albero binario di ricerca come chiave il codice, come sembrerebbe ovvio, come faccio poi a ricercare per famiglia ? o ordinare in base al costo ?


Posted by BeppeGoal on 27-05-2010 20:11:

Ma scusate, non riesco a capire come vengono definiti i ganci, come faccio a sapere che un componente parte dalla posizione 20 piuttosto che da un'altra? Nell'esempio del prof il gancio non viene mai dato come input


Posted by carla86 on 27-05-2010 20:37:

Originally posted by kalbiz
mi sembra corretto, utilizziamo una struttura dati ad albero.
probabilmente mi sfugge però qualcosa a prescindere dalla struttura utilizzata, quando faccio una ricerca, la faccio per chiave ...
se memorizzo nel mio albero binario di ricerca come chiave il codice, come sembrerebbe ovvio, come faccio poi a ricercare per famiglia ? o ordinare in base al costo ?


mi verebbe da dire ke li possiamo ordinare come primo criterio x codice, come secondo criterio x costo e come terzo x famiglia (o qst ultimi due viceversa..)
xo' nn so se è fattibile...

ora dico una cavolata, nn mangiatemi ma io la lancio li... tenere tre alberi ordinati in modo diverso è una cavolata vero? è più intelligente ordinarli secondo criteri progressivi?


Posted by carla86 on 27-05-2010 20:39:

Originally posted by BeppeGoal
Ma scusate, non riesco a capire come vengono definiti i ganci, come faccio a sapere che un componente parte dalla posizione 20 piuttosto che da un'altra? Nell'esempio del prof il gancio non viene mai dato come input


anke io nn riesco a capire questa cosa, siccome l'unica volta ke da delle posizioni è quando chiama la funzione lineare, mi viene da pensare ke ci sia un qualche criterio x cui dobbiamo controllare quando chiama la funzione lineare anke che i vari pezzi ci stiano nelle varie posizioni...
xo' ho deciso ke quando avrò fatto tutto il resto e mi mancherà questa cosa o cmq quando sarò a buon punto con il resto chiederò al prof questa cosa...


Posted by BeppeGoal on 27-05-2010 20:52:

Io gli scrivo subito, o al massimo domani mattina.
Se mi risponde posto quel che mi dice, se qualcun altro ha info su questo punto, faccia lo stesso. :approved:


Posted by BeppeGoal on 28-05-2010 09:54:

Il Professore mi ha risposto di riguardare le specifiche relative ai comandi "lineare", "estensione" e "prospetto".
Estensione e prospetto sono nella parte di progetto del secondo appello.

Ci sto ragionando ma per ora mi sfugge.


Posted by kalbiz on 29-05-2010 08:21:

anche per me è abbastanza nebulosa ...
come faccio a definire un Dispositivo ??
D =(<c1,x1><c2,x2>...<cn,xn> )

le coordinate non vengono mai inserite ??


Posted by BeppeGoal on 31-05-2010 07:40:

Qualcuno ha capito qualcosa in merito alla definizione / posizionamento dei ganci?
:?


Posted by fa88bio on 31-05-2010 14:35:

ciao a tutti...a quanto ho capito io la funzione lineare fissa la posizione dei componenti al momento della chiamata alla funzione stessa:::
l(2 7 17 24 26) significa che:
si ha a dispozizione 26-2=24 come lunghezza max del dispositivo;
il primo componente deve avere lunghezza <= di 7-2=5 unità;
il secondo <= 17-7=10 unità;
il terzo <=24-17=7 unità;
il quarto <=26-24 unità..
per questo motivo i dispositivi possono essere piu di uno e di questi si vuole stampare solo quello avente area totale maggiore....
Il problema appunto è ke se come primo componente ad esempio, nella struttura dati ce ne sono 4 che nn superano la lughezza, come secondo ce ne sono 6,ecc.....bisogna provare un numero abbastanza grosso di combinazioni per ottenere i dispositivi
il problema quindi è che quello di implementare un algoritmo che provi tutte le possibili combinazioni sui componenti


Posted by TheKaneB on 31-05-2010 15:37:

oops.. post sbagliato...

__________________
Software Failure: Guru Meditation


Posted by kalbiz on 31-05-2010 17:44:

mi blocca per ora un problema ancora più semplice ...
come gestire lo stream di dati in input ??

ho provato con il codice qua sotto ma ... va a seconda dei casi ... cioè ogni tanto funziona ogni tanto noooooooooooooo


array = (int *)malloc(sizeof(int) * 6 ); /* minimo componente */

prevSize = 6;

num = 0;

do { /* Continua finché vengono inseriti numeri */
scanf("%d",&x);

if(num >= prevSize) { /* ri-allochiamo */

prevSize += 2;

array = (int *)realloc(t, sizeof(int) * prevSize );

}


t[num++] = x;

}while((ch=getchar())!='\n');


avete idea del perchè ?? vedete errori ??


Posted by Guepe on 31-05-2010 19:21:

Per la disposizione lineare dopo un po di prove penso di aver capito il perchè scelga proprio quella anche se ne esistono altre con dimensione massima uguale ma ordine diverso di componenti.
Per l(2 7 17 24 26) sceglie il dispositivo formato dalle componenti che hanno maggior estensione e che soddisfano il criterio di linearità.
Ci sono 8 (se non mi sbaglio) possibili dispositivi lineari formati da:
c1 (L=4 E=12) posizioni possibili: 1°,2°,3°
c2 (L=6 E=12) posizioni possibili: 2°,3°
c3 (L=3 E=24) posizioni possibili: 1°,2°,3°
c5 (L=5 E=25) posizioni possibili: 1°,2°,3°
c6 (L=2 E=8) posizioni possibili: 4°
Dovendo avere estensione massima il dispositivo dovrà contenere per forza c5,c3 e uno tra c1 e c2 che hanno estensione uguale, ed ovviamente c6 che è l'unico a soddisfare il criterio linearità per l'ultima posizione.
Da una prima analisi, visto che nell'esempio diceva che le soluzioni possibili erano soltanto (c5,c1,c3,c6) e (c5,c2,c3,c6) ho pensato che scegliesse l'ordine dei componenti in base anche alla lunghezza di essi, infatti alla prima posizione sceglie c5, alla seconda sia c1 che c2 e alla terza c3 ma poi come soluzione finale nell'output sceglie (c5,c1,c3,c6) e quindi sto criterio va a farsi benedire....
bah pensavo di aver trovato una soluzione ma invece mi ritrovo punto a capo, quindi mi continuo a domandare perché proprio (c5,c1,c3,c6) è quella giusta quando

(c5,c2,c3,c6)
(c1,c3,c5,c6)
(c1,c5,c3,c6)
(c3,c2,c5,c6)
(c3,c5,c2,c6)
(c5,c3,c2,c6)
(c3,c1,c5,c6)

hanno estensione uguale e rispettano il criterio di linearità????


Posted by lux87 on 31-05-2010 21:24:

ragazzi volevo un aiuto: un consiglio su come fare ad inserire nel main i comandi "o" ed "l" (seconda e quarta riga della tabella).
grazie


Posted by carla86 on 31-05-2010 21:58:

Una domanda ke vi può sembrare idiota, ma in qst momento sono alla frutta...

Nella funzione ordina e nella funzione lineare il numero dei parametri non è specificato, potrebbero essere 2, come 3, come 4; giusto?
allora come fate nel leggere l'input?
nel case 'o' e nel case 'l' cosa fate, prima un ciclo ke vi conti quanti parametri avete e poi un ciclo ke ve li memorizza in un array? oppure mi sfugge qualche funzione o modo più immediato x sapere il numero dei parametri?

grazie mille


Posted by carla86 on 31-05-2010 22:02:

Originally posted by Guepe
Per la disposizione lineare dopo un po di prove penso di aver capito il perchè scelga proprio quella anche se ne esistono altre con dimensione massima uguale ma ordine diverso di componenti.
Per l(2 7 17 24 26) sceglie il dispositivo formato dalle componenti che hanno maggior estensione e che soddisfano il criterio di linearità.
Ci sono 8 (se non mi sbaglio) possibili dispositivi lineari formati da:
c1 (L=4 E=12) posizioni possibili: 1°,2°,3°
c2 (L=6 E=12) posizioni possibili: 2°,3°
c3 (L=3 E=24) posizioni possibili: 1°,2°,3°
c5 (L=5 E=25) posizioni possibili: 1°,2°,3°
c6 (L=2 E=8) posizioni possibili: 4°
Dovendo avere estensione massima il dispositivo dovrà contenere per forza c5,c3 e uno tra c1 e c2 che hanno estensione uguale, ed ovviamente c6 che è l'unico a soddisfare il criterio linearità per l'ultima posizione.
Da una prima analisi, visto che nell'esempio diceva che le soluzioni possibili erano soltanto (c5,c1,c3,c6) e (c5,c2,c3,c6) ho pensato che scegliesse l'ordine dei componenti in base anche alla lunghezza di essi, infatti alla prima posizione sceglie c5, alla seconda sia c1 che c2 e alla terza c3 ma poi come soluzione finale nell'output sceglie (c5,c1,c3,c6) e quindi sto criterio va a farsi benedire....
bah pensavo di aver trovato una soluzione ma invece mi ritrovo punto a capo, quindi mi continuo a domandare perché proprio (c5,c1,c3,c6) è quella giusta quando

(c5,c2,c3,c6)
(c1,c3,c5,c6)
(c1,c5,c3,c6)
(c3,c2,c5,c6)
(c3,c5,c2,c6)
(c5,c3,c2,c6)
(c3,c1,c5,c6)

hanno estensione uguale e rispettano il criterio di linearità????


anke qui magari è una risposta stupida xo' ho fatto questo ragionamento:
siamo tutti daccordo ke x avere l'estensione massima deve per forza avere c5 e c3. poi l'unica che ci sta in posizione 4 è c6.
ora poteva scegliere tra c1 e c2 ma siccome sono tutte e due con estensione uguale ha scelto quella che è stata inserita x prima (in ordine lessicografico) e quindi c1?!
come ragionamento potrebbe essere o è una cavolata?

Alla fine voi come struttura x cosa avete optato? Io ho optato per un'albero red-black.


Posted by pirlo21 on 31-05-2010 23:13:

Riguardo alla funzione lineare avevo posto lo stesso dubbio qualche giorno fa...bisogna capire il criterio di scelta tra le varie soluzioni...

Per la struttura dati anch'io ho usato un albero, però ora che sono alle prese con la funzione lineare non ne sono più molto convinto...
Infondo sto albero va bene solo per l'inserimento perchè per la funzione ordina e la funzione lineare è un casino...panico


Posted by Guepe on 31-05-2010 23:28:

Originally posted by carla86
anke qui magari è una risposta stupida xo' ho fatto questo ragionamento:
siamo tutti daccordo ke x avere l'estensione massima deve per forza avere c5 e c3. poi l'unica che ci sta in posizione 4 è c6.
ora poteva scegliere tra c1 e c2 ma siccome sono tutte e due con estensione uguale ha scelto quella che è stata inserita x prima (in ordine lessicografico) e quindi c1?!
come ragionamento potrebbe essere o è una cavolata?

Alla fine voi come struttura x cosa avete optato? Io ho optato per un'albero red-black.


allora dovrebbe essere (c1,c3,c5,c6) la sequenza corretta se si guardasse l'ordine di inserimento, o anzi (c5,c3,c1,c6) seguendo prima l'ordine per estensione e in caso di ugualianza in base all'inserimento....


Posted by carla86 on 31-05-2010 23:33:

scusa ma x la funzione ordina: conta ke lui ti da un tot d codici identificativi e se quei codici identificativi li trovi allora devi stamparglieli ordinati per costo..
forse x questo caso è meglio crearsi una lista d supporto dove ordinare i nodi ke hanno corrispondente codice identificativo e ke hai estratto dall'albero.

mi sai dire come fare a leggere un numero variabile di interi; ossia mi spiego meglio, nella funzione ordina (e neanche in quella lineare) non ti dice a priori quanti elementi ti darà...
come fai?
ad esempio nel comando
o 5 27 89 65
ti da 4 codici identificativi (ma potrebbe dartene 5 oppure 2 oppure 8) come fai?
se leggo un numero alla volta, faccio partire la funzione d ricerca nell'albero, se lo trova lo voglio mettere in un array di supporto cosi ke una volta trovati tutti li ordino x costo.
ma nn sapendo quanti sono posso ogni volta riallocare l'array di una posizione in più con la calloc?
voi come fate?


Posted by carla86 on 31-05-2010 23:36:

Originally posted by Guepe
allora dovrebbe essere (c1,c3,c5,c6) la sequenza corretta se si guardasse l'ordine di inserimento, o anzi (c5,c3,c1,c6) seguendo prima l'ordine per estensione e in caso di ugualianza in base all'inserimento....


no no io continuavo il tuo ragionamento.
secondo me è giusto come hai ragionato tu e l'ultima scelta che ha fatto il prof ossia se scegliere tra c1 e c2 ha scelto il primo in ordine lessicografico perchè l'estensione era uguale.


Posted by carla86 on 31-05-2010 23:40:

no hai ragione rileggendo e ripensandoci non si riesce proprio a capire questo criterio...
mi sa che domani farò un salto in comelico e se il prof è li chiedo se posso salire un attimo a farmi spiegare sta cosa, perchè proprio non si capisce.. mah


Posted by Guepe on 31-05-2010 23:54:

Originally posted by carla86
no no io continuavo il tuo ragionamento.
secondo me è giusto come hai ragionato tu e l'ultima scelta che ha fatto il prof ossia se scegliere tra c1 e c2 ha scelto il primo in ordine lessicografico perchè l'estensione era uguale.


ahhhh capito, fino alla scelta dei due dispositivi ci siamo, cioe son quei due perché con 4 componenti di cui due della stessa estensione per forza ci son due soluzioni se si segue il criterio della lunghezza, e poi la scelta finale la si effettua in base all'ordine di inserimento.
Tra l'altro tutto questo ragionamento è puro frutto di idee, sul testo non c'è scritto nulla, quindi rimane sempre un idea che oltretutto bisogna far implementare al codice.
Almeno un idea di partenza però c'è; adesso dovrei scegliere la struttura dati giusta e poi posso incominciare a scrivere codice...non lo finirò mai in tempo....cmq il progetto assomiglia molto a "ingranaggi 2" nel quale venivano usate liste e alberi red-black


Posted by carla86 on 01-06-2010 00:08:

dobbiamo mettercela tutta x finirlo entro l'8 giugno!!!
cmq io x le strutture dati ho scelto un albero red-black per inserire tutte le componenti.
per quanto riguarda ordina e lineare ho qualche problema d input e poi effettivamente invece che copiarle in array potrei metterli in una lista per ordinarli e stamparli..
in che ordine d tempo si ordina su una lista d pochi elementi?
xke x la ricerca sono sicura ke la cosa migliore sia l'albero red-black (letto anke sulle slide di aguzzoli) ma x ordinare pochi elementi ke tiriamo fuori dall'albero possono essere valide?
effettivamente anke x lavorare sui dispositivi mi sa ke abbiamo bisogno di memorizzare i nodi che tiriamo fuori, anche se non so con che criterio tirarli fuori...


Posted by kalbiz on 01-06-2010 08:42:

Originally posted by lux87
ragazzi volevo un aiuto: un consiglio su come fare ad inserire nel main i comandi "o" ed "l" (seconda e quarta riga della tabella).
grazie


se può esseti di aiuto ...
ma non sono riuscito a capire perchè inserisce doppio l'ultimo numero ...
comunque
ho un array di componenti che viene aumentato con realloc a secoda del bisogno, inizialmente la struttura può contenere 6 int.
fa la scansione del valore inserito fino a che non viene premuto \n


array = (int *)malloc(sizeof(int) * 6 ); /* minimo componente */
prevSize = 6;
num = 0;
do { /* Continua finché vengono inseriti numeri */
scanf("%d",&x);
if(num >= prevSize) { /* ri-allochiamo */
prevSize += 2;
array = (int *)realloc(t, sizeof(int) * prevSize );
}
t[num++] = x;
}while((ch=getchar())!='\n');



se riesco a sistemarla oggi/domani posto la corretta ...


Posted by kalbiz on 01-06-2010 08:50:

io sto usando un albero RB per le componenti,
per la funzione ordina ho pensato di ricercare nell'albero se esiste un componente con il codice che mi viene passato,
se viene individuato, viene inserito in una lista di appoggio tenuta ordinata per costo ...

per l'inserimento di più codici utile per
ordina e lineare ,
ho usato la funzione postata sopra, legge un tot di int e rialloca lo spazio se ne serve ....


Posted by misterx on 01-06-2010 17:27:

edit


Posted by misterx on 02-06-2010 13:17:

sto guardandi gli alberi RB e non ho esperienza di questi quindi chiedo consigli.

avendo implementato l'albero ed avendolo popolato, non mi è chiaro ora cosa passare come parametri alle seguenti funzioni per la visita dei nodi in ordine

grazie

void inord(rbnode *p, rbnode *nil, void (*op)(rbnode *))
{
if(p != nil) {
inord(p->left,nil,op);
(*op)(p);
inord(p->right,nil,op);
}
}

/ **************************************************
**************************/
/*procedura che serve alla visita ordinata del grafo rb, chiama specificando il nodo di partenza*/
void inorder(rbtree *p, void (*op)(rbnode *))
{
inord(p->root, p->nil, op);
}


Posted by carla86 on 02-06-2010 13:47:

Originally posted by misterx
sto guardandi gli alberi RB e non ho esperienza di questi quindi chiedo consigli.

avendo implementato l'albero ed avendolo popolato, non mi è chiaro ora cosa passare come parametri alle seguenti funzioni per la visita dei nodi in ordine

grazie

void inord(rbnode *p, rbnode *nil, void (*op)(rbnode *))
{
if(p != nil) {
inord(p->left,nil,op);
(*op)(p);
inord(p->right,nil,op);
}
}

/ **************************************************
**************************/
/*procedura che serve alla visita ordinata del grafo rb, chiama specificando il nodo di partenza*/
void inorder(rbtree *p, void (*op)(rbnode *))
{
inord(p->root, p->nil, op);
}


come l'hai popolato? o meglio, con la funzione di inserimento hai fatto in modo che fossero ordinati dalla radice o dalla foglia?


Posted by loreste on 02-06-2010 15:06:

Dunque, sto aiutando un amico a fare questo progetto....
Abbiamo utilizzato un albero di ricerca ordinato per Id, in questo modo quando stampiamo tutti i componenti sono già ordinati con la ricerca simmetrica, se stampo per famiglia eseguo sempre la ricerca simmetrica, se fa parte della famiglia allora stampo.
Manca solo il punto della linearità, l'esempio del docente (esempio 1) è chiaro in quanto da per scontato su quali ganci sono appesi i componenti, ma nel progetto non è chiaro su quali ganci collocare i componenti, esempio
l(2 7 17 24 26)
quale/i componente si trova sul gancio 2??????
qualche idea?

__________________
La Fede non retrocede mai!
Döma Atalanta!!!!!!!!


Posted by carla86 on 02-06-2010 15:15:

Originally posted by loreste
Dunque, sto aiutando un amico a fare questo progetto....
Abbiamo utilizzato un albero di ricerca ordinato per Id, in questo modo quando stampiamo tutti i componenti sono già ordinati con la ricerca simmetrica, se stampo per famiglia eseguo sempre la ricerca simmetrica, se fa parte della famiglia allora stampo.
Manca solo il punto della linearità, l'esempio del docente (esempio 1) è chiaro in quanto da per scontato su quali ganci sono appesi i componenti, ma nel progetto non è chiaro su quali ganci collocare i componenti, esempio
l(2 7 17 24 26)
quale/i componente si trova sul gancio 2??????
qualche idea?


ciao! quindi voi state utilizzando un albero di ricerca normale, non un albero red-black giusto?
ma cm prestazioni in ordine di tempo non sono migliori gli alberi red-black?
anke io avevo optato x dei semplici alberi di ricerca, ma poi guardando le slide d aguzzoli mi è sembrato meglio gli alberi rosso neri..
cmq x quanto riguarda la linearità purtroppo siamo tutti nella stessa barca xke non è ben spiegato come sono relazionate le posizioni che da nel comando con i componenti..
infatti io domani mattina vado a ricevimento (gliel'ho chiesto via mail) proprio x capire bene sta situazione del lineare...
anke xke tra l'altro non ti da neanche quante posizioni sono, x cui come leggi tutte le posizioni per poi inserirle in qualche struttura?


Posted by carla86 on 02-06-2010 15:24:

e x la funzione ordina invece come fai? usi una lista d supporto?
xke devi cercare i componenti d cui nella funzione ordina ti da i codici identificativi e poi li devi stampare in ordine ma in base al costo..


Posted by loreste on 02-06-2010 16:39:

l'albero rb sono più performanti nella ricerca, sai che nel caso peggiore ci metti 2 Log n, mentre nell'albero di ricerca i caso peggiore è n, detto questo è indifferente.
Per quanto riguarda l'ordina, creo un secondo albero temporaneo con i soli elementi di mio interesse (cosi non spreco ram).

__________________
La Fede non retrocede mai!
Döma Atalanta!!!!!!!!


Posted by carla86 on 02-06-2010 21:46:

ragazzi magari è l'ora ma ho un problema con la funzione ordina.
nel senso che non so quanti codici identificativi mi inserisce,
nella dichiarazione di funzione come fate cn i parametri? cosa mettete?

tanto che ci sono un'altra domandina:
x quanto riguarda le stampe voi avete fatto le due funzioni di visita in ordine a parte come c'è implementato in algoteam oppure visto la funzione inorder che semplicemente richiama la funzione ricorsiva inorder la chiamate direttamente da dentro la funzione stampa?!!?

grazie mille!!! Ripeto probabilmente sono cavolate, è ke l'ora d certo nn aiuta a ragionare..


Posted by BeppeGoal on 03-06-2010 10:41:

Originally posted by carla86

...
infatti io domani mattina vado a ricevimento (gliel'ho chiesto via mail) proprio x capire bene sta situazione del lineare...
anke xke tra l'altro non ti da neanche quante posizioni sono, x cui come leggi tutte le posizioni per poi inserirle in qualche struttura?


Per favore poi puoi postare quel che ti dice il prof? Quel punto è ostico un po' per tutti.
Grazie mille!


Posted by carla86 on 03-06-2010 11:17:

sono da poco tornata a casa dall'uni.
il ricevimento del prof è durato 10 minuti.

praticamente ci siamo fatti più problemi che altro, siamo stati a cercare qualcosa d inesistente.
nella funzione lineare al prof aguzzoli basta che gli venga stampato un dispositivo lineare con estensione massima e ke rispetti quelle posizioni.
non fatevi ingannare dal file di output d'esempio, xke quello appunto è solo un esempio e nn ce nessun criterio x il quale abbia scelto quel dispositivo al posto dell'altro.
e anke le altre combinazioni di componenti ke sono cmq dispositivi lineari e rispettano le posizioni andavano bene.
praticamente loro ne hanno preso uno a caso tra tutti quelli lineari e noi dobbiamo fare lo stesso, ossia stampare un dispositivo lineare con estensione massima e ke ovviamente rispetti le posizioni date dagli argomenti della funzione.

invece chiedo a voi: come avete fatto per la funzione ordina ke ha numero di parametri arbitrari e nn si sa a priori?
grazie


Posted by BeppeGoal on 03-06-2010 11:29:

Grazie per il post.
Ma non riesco a capire, l(2 7 17 24 26) i numeri sono i ganci, giusto?
Come faccio a sapere che a quelle posizioni siano presenti componenti? E quali componenti se in fase di creazione non viene specificata la posizione?
Probabilmente, come dici tu, è più semplice di quel che si pensi, però non riesco ad afferrare!!


Posted by carla86 on 03-06-2010 12:03:

allora, come anke mi ha detto il prof oggi, si hanno solo dei componenti, infatti nessuna funzione prima d lineare ti chiede d gestire o fare qualcosa con i dispositivi.

quando viene chiamata la funzione lineare hai una struttura dati con dei componenti e una serie d posizioni.
sei tu ke devi fare gli accoppiamenti componente, posizione in modo ke la lista d quest'ultimi formi un dispositivo lineare con xo' estensione massima.

ripeto invece la mia domanda come fate quando avete funzioni tipo ordina o tipo lineare in cui nn sapete quanti elementi avete?


Posted by Guepe on 03-06-2010 12:05:

non so a che punto siete voi, forse sono io ignorante, mettendo come presupposto che la chiave di ogni nodo è l'identificativo del componente, quando bisogna fare la ricerca in base alla famiglia del componente come fate? e sopratutto nella ricerca dei componenti lineari l'id nn serve proprio a nulla....
sono nel panico, datemi delucidazioni...


Posted by loreste on 03-06-2010 12:32:

Per carla86
io ho implementato un albero di ricerca ordinato per ID, ho una funzione, che dato un ID mi restituisce il nodo, clono il nodo e creo un altro albero con tutti i nodi che mi interessano ordinandoli per costo, stampo i dati e distruggo il secondo albero

__________________
La Fede non retrocede mai!
Döma Atalanta!!!!!!!!


Posted by carla86 on 03-06-2010 12:53:

Originally posted by loreste
Per carla86
io ho implementato un albero di ricerca ordinato per ID, ho una funzione, che dato un ID mi restituisce il nodo, clono il nodo e creo un altro albero con tutti i nodi che mi interessano ordinandoli per costo, stampo i dati e distruggo il secondo albero


grazie!! anke io pensavo d fare una cosa simile ma il mio problema è cosa fare nella funzione proprio nella funzione ordina?
nello switch del main leggi i codici identificativi, li passi alla funzione d ricerca e trovi il nodo ke inserisci in un'altra struttura temporanea.
ma tutto questo lo fai nel main? allora nella funzione ordina fai solo la stampa oppure fai altro?

ecco il mio problema non è tanto l'idea x come farlo ma dove fare le cose..


Posted by carla86 on 03-06-2010 12:55:

per esempio nella funzione componente sai quanti numeri devi leggere e quindi poi riesci a passare i dati alla funzione; ma nelle funzioni in cui nn sai quanti interi devi leggere come fate?
ah dimenticavo lo stesso problema si pone in lineare xke non so quante posizioni mi mette a priori...


Posted by loreste on 03-06-2010 13:10:

Non ho una funzione ordina, ho una funzione che gli passi un albero (la radice) e lui stampa i nodi già ordinati....
quindi nel main ho

if carattero letto = s
inorder(albero1);

if carattero letto = o
costruisci il secondo albero;
inorder(albero2);

__________________
La Fede non retrocede mai!
Döma Atalanta!!!!!!!!


Posted by carla86 on 03-06-2010 15:50:

scusami se sono pignola...
io con la funzione ordina mi riferivo all'operazione che è stata chiesta nel testo. cmq credo d aver capito.
grazie


Posted by kalbiz on 03-06-2010 17:51:

incontro un altro problema di input...come avete distinto tra il comando

s --> stampa()

s f --> stampa tutti quelli della famiglia

intendo proprio nella parte

case 's': /* stampa */


Posted by BeppeGoal on 03-06-2010 21:38:

Scusa Carla,
cosa intendi per estensione massima?
Che tra tutti i componenti che formano dispositivi lineari, si sceglie il dispositivo con l'estensione massima?


Posted by misterx on 03-06-2010 21:39:

cosa ci si inventa per la funzione lineare ?

ciao


Posted by carla86 on 03-06-2010 22:29:

Originally posted by BeppeGoal
Scusa Carla,
cosa intendi per estensione massima?
Che tra tutti i componenti che formano dispositivi lineari, si sceglie il dispositivo con l'estensione massima?


si esatto. per estensione massima si intende ke tra tutti i dispositivi lineari devi stampargli quello con estensione massima.
occhio che nn ce ne uno solo di dispositivo con estensione massima, ma ce ne più d uno ma al prof ne interessa uno qualsiasi d questi.


Posted by mark on 03-06-2010 22:56:

io non ho ancora capito cosa si intende con:

Esempio 2 Siano c1, c2 ......., c6 le componenti definite nell'Esempio 1. L'operazione: lineare (2; 7; 17; 24; 26)

può produrre uno dei due dispositivi seguenti, entrambi di estensione 25 + 12 + 24 + 8 = 69
(c5; 2; c1; 7; c3; 17; c6; 24) oppure (c5; 2; c2; 7; c3; 17; c6; 24):

__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....


Posted by mark on 04-06-2010 07:21:

Originally posted by fa88bio
ciao a tutti...a quanto ho capito io la funzione lineare fissa la posizione dei componenti al momento della chiamata alla funzione stessa:::
l(2 7 17 24 26) significa che:
si ha a dispozizione 26-2=24 come lunghezza max del dispositivo;
il primo componente deve avere lunghezza <= di 7-2=5 unità;
il secondo <= 17-7=10 unità;
il terzo <=24-17=7 unità;
il quarto <=26-24 unità..
per questo motivo i dispositivi possono essere piu di uno e di questi si vuole stampare solo quello avente area totale maggiore....
Il problema appunto è ke se come primo componente ad esempio, nella struttura dati ce ne sono 4 che nn superano la lughezza, come secondo ce ne sono 6,ecc.....bisogna provare un numero abbastanza grosso di combinazioni per ottenere i dispositivi
il problema quindi è che quello di implementare un algoritmo che provi tutte le possibili combinazioni sui componenti


ciao,
scusa vuoi dire che 2 7 17 24 26 sono le posizioni dei componenti sulla griglia/nastro?
Vuol dire che il primo componente parte da posizione 2 e può occupare sino a posizione 7 e cioè 5 posizioni e se un componente è lungo diciamo 6 lo sis carta ?

ciao

__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....


Posted by kalbiz on 04-06-2010 08:58:

se le prime coordinate che ti passa sono 2 e 7
il componente deve avere lunghezza massimo 5
tra quelli di lunghezza massimo 5 cerchi quello con area maggiore ...
"
non è chiaro però come possa esistere un dispositivo lineare non adeguato "

se ho anche solo un componente che si adatta ad uno dei ganci perchè non dovrebbe costruire un dispositivo ??
cioè
c 1 2 3 2 5
c 2 3 4 3 5

l 2 4 5

dovrebbe restituire
c 1 2 3 2 5

sembra invece dagli esempi che debba restituire
Non esiste componente adeguato

idee??


Posted by mark on 04-06-2010 09:03:

perfetto grazie

__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....


Posted by carla86 on 04-06-2010 10:36:

mi sapete dire xke nelle visite simmetriche implementate dal prof, sia x quella dell'albero di ricerca sia per quelli dell'albero red-black, tra i parametri ce un puntatore a funzione ke poi nn viene usato da nessun'altra parte??

void inorder(searchtree *p, void (*op)(searchtree *))
{
if(p) {
inorder(p->left,op);
(*op)(p);
inorder(p->right,op);
}
}

e poi xke nella visita inorder per gli alberi red-black ci sono addirittura due funzioni? nn basta in order, passandogli al posto d un nodo qualsiasi, la radice dell'albero?

void inord(rbnode *p, rbnode *nil, void (*op)(rbnode *))
{
if(p != nil) {
inord(p->left,nil,op);
(*op)(p);
inord(p->right,nil,op);
}
}

void inorder(rbtree *p, void (*op)(rbnode *))
{
inord(p->root, p->nil, op);
}


Posted by misterx on 05-06-2010 08:56:

io ho toccato il meno possibile evitando di eliminare quello che non è strattamente chiaro, al massimo viene passato un parametro che non viene usato in questa implementazione


Posted by Spr1gg4N on 05-06-2010 09:22:

ragazzi ma voi come avete risolto per l'input del comando "o" (ordina)?
non riesco proprio a creare un array di int che aumenti dimensione man mano che viene inserito un nuovo numero in input -.-'


Posted by Spr1gg4N on 05-06-2010 16:58:

altra domanda: ma quando un albero (creato magari per un'operazione momentanea) non mi serve più, come faccio esplicitamente a deallocarlo?


Posted by Spr1gg4N on 05-06-2010 17:46:

Per quanto riguarda la funzione lineare ho un paio di domande:
1) se non esiste una componente che stia nello spazio tra due ganci che si fa? Si lascia vuoto quello spazio oppure si stampa il messaggio di errore?

2) nell'esempio 2, come secondo componente mette c1 oppure c2 che hanno entrambi estensione 12....come mai non sceglie c3 che è più corto dei precedenti ma ha estensione maggiore (24)?

EDIT:
-------------
quindi come soluzione possibile dell'esempio 2 io metterei anche:
69: (<c5,2>,<c3,7>,<c1,17>,<c6,24> ) oppure
69: (<c5,2>,<c3,7>,<c2,17>,<c6,8> )

voi che dite?


Posted by mark on 05-06-2010 17:59:

Originally posted by Spr1gg4N
altra domanda: ma quando un albero (creato magari per un'operazione momentanea) non mi serve più, come faccio esplicitamente a deallocarlo?


bella domanda: io inizializzo banalmente il puntatore alla radice a NULL, purtroppo è una sporca che non dealloca la memoria

__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....


Posted by Spr1gg4N on 05-06-2010 18:14:

Originally posted by mark
bella domanda: io inizializzo banalmente il puntatore alla radice a NULL, purtroppo è una sporca che non dealloca la memoria


mmm si potrebbe una soluzione...però prima cmq bisogna eliminare tutti i nodi altrimenti la memoria è cmq occupata.


Posted by mark on 05-06-2010 19:22:

Originally posted by Spr1gg4N
mmm si potrebbe una soluzione...però prima cmq bisogna eliminare tutti i nodi altrimenti la memoria è cmq occupata.


sporca numero 2

usare la funzione inorder() per visitare tutto l'albero e usare nodedelete() o similare per eliminare tutti i nodi

infine eliminare la radice con NULL

__________________
Non ti perdere di coraggio se ti tocca lavorare molto e raccogliere poco.....


Posted by Spr1gg4N on 06-06-2010 09:45:

esatto.

Qualche idea sulla mia domanda riguardo la funzione lineare?
E' l'ultima cosa che mi manca per finire il progetto ma sono bloccato :(


Posted by kalbiz on 06-06-2010 18:17:

Originally posted by Spr1gg4N
Per quanto riguarda la funzione lineare ho un paio di domande:
1) se non esiste una componente che stia nello spazio tra due ganci che si fa? Si lascia vuoto quello spazio oppure si stampa il messaggio di errore?

2) nell'esempio 2, come secondo componente mette c1 oppure c2 che hanno entrambi estensione 12....come mai non sceglie c3 che è più corto dei precedenti ma ha estensione maggiore (24)?

EDIT:
-------------
quindi come soluzione possibile dell'esempio 2 io metterei anche:
69: (<c5,2>,<c3,7>,<c1,17>,<c6,24> ) oppure
69: (<c5,2>,<c3,7>,<c2,17>,<c6,8> )

voi che dite?



nelle specifiche dice che possono esserci anche diverse soluzioni per i dispositivi, basta che siano di dimensione massima ... quindi dovrebbe andare bene ...
io almeno ho interpretato così ...


Posted by mostrielo on 06-06-2010 21:28:

Originally posted by Spr1gg4N

Qualche idea sulla mia domanda riguardo la funzione lineare?
E' l'ultima cosa che mi manca per finire il progetto ma sono bloccato :(


Per l'operazione lineare si può procedere così:
1) opeazione 'c': in fase di costruzione dell'albero di ricerca (o rb) dei Componenti per Id, costruite un'altro albero ordinato per Area (per comodità si può aggiungere alla struct Componente l'attributo Area (l x h))
2) operazione 'l': fatevi dare dall'albero dei Componeneti per Area il max e provate a posizionarlo sul primo gancio dato (cioè se la lunghezza del rettangolo è <= alla distanza tra il primo e il secondo gancio):
- se ci sta lo appendete al gancio e vi fate dare il predecessore (di quello con area max corrente) e ripartite dal gancio successivo, se non ci sta provare a posizionarlo sul secondo gancio e cosi fino eventualmente fino all'n-esimo gancio;
- se non ci sta su nessun gancio dato, vi fate dare il predecessore (di quello con area max corrente) e ripetete a partire sempre dal primo gancio libero;
- tutto ciò finché non avete posizionato un Componente su ogni gancio dato oppure, a forza di chiedere il predecessore non avete percorso tutto l'albero (ovvero siete arrivati a quello con Area min). Se avete percorso tutto l'albero e non avete posizionato un rettagolo su ogni gancio dato allora non esiste un dispositivo lineare adeguato.


Posted by carla86 on 06-06-2010 21:52:

Originally posted by kalbiz
se ho anche solo un componente che si adatta ad uno dei ganci perchè non dovrebbe costruire un dispositivo ??
cioè
c 1 2 3 2 5
c 2 3 4 3 5

l 2 4 5

dovrebbe restituire
c 1 2 3 2 5


il comando lineare ke hai scritto tu forma un dispositivo composto da due componenti. quindi se nn ci sono due componenti che si adattano a quelle distanze allora nn ce un dispositivo adatto


Posted by carla86 on 06-06-2010 21:55:

Originally posted by misterx
io ho toccato il meno possibile evitando di eliminare quello che non è strattamente chiaro, al massimo viene passato un parametro che non viene usato in questa implementazione


grazie!! poi ho capito ke la funzione in più ke parlava d parametri era semplicemente una qualsiasi funzione (io l'ho sostituita con la printf) e nell'intestazione d funzione nn ho messo nulla.


Posted by carla86 on 06-06-2010 22:00:

Originally posted by Spr1gg4N
ragazzi ma voi come avete risolto per l'input del comando "o" (ordina)?
non riesco proprio a creare un array di int che aumenti dimensione man mano che viene inserito un nuovo numero in input -.-'


questo problema ce l'avevo anke io e la risp del prof è stata:
"la lista è una struttura dati dinamica.."
quindi forse t conviene usare una lista.


Posted by carla86 on 06-06-2010 22:24:

Originally posted by Spr1gg4N
ragazzi ma voi come avete risolto per l'input del comando "o" (ordina)?
non riesco proprio a creare un array di int che aumenti dimensione man mano che viene inserito un nuovo numero in input -.-'


se hai usato un albero binario d ricerca su algoteam ci sono la sia la funzione x cancellare un nodo dall'albero, sia la funzione x cancellare l'albero.
mentre invece x l'albero red-black ce solo la funzione x cancellare un nodo..


Posted by carla86 on 06-06-2010 22:27:

Originally posted by Spr1gg4N
Per quanto riguarda la funzione lineare ho un paio di domande:
1) se non esiste una componente che stia nello spazio tra due ganci che si fa? Si lascia vuoto quello spazio oppure si stampa il messaggio di errore?

2) nell'esempio 2, come secondo componente mette c1 oppure c2 che hanno entrambi estensione 12....come mai non sceglie c3 che è più corto dei precedenti ma ha estensione maggiore (24)?

EDIT:
-------------
quindi come soluzione possibile dell'esempio 2 io metterei anche:
69: (<c5,2>,<c3,7>,<c1,17>,<c6,24> ) oppure
69: (<c5,2>,<c3,7>,<c2,17>,<c6,8> )

voi che dite?


per la domanda uno: io stamperei il messaggio d'errore,
in tutti quei casi in cui anke solo x uno spazio nn riesci a creare un dispositivo lineare stamperei il messaggio d'errore.
per la domanda due: il prof a ricevimento mi ha detto ke a lui va bene qualsiasi dispositivo lineare ke abbia estensione massima; e ke quelli scritti nel testo sono degli esempi ma potrebbero benissimo essercene altri.
a lui basta ke gliene stampi uno!!


Posted by carla86 on 06-06-2010 22:31:

Originally posted by mark
sporca numero 2

usare la funzione inorder() per visitare tutto l'albero e usare nodedelete() o similare per eliminare tutti i nodi

infine eliminare la radice con NULL


cavolo a qst nn c'avevo pensato..
mi sembra un'ottima idea!!!


Posted by carla86 on 07-06-2010 10:12:

ciao!!
qualcuno d voi ke ha implementato gli alberi di ricerca binaria e ha implementato anke la funzione di distruggere l'albero.
quando andate a compilare con -Wall e -ansi anke a voi da questo warning:

In function ‘distruggialbero’:
progetto.c:459: warning: suggest parentheses around assignment used as truth value

secondo voi da cosa è dovuto? vi copio la mia riga 459
while(p = cancella(p, p));

grazie


Posted by mostrielo on 07-06-2010 10:22:

Originally posted by carla86
ciao!!
qualcuno d voi ke ha implementato gli alberi di ricerca binaria e ha implementato anke la funzione di distruggere l'albero.
quando andate a compilare con -Wall e -ansi anke a voi da questo warning:

In function ‘distruggialbero’:
progetto.c:459: warning: suggest parentheses around assignment used as truth value

secondo voi da cosa è dovuto? vi copio la mia riga 459
while(p = cancella(p, p));

grazie


prova con while((p = cancella(p, p)));


Posted by carla86 on 07-06-2010 10:27:

grazie, ha funzionato mancavano una coppia di parentesi!!


Posted by Guepe on 07-06-2010 13:11:

sto impazzendo sull'ordinamento per costo...io mi ritrovo una lista su kiave id con dentro i componenti presi dall'albero. come faccio a ordinarli in base al costo? come avete fatto voi?


Posted by carla86 on 07-06-2010 13:14:

Originally posted by Guepe
sto impazzendo sull'ordinamento per costo...io mi ritrovo una lista su kiave id con dentro i componenti presi dall'albero. come faccio a ordinarli in base al costo? come avete fatto voi?


quando li inserisci, invece ke inserirli in ordine d id inseriscili direttamente in ordine d costo..


Posted by carla86 on 07-06-2010 13:17:

mi dite x favore come faccio a scrivere una funzione ke ritorna un'array d interi?

int *pos(lista *p, int nro)
{
int pos[nro];
/*faccio quello che devo fare*/
return pos;
}

può andare bene? se no com'è? grazie


Posted by Guepe on 07-06-2010 13:33:

Risolto!!ho abbandonato le liste e ho creato u nalbero nuovo e poi inorder fa tutto, rimane solo un problema....nn mi prende l'ultimo componente nella ricerca e nn so il perchè...bah continuo a far prove....


Posted by Guepe on 07-06-2010 13:46:

Originally posted by Guepe
Risolto!!ho abbandonato le liste e ho creato u nalbero nuovo e poi inorder fa tutto, rimane solo un problema....nn mi prende l'ultimo componente nella ricerca e nn so il perchè...bah continuo a far prove....


non è che nn mi prende l'ultimo, è inorder che mi restituisce solo due componenti dell'albero....


Posted by carla86 on 07-06-2010 14:12:

x la funzione lineare voi come fate? o meglio dopo aver letto le posizioni fate uno alla volta i componenti partendo da quello da mettere in prima posizione oppure partite da quello ke deve avere lunghezza minore..

mi spiego meglio con un esempio
l 2 7 17 24 26
partitè dal componente da mettere nella posizione due oppure partite dal componente da mettere in posizione 24 visto ke deve essere il più piccolo?

nel caso partite da quello più piccolo come fate?


Posted by Guepe on 07-06-2010 16:16:

proprio non riesco a farla andare sta funzione ordina.....mi stampa solo due valori dell'albero....non riesco a capire perke mi stampa solo la radice e il figlio sinistro cioe i componenti 24 e 7...


Posted by carla86 on 07-06-2010 16:24:

qualcuno ha fatto la funzione lineare?!?!

io mi sa ke sono fusa..
sono riuscita a leggere tutte le posizioni inseritemi cn il comando l e le ho memorizzate in una lista.
mi sono creata un'altro albero rb con i componenti ordinati per area (come da qualcuno suggerito).
ma ora nn so come calcolare, o meglio nn so dove memorizzare le distanze, ogni volta la distanza tra una posizione e la successiva x poter controllare ke il massimo ritornatomi dall'albero ordinato per area possa stare in quella posizione.

qualche idea??


Posted by mostrielo on 07-06-2010 17:01:

Originally posted by carla86
qualcuno ha fatto la funzione lineare?!?!

io mi sa ke sono fusa..
sono riuscita a leggere tutte le posizioni inseritemi cn il comando l e le ho memorizzate in una lista.
mi sono creata un'altro albero rb con i componenti ordinati per area (come da qualcuno suggerito).
ma ora nn so come calcolare, o meglio nn so dove memorizzare le distanze, ogni volta la distanza tra una posizione e la successiva x poter controllare ke il massimo ritornatomi dall'albero ordinato per area possa stare in quella posizione.

qualche idea??


Io ho usato degli array:

<< 2, 7, 17, 24, 26>> input

<< 2, 7, 17, 24>> : gancio
<< 5, 10, 7, 2>> : base (gancio[i+1] - gancio[i])
<<null,null,null,null>> : puntatori a Componente


Posted by Guepe on 07-06-2010 17:46:

Non so dove sbaglio ma dopo tre ore mi sto per mangiare il pc!!
Carla nella funzione ordina per creare un albero nuovo inserendo i componenti con kiave c (costo) tu come hai fatto? Hai riscritto le funzioni di inserimento dei componenti nell'albero? Cosi facendo mi continua a ordinarli per id anche se nelle due funzioni la posizione dei nodi è definita dalle equazioni con il costo come paramentro.....nn capisco come sia possibile...


Posted by carla86 on 07-06-2010 17:50:

Originally posted by Guepe
Non so dove sbaglio ma dopo tre ore mi sto per mangiare il pc!!
Carla nella funzione ordina per creare un albero nuovo inserendo i componenti con kiave c (costo) tu come hai fatto? Hai riscritto le funzioni di inserimento dei componenti nell'albero? Cosi facendo mi continua a ordinarli per id anche se nelle due funzioni la posizione dei nodi è definita dalle equazioni con il costo come paramentro.....nn capisco come sia possibile...


dove ci sono in confronti per intendetci il prof scrive k<nodo->campo tu per id hai scritto id<nodo.id ora scrivi c<nodo.costo

mi sa ci sono un paio d confronti.
e poi inorder è una funzione ricorsiva; tra le due chiamate ci metti la printf x farli stampare


Posted by Guepe on 07-06-2010 17:53:

Originally posted by Guepe
Non so dove sbaglio ma dopo tre ore mi sto per mangiare il pc!!
Carla nella funzione ordina per creare un albero nuovo inserendo i componenti con kiave c (costo) tu come hai fatto? Hai riscritto le funzioni di inserimento dei componenti nell'albero? Cosi facendo mi continua a ordinarli per id anche se nelle due funzioni la posizione dei nodi è definita dalle equazioni con il costo come paramentro.....nn capisco come sia possibile...


No scusa sbagliavo una funzione, riscrivendo le le funzioni di inserimento, inorder sull'albero mi stampa solo due nodi però ordinati giusti....


Posted by Guepe on 07-06-2010 17:57:

i confronti nelle due funzioni li faccio fare con il valore c passato e il valore del nodo gia presente e infatti funziona pero me ne stampa solo due:
nell'esempio del prof inorder mi da
24 1 2 3 3
7 3 4 6 2
ma il componente 23 nn lo stampa! son sicuro di averlo inserito nell'albero perke per precauzione mi son fatto fare una stampa dopo ogni inserimento.


Posted by Guepe on 07-06-2010 18:27:

Originally posted by Guepe
i confronti nelle due funzioni li faccio fare con il valore c passato e il valore del nodo gia presente e infatti funziona pero me ne stampa solo due:
nell'esempio del prof inorder mi da
24 1 2 3 3
7 3 4 6 2
ma il componente 23 nn lo stampa! son sicuro di averlo inserito nell'albero perke per precauzione mi son fatto fare una stampa dopo ogni inserimento.

ci rinuncio.....mettendo altri componenti da ordinare va tutto ok, col componente 23 mi da questo output sbagliato, nn riesco a capire dove sia l'errore visto ke la funzione è identica a quella per creare l'abero normale apparte il fato che cambio la kiave.


Posted by carla86 on 07-06-2010 20:59:

Originally posted by mostrielo
Io ho usato degli array:

<< 2, 7, 17, 24, 26>> input

<< 2, 7, 17, 24>> : gancio
<< 5, 10, 7, 2>> : base (gancio[i+1] - gancio[i])
<<null,null,null,null>> : puntatori a Componente


scusami ma hai usato degli array gia dall'inizio quando hai letto l'input oppure con l'input letto e messo in un'altra struttura (tipo io l'ho messo in una lista) hai costruito i tre array?
l'ultimo array sarebbero dei puntatori ai nodi dell'albero giusto?


Posted by carla86 on 07-06-2010 21:34:

ho un'altra domanda, una volta ke mi sono fatta dare il massimo dall'albero in cui ci sn i nodi ordinati per area quale tra queste due funzioni mi da il suo precedente?
nodorb *treesucc(alberorb *r, nodorb *q)
{
nodorb *qq;
if(q->f_destro != r->sentinella)
return rbtmin(q->f_destro,r->sentinella);
qq = q->padre;
while(qq != r->sentinella && q == qq->f_destro) {
q = qq;
qq = qq->padre;
}
return qq == r->sentinella ? NULL : qq;
}

nodorb *treepred(alberorb *r, nodorb *q)
{
nodorb *qq;
if(q->f_sinistro != r->sentinella)
return rbtmax(q->f_sinistro,r->sentinella);
qq = q->padre;
while(qq != r->sentinella && q == qq->f_sinistro) {
q = qq;
qq = qq->padre;
}
return qq == r->sentinella ? NULL : qq;
}

a logica vi direi treepred ma siccome in qst momento nn sono sicura d nulla ve lo chiedo..


Posted by carla86 on 07-06-2010 22:20:

altra domanda:
come si stampa un array di puntatori a una struttura nodo di un albero red-black?
a sto punto nn è più semplice che i componenti li si mettano in una lista a parte con solo le caratteristiche invece che come puntatori a una struttura?


Posted by carla86 on 07-06-2010 22:59:

un'altra cosa ke nn mi quadra.

nodorb inserimento_area(alberorb *albarea, int i, int f, int c, int l, int h)
{
nodorb *q = malloc(sizeof(nodorb));
nodorb *r = albarea->radice;
nodorb *s = albarea->sentinella;
int area;
if(!q)
{
fprintf(stderr,"Errore di allocazione del nodo.\n");
exit(-5);
}
q->codice_identificativo = i;
q->famiglia = f;
q->costo = c;
q->lunghezza = l;
q->altezza = h;
area = (l*h);
q->estensione = area;
q->f_sinistro = q->f_destro = albarea->sentinella;
q->colore_nodo = red;
while(r != albarea->sentinella)
{
s = r;
r = (l*h) < r->estensione ? r->f_sinistro : r->f_destro;
}
q->padre = s;
if(s == albarea->sentinella)
return albarea->radice = q;
if((l*h) < s->estensione)
s->f_sinistro = q;
else
s->f_destro = q;
return q;
}

xke mi da questo errore:

426: error: incompatible types in return
progetto2.c:431: error: incompatible types in return
progetto2.c:432: warning: control reaches end of non-void function

la riga 426 è: return albarea->radice = q;
la riga 431 è: return q;

se qualcuno capisce il perchè... io nn ci riesco un po xke sono fusa e un po xke sono nervosa ke nn so come fare lineare...
argh nn posso nn consegnare solo x una funzione maledetta!!!

ps da notare ke sull'altra funzione di inserimento praticamente identica va tutto bene, su questa ke mi serve per l'albero delle aree no... uffa!!!


Posted by carla86 on 07-06-2010 23:50:

Originally posted by carla86
un'altra cosa ke nn mi quadra.

nodorb inserimento_area(alberorb *albarea, int i, int f, int c, int l, int h)
{
nodorb *q = malloc(sizeof(nodorb));
nodorb *r = albarea->radice;
nodorb *s = albarea->sentinella;
int area;
if(!q)
{
fprintf(stderr,"Errore di allocazione del nodo.\n");
exit(-5);
}
q->codice_identificativo = i;
q->famiglia = f;
q->costo = c;
q->lunghezza = l;
q->altezza = h;
area = (l*h);
q->estensione = area;
q->f_sinistro = q->f_destro = albarea->sentinella;
q->colore_nodo = red;
while(r != albarea->sentinella)
{
s = r;
r = (l*h) < r->estensione ? r->f_sinistro : r->f_destro;
}
q->padre = s;
if(s == albarea->sentinella)
return albarea->radice = q;
if((l*h) < s->estensione)
s->f_sinistro = q;
else
s->f_destro = q;
return q;
}

xke mi da questo errore:

426: error: incompatible types in return
progetto2.c:431: error: incompatible types in return
progetto2.c:432: warning: control reaches end of non-void function

la riga 426 è: return albarea->radice = q;
la riga 431 è: return q;

se qualcuno capisce il perchè... io nn ci riesco un po xke sono fusa e un po xke sono nervosa ke nn so come fare lineare...
argh nn posso nn consegnare solo x una funzione maledetta!!!

ps da notare ke sull'altra funzione di inserimento praticamente identica va tutto bene, su questa ke mi serve per l'albero delle aree no... uffa!!!


HO LA CONFERMA KE SONO FUSA.. MI ERO DIMENTICATA L'ASTERISCO PER IL FATTO KE TORNA UN PUNTATORE A UN NODO...
VA BE.. INTANTO CON LINEARE NN SO COME FARE...


Posted by mostrielo on 08-06-2010 10:04:

Originally posted by carla86
scusami ma hai usato degli array gia dall'inizio quando hai letto l'input oppure con l'input letto e messo in un'altra struttura (tipo io l'ho messo in una lista) hai costruito i tre array?
l'ultimo array sarebbero dei puntatori ai nodi dell'albero giusto?


Ho letto l'input e l'ho messo in un array; poi ho creato i due array ausiliari: distanze tra ganci e puntatori a Componente.
Durante la visita dell'albero di predecessore in predecessore, all'ultimo array, se la lunghezza del rettangolo è <= della distanza tra i ganci, viene assegnato il campo Componente del nodo (max corrente); per stampare i componenti il dispositivo basta un ciclo su questo array.


Posted by carla86 on 08-06-2010 10:14:

Originally posted by mostrielo
Ho letto l'input e l'ho messo in un array; poi ho creato i due array ausiliari: distanze tra ganci e puntatori a Componente.
Durante la visita dell'albero di predecessore in predecessore, all'ultimo array, se la lunghezza del rettangolo è <= della distanza tra i ganci, viene assegnato il campo Componente del nodo (max corrente); per stampare i componenti il dispositivo basta un ciclo su questo array.


ah ok. quindi tu l'input l'hai gia messo nell'array..
io invece ho messo l'input nella lista e poi alla fine ieri sera ho messo anke le lunghezze in una lista ke poi distruggo.

tu l'hai finito? l'hai gia consegnato?


Posted by carla86 on 08-06-2010 11:55:

ke palle sono completamene bloccata!
e la cosa ke mi fa andare in bestia è ke ora ho
- una lista con le posizioni (so ke è giusta xke l'ho stampata).
- una lista con le distanze tra le posizioni (so ke è giusta xke l'ho stampata).
- l'albero rb ordinato per area...
e ora nn so come mettere in pratica il ragionamento ke in testa ce!!!
uff ke nervoso!!

ma voi l'avete finito?? a che punto siete??


Posted by mostrielo on 09-06-2010 10:19:

Allego un file di input e il relativo output: potete controllare con i vs. exe?


Posted by Guepe on 09-06-2010 11:24:

In quanti son riusciti a consegnarlo entro ieri?
mi direste ke strutture avete usato alla fine?
Grazie


Posted by Spr1gg4N on 09-06-2010 11:27:

Io ho consegnato ieri e ho utilizzato solo RB alberi e liste concatenate


Posted by Spr1gg4N on 09-06-2010 15:16:

Sapete per caso se la data di esposizione del progetto la pubblicheranno qui ( http://homes.dsi.unimi.it/~aguzzoli/algo.htm ) oppure da qualche altra parte?


Posted by dede on 11-06-2010 18:50:

Originally posted by Spr1gg4N
Io ho consegnato ieri e ho utilizzato solo RB alberi e liste concatenate


idem


Posted by BeppeGoal on 12-06-2010 18:50:

Scusate ma secondo voi, ammesso di aver passato il progetto ed essere ammessi all'orale, quando sarà indicativamente il colloquio? Questa o la prossima settimana? Di solito quanti giorni passano?


Posted by Guepe on 14-06-2010 18:20:

Qualcuno che non è riuscito a consegnare il progetto l'8 sta tentando di consegnarlo il 24?
Per la funzione estensione c'è da implementare un modello matematico che calcola l'unione delle estensioni dei componenti che non è difficile...di più.
Per ora con un mio amico siamo riusciti a capire il funzionamento di quando ci sono due componenti che si sovrappongono, il problema si crea quando ci si scontra con una sovrapposizione multipla....


Posted by Guepe on 19-06-2010 15:35:

Forse è una domanda stupida ma mi è venuto un dubbio.
Quando dice che il programma deve leggere da standard input stdin
e scrivere su standard output, vuol dire che il prof testerà il programma eseguendolo cosi:

componentielettroniche < stdin.txt >stdout.txt

o dobbiamo noi usare solo fscanf e fprintf in modo da farglielo leggere e scrivere direttamente senza che gli dia l'input e l'output?


Posted by Spr1gg4N on 19-06-2010 17:00:

standard input = tastiera (ma ovviamente lo farà con la redirezione dell'input)

standard output = video

:D :D


Posted by kermit63 on 21-06-2010 13:02:

vorrei usare l'implementazione del prof degli alberiRB, ma non riesco a capire (C non e' il mio forte) cosa passare come terzo argomento in un eventuale main di prova alla funz inorder.
qualcuno puo' illuminarmi?

void inord(rbnode *p, rbnode *nil, void (*op)(rbnode *))

{

if(p != nil) {

inord(p->left,nil,op);

(*op)(p);

inord(p->right,nil,op);

}

}



void inorder(rbtree *p, void (*op)(rbnode *))

{

inord(p->root, p->nil, op);

}


Posted by carla86 on 21-06-2010 13:20:

Originally posted by kermit63
vorrei usare l'implementazione del prof degli alberiRB, ma non riesco a capire (C non e' il mio forte) cosa passare come terzo argomento in un eventuale main di prova alla funz inorder.
qualcuno puo' illuminarmi?

void inord(rbnode *p, rbnode *nil, void (*op)(rbnode *))

{

if(p != nil) {

inord(p->left,nil,op);

(*op)(p);

inord(p->right,nil,op);

}

}



void inorder(rbtree *p, void (*op)(rbnode *))

{

inord(p->root, p->nil, op);

}


ho avuto anke io lo stesso problema fino a quando nn ho capito ke il terzo argomento sarebbe una funzione ke gli vuoi passare... in realtà puoi anke omettere il terzo argomento.
se ti servi per stampare metti in mezzo alle due chiamate inord la printf.


Posted by kermit63 on 21-06-2010 14:05:

grazie carla86!
finalmente ho capito come funziona il passaggio di parametri funzione


Posted by Guepe on 22-06-2010 10:52:

Ma qualcuno che sta dando il progetto il 24???
Sto impazzendo un po sulla funzione prospetto perché non so in che struttura dati inserire il prospetto visto che poi la funzione costominimo dovrà lavorarci e non poco....voi che avete usato?


Posted by L3D on 23-06-2010 19:40:

progetto del 24 ?!

Io devo dare il progetto del 24 ma sto letteralmente impazzendo per la creazione della funzione "costominimo" qualcuno ha da dare suggerimenti ? sono ben Accetti!!!



Prima mia ipotesi creare TUTTE le combinazioni possibili e prendere quella con costo minore.. Dobrebbe dare un risultato corretto ma il prof ha detto che nn è Ottimale..

Seconda utilizzare Programmazione dinamica ? quale soluzione verrebbe fuori ? cmq sia la ricorsione nn andrebbe a fare la combinazione cmq di tutti i casi ?


Posted by kermit63 on 24-06-2010 07:33:

suggerimento per il costominimo:
io uso un grafo pesato, con nodi pari agli elementi del prospetto. ad ogni nodo aggiungo la sua lista di nodi adiacenti, prendendoli dal gruppo successivo nel prospetto e calcolando il peso del cammino. il peso e' dato dalla somma dei costi dei due nodi + l'eventuale costo della famiglia di destinazione se le famiglie sono diverse. ottenuto il grafo pesato calcolo il cammino minimo da ogni sorgente (saranno pochi) e nel caso sia minore del precedente lo sostituisco.
l'unico problema e' che devo ancora implementarlo.. aiuto !!


Posted by kermit63 on 24-06-2010 07:38:

per il cammino minimo usero' Dijkstra, ovviamente :)


Posted by L3D on 24-06-2010 08:47:

+ o - ho capito come fai tu..
o come farai :P.. penserò ancora un pò e poi vedo che fare.


All times are GMT. The time now is 04:12.
Show all 127 posts from this thread on one page

Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.