Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi A - F > Algoritmi e strutture dati
Pages: 1 [2] 
Progetto "Componenti Elettroniche"
Clicca QUI per vedere il messaggio nel forum
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.

Guepe
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.

carla86
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?

carla86
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..

carla86
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?

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!!!

carla86
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...

mostrielo
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.

carla86
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?

carla86
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??

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

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

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

Spr1gg4N
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?

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


idem

BeppeGoal
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?

Guepe
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....

Guepe
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?

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

standard output = video

:D :D

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);

}

carla86
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.

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

Guepe
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?

L3D
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 ?

kermit63
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 !!

kermit63
per il cammino minimo usero' Dijkstra, ovviamente :)

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

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate