 | |
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 |
Progetto "DIE HARD" Clicca QUI per vedere il messaggio nel forum |
ste182 |
Ciao ragazzi!
è uscito, come avrete notato, il testo del progetto "DIE HARD".
Sto iniziando a ragionarci sopra e sembra abbastanza fattibile, no?
Il mio dubbio è sul tipo di struttura adeguata da utilizzare; sicuramente l'operazione più frequente sarà la ricerca(quindi ho escluso le liste).
Sono indeciso se utilizzare hash table o alberi rb. Le prime hanno complessità costante nel caso migliore ma dipendono da molti fattori nel caso medio/peggiore(fattore di carico, numero degli elementi, grandeza tabella..).
Gli alberi rb invece hanno tempo di ricerca pari a O(log(n)).
voi che ne dite? che strutture pensate di utilizzare?
ps: è fattibile secondo voi una cosa del tipo: utilizzare hash con alberi rb per risolvere le collisioni? |
f3d386 |
guarda io sto pensando di utilizzare gli alberi rb come struttura principale...
non sono però riuscito ancora a individuare la struttura adatta per quanto riguarda le combinazioni, cioè tutti i passaggi per passare da una configurazione a ad una configurazione b.
Voi che pensate di fare? |
ste182 |
eh, bella domanda... :( |
arfish |
Ragazzi ma come funziona l'operazione raggiungibile?? |
f3d386 |
eh...proprio lì sta il casino.
In teoria ti dice se è possibile passare da una configurazione A ad una B attraverso una serie di operazioni elementari (riempi, svuota, travasa).
Ad esempio se la mia configurazione A è 0[3] 0[5] chiedo al programma se è raggiungibile una configurazione B ad esempio 0[3] 4[5]...
in questo modo in teoria:
r 0 4
e il programma dovrebbe restituirmi SI in quanto facendo questi passaggi:
1. riempire il contenitore da 5 galloni: (0[3],5[5]);
2. travasare il contenitore da 5 in quello da 3: (3[3],2[5]);
3. svuotare il contenitore da 3: (0[3],2[5]);
4. travasare il contenitore da 5 in quello da 3: (2[3],0[5]);
5. riempire il contenitore da 5: (2[3],5[5]);
6. travasare il contenitore da 5 in quello da 3: (3[3],4[5]);
7. svuotare il contenitore da 3: (0[3] 4[5])
ottengo proprio la configurazione dei livelli richiesta in input...
il problema è: che struttura usare? io sto pensando a un grafo ma ho qualche problema a far tornare il tutto...
idee??? |
technorebel |
io voterei per un albero di ricerca rb...come prima idea...ma ben vengano altre...:) |
f3d386 |
si credo che per gestire l'input vada bene...ma il raggiungibile non credo sia implementabile con un albero rosso nero...o almeno non ne sono tanto sicuro... |
arfish |
f3d386 dopo aver letto il tuo post stavo pensando anch'io a un grafo.
Magri popolarlo con i risultati di tutte le combinazioni fino a raggiungere la soluzione... non credo sia una soluzione decente... |
f3d386 |
oltre a non essere decente presenta pure un problema...le operazioni riempi e svuota hanno condizioni ke evitano il loop, ossia quando un contenitore è pieno l'operazione riempi si blocca e idem per l'operazione svuota se un contenitore è vuoto. L'operazione travasa invece è previsto si blocchi se il contenitore sorgente è vuoto o se il contenitore destinazione è pieno, ma cosa sucede se ad esempio ho una tanica da 3 e una da 5 riempio quella da 3 e poi continuo a travasare quella quantità d'acqua tra i due vasi???si crea un loop e l'operazione travasa continuerà a generare operazioni possibili...è un casino!volevo scrivere al prof di questo problema ma credo che non mi risponderebbe comunque fino al 7 di gennaio... |
arfish |
pensavo di risolvere il problema del calcolo dei "percorsi" già effettuati inserendo i risultati in un albero, e cercare se sono stati già calcolati o meno, ma il tutto mi sembra di un macchinoso... |
f3d386 |
ragazzi scusate...prima ancora di arrivare al punto cruciale mi sono fermato sul problema dell'input, nel caso dell'inserimento (es. N 3 4 5)
cioè lui dice cito testualmente:
"
- crea contenitori(c)
Dato un vettore c = (c1 , c2 , . . . , cn ) di interi positivi, inizializza una sequenza di n contenitori
inizialmente vuoti aventi capacit`a c1 , c2 , . . . , cn . Ad esempio, crea contenitori(2, 3, 6) inizializzerà la configurazione (0[2],0[3],0[6]). Se esiste già una sequenza di contenitori, la cancella e ne crea una nuova. "
ma questo significa che obbligatoriamente l'input dovrà essere inserito in un vettore?
e poi io per il momento non sto usando un vettore ma per far capire al compilatore che la seuquenza di interi di input è finita, come faccio? avevo pensato che l'utente possa far terminare la sequenza inserendo il valore 0 (dato ke non è concepibile un contenitore di capacità 0)...ma il prof non dice nulla in merito nella scheda del progetto...dite che posso fare così o sono completamente fuori strada? |
f3d386 |
ho risolto!!!
la soluzione ce l'avevo sotto gli occhi ma data l'ora non me ne rendevo conto XD XD XD |
f3d386 |
ragazzi ma nessuno ha idea della struttura da usare per implementare le funzioni esiste raggiungibile e configurazioni ???
io mi sto dannando cercando di capire quale può essere!!! :evil:
help meeeeeeeeee!!!!!!!!!!! |
Deckard |
Originally posted by f3d386
ragazzi ma nessuno ha idea della struttura da usare per implementare le funzioni esiste raggiungibile e configurazioni ???
io mi sto dannando cercando di capire quale può essere!!! :evil:
help meeeeeeeeee!!!!!!!!!!!
Ma è sicuramente un grafo. Le varie operazioni come "raggiungibili" e "configurazioni" sono delle semplici visite per ampiezza e/o profondità opportunamente modificate.
Il problema è capire come rappresentarlo questo grafo: tramite vettore di liste di adiacenza calcolando all'inizio tutti i possibili lati? È la soluzione più semplice ma molto inefficiente poiché lo spazio occupato aumenta in maniera esponenziale rispetto al numero dei contenitori.
Le altre possibilità che mi sono venute in mente ho paura siano invece un po' troppo complesse da implementare. |
pirlo21 |
secondo me bisogna decifrare bene questo....
- raggiungibile(a)
Dato un vettore a = (a1; a2; : : : ; an) di interi positivi, stampa SI' oppure NO a seconda che dalla
con¯gurazione attuale sia possibile raggiungere una con¯gurazione in cui, per ogni i 2 f1; 2; : : : ; ng,
il contenitore i ha livello ai.
Perchè non mi sembra che sia lo stesso significato spiegato all'inizio del testo, così come la storia delle bombe assume significato solo nelle versioni successive del programma, potrebbe essere così anche per raggiungibile |
palaz |
qualcuno è gia riuscito a implementare esiste??
è un vero macello!!!! |
massimo1984 |
sei in linea? |
f3d386 |
io x il momento mi sono fermato alle funzioni crea,riempi, vuota travasa ed esci...anch'io sono convintissimo che sia un grafo e anche a me non piace la soluzione basata sulle liste di adiacenza...possibile che non esista un modo più efficiente di implementare la struttura?
Inoltre, chiedo, il problema che avevo scritto qualche post fa sul fatto che se continuo a travasare la stessa quantità tra 2 contenitori la struttura cresce all'infinito come lo si risolve? |
f3d386 |
@Deckard :
Come fai a calcolare all'inizio tutti i possibili lati del grafo? |
massimo1984 |
raga qua io credo di avere trovato qualkosa ma ho bisogno di aiuto.. |
massimo1984 |
suggerimento: www.inzonatre.altervista.org (incontriamoci nella sezione chat di questo sito cazzutissimo che avevo creato io tempo fa per discutere in tempi brevi.. Grazie) |
palaz |
io per ora ho usato un albero rb.. tanto la visita in ampiezza si può fare lo stesso |
palaz |
a prima vista un grafo mi sembra un po dispersivo.. nel senso che lo fermi solo se trovi altrimenti vai avanti continuamente.... |
f3d386 |
io più che altro vorrei intanto capire come generare tutte le possibili configurazioni usando le tre operazioni elementari....per sapere su un input di n elementi quante ne genera x avere un'idea... |
palaz |
prova a guardare questo schema.. a me mi ha aiutato a capire come si possono trovare le soluzioni..me lo ha passato massimo....
e in effetti è un grafo... |
f3d386 |
si vedo...le configurazioni nei vertici devono essere tutte quelle possibili e gli archi le operazioni elementari....ma come fai a calcolare tt le combinazioni possibili?è lì ke m'impianto...ancora prima dell'implementazione vorrei capire la logica che ci sta dietro... |
palaz |
eh tipo io sto provando a fare una funzione che calcoli per ogni bidone lo svuotamento... se fattibile crea la nuova configurazione e la attacca al nodo precedente....se ne trova una seconda la attacca come secondo next...e cosi via per tutte e tre le operazioni.. ma anche io sto solo provando a mettere giu qualcosa... |
pirlo21 |
diciamo che trovare tutte le combinazioni è un problema ma è un problema fattibile... il vero problema è la funzione ESISTE perchè ha bisogno di calcolare infinite combinazioni in quanto non esiste un numero n fissato di operazioni elementari dopo il quale fermarsi... |
middu |
a me viene in mente una struttura di grafo, dati i concetti di ragggiungibilità |
arfish |
Credo che utilizzare un grafo sia necessario, il discorso è come lo riempio ci metto tutte le possibili e immaginabili combinazioni? Oppure esiste un'altra maniera? |
middu |
ma penso che per iniziare dobbiamo creare una struct per rappresentare un contenitori |
middu |
penso di si! in quanto ad esempio se devi creare n contenitori iniziali bisogna memorizzarli tutti nella struttura di grafo. Io avrei pensato di rappresentare il grafo mediante liste di adiacenza, ma ripeto bisogna realizzare il contenitore come un nodo di tale grafo. Questo lo si fa tramite una struct. |
-Oblivion- |
Scusatemi la domanda forse banale, ma cosa significa questo nelle specifiche:
Il programma deve leggere dallo standard input (stdin) una sequenza di righe (separate da \n), ciascuna
delle quali etc.. etc..
I vari elementi sulla riga sono separati da uno o piµu spazi. Quando una riga µe letta, viene eseguital'operazione associata; le operazioni di stampa sono effettuate sullo standard output (stdout), e ognioperazione deve iniziare su una nuova riga. |
-Oblivion- |
PS. per la ricerca delle varie combinazioni in n passi e la ricerca di una determinata combinazione, io stavo pensando di applicare Dijkstra su liste di adiacenza.
Il loop si evita appunto con dijkstra.
Questa è la mia primissima idea ponderata in 5 minuti dopo aver letto il progetto, quindi con buona probabilità è una minchiata, in questo caso sarei immensamente felice se me lo diceste XD |
delleroby |
Ciao a tutti,
ma secondo voi l'input deve avvenire da prompt dei comandi o da file di testo?
Grazie mille per la risposta! |
darkshadow |
è indifferente perchè basta fare il redirect dello stdin su file o lasciarlo di default alla tastiera |
delleroby |
Si sò che non dovrebbe essere difficile.
Ma il prof come lo vuole? Lettura da file o inserimento da tastiera?
Scusate se ripresento il dubbio.
E grazie ancora. |
darkshadow |
forse non hai capito, il fatto che gli passi l'input da file o da tastiera è indifferente xte. le funzioni di I/O (es. scanf, getchar, ecc) sono sempre le stesse indipendentemente da dove prendi l'input.
spero di essere stato + chiaro questa volta. |
iDarbert |
Originally posted by delleroby
Si sò che non dovrebbe essere difficile.
Ma il prof come lo vuole? Lettura da file o inserimento da tastiera?
Scusate se ripresento il dubbio.
E grazie ancora.
Da tastiera |
f3d386 |
qualcuno è riuscito ad implementare almeno uan delle funzioni esiste raggiungibile configurazioni? |
iDarbert |
Io sono ancora bloccato all'implementazione dei grafi, non è che qualcuno ha ancora gli esercizi del laboratorio? |
palaz |
anche io sono bloccato.. penso di aver trovato l'algoritmo adatto ma non riesco a metterlo giu funzionante e mi va in loop!!! |
pirlo21 |
scusate una domanda molto stupida, ma a me sembra che di stupidate in questi progettini ci sia ben poco...
sono giorni che sto impazzendo sull'inserimento...il professore vuole che si usi scanf o getchar, ma com'è possibile acquisire un numero non noto di parametri con queste funzioni????? Ho provato con scanf ad acquisire una stringa (per poi spezzarla con strtok) ma mi da enormi problemi, cosa che non fa se uso la gets()... |
palaz |
tu leggi il comando con getchar e i numeri li leggi successivamente con scanf assicurandoti di non trovare uno spazio allora salti la lettura... |
palaz |
tipo questo puo essere l'while di lettura che devi usare per leggere tutta la riga di comando dell'inserimento dei bidoni
while((c=getchar())!='\n')
{
effettuare inserimento valore nell'apposito campo del bidone
} |
francescoo |
ciao a tutti,
io ho fatto inserire una sequenza di caratteri, a seconda del primo carattere immesso,salvo ,ad esempio per inserimento, le capienze nel vettore e poi con queste capienze dovrei creare l'albero dove per ogni nodo definirei i seguenti dati:
num.di cont (kiave)
capienza
qnt litri ha all'interno
ke ne dite?
ke alberi usereste?rb?
aspetto grazie mille |
palaz |
io non ho usato gli alberi per contenere le informazioni iniziali perche gli alberi sono molto utili nel caso d continue ricerce... in questo problema si devono generare delle soluzioni.. anzi tutte le possibili soluzioni.... e le operazioni di svuota riempi e travasa funzionano tramite indice... |
francescoo |
e quindi palaz tu per questo progetto non usi alberi?e cosa usi le liste? |
palaz |
no beh.. uso i grafi... o cmq una implementazione simile ai grafi..
alla fin fine ho notato che è meglio per generare le combinazioni possibili |
f3d386 |
@palaz
scusami ma tu ke ci metti nel nodo di un grafo? cioè costruisci un nodo x ogni configurazione possibile o ad esempio crei un nodo per tt le combinazioni possibili da un nodo precedente usando la funzione "riempi", uno x quelle trovate usando "svuota" ecc ecc ?
xchè io al momento sono molto in crisi su questo...cioè penso di aver trovato un metodo per generare tutte le possibili combinazioni (ho ancora qualche prob coi loop) ma dopo non so come utilizzare i risultati in un grafo...non so se mi spiego... |
technorebel |
io sto piacevolmente notando quanto sia utile il sito algoteam. Proprio utile.:) |
palaz |
io in u nodo ci metto una configurazione.. se no sinceramente non saprei come fare... |
francescoo |
anche io pensavo una configurazione per ogni nodo...
e technorebel tu da algoteam quale implementazione di grafo stai utilizzando? |
francescoo |
ragazzi sto andando in una confusione pazzesca e manca pochissimo tempo...
allora inzialmente pensavo di usare alberi rb e in ogni nodo
rappresentavo un contenitore con relativa capacità e litri contenuti..ma come mi avete fatto notare per questo problema gli alberi non sono cosi indicati..
quindi userei grafi..ma quindi per salvare in ogni nodo la configurazione attuale come faccio?
in ogni nodo salvo un vettore contenente i litri che ha ogni contenitore?
vi prego di spiegarmi come usare i grafi per questo probelma xke sono davvero in crisi..
grazie |
f3d386 |
io sono nella tua stessa situazione francescoo...sono partito con una struttura ad albero rb x i contenitori ma adesso devo riscrivere tt daccapo per implementare una struttura basata sui grafi...il problema poi è cosa metterci nel nodo e soprattutto come implementare la funzione che calcoli tt le combinazioni possibili...sono abbastanza in crisi anche xchè sono 3 anni ke tento di dare sto esame...è uno degli ultimi ma anche uno dei peggiori... :( |
ste182 |
ciao ragazzi..
io per crea_contenitori, riempi, svuota e travasa ho usato un semplice array dinamico.
ora per le altre funzioni pensavo di usare un grafo con liste di adiacenza; ma non ne sono molto convinto perchè ,per trovare una determinata configurazione, dobbiamo scorrere tutta la lista.. voi che ne dite? |
francescoo |
e quindi ste182 tu ogni volta che ti rikiama la funzione esiste,raggiungibile,configurazioni allochi un grafo e lo deallochi alla fine della funzione?? |
technorebel |
@ francescoo
Sto scartabellando tra i vari grafi, studiare le parti di codice per adattare il progetto. |
francescoo |
ok..ma per ogni nodo del grafo tu cosa memorizzi?e come?è quello che non riesco a capire..
come fai a salvare tutte le capacità in un nodo?in ogni nodo salvi un vettore? |
ste182 |
Originally posted by francescoo
e quindi ste182 tu ogni volta che ti rikiama la funzione esiste,raggiungibile,configurazioni allochi un grafo e lo deallochi alla fine della funzione??
l'idea è quella.. ora mi tocca metterla in pratica:D |
f3d386 |
@francescoo
stesso problema...come fai a salvare in un nodo tt le configurazioni?
ankio all'inizio ero partito con l'idea degli alberi rb ma poi sono ricorso agli array dinamici...ho ancora qualche problema a volte di overflow ma almeno quella parte è quasi completa...ma il grafo è veramente un casino!!! |
f3d386 |
ragazzi io da adesso fino alle 1730 circa sono qui in comelico...c'è qlkun'altro da queste parti ?
così magari si discute insieme del progetto... |
technorebel |
ogni nodo misura il vettore dei contenitori. Derivanti da matrici di adiacenza.:)
poi ti calcoli per ogni operazione quanti nodi vengono generati.
Prova!! |
ste182 |
ragazzi ma voi che struttura usate per la funzione esiste?? grafi o alberi?? |
asterix07 |
!-Chiarimento:
Nel progetto è scritto:"Denotiamo con un vettore (a1,a2...an) di interi la configurazione dei livelli d'acqua nei contenitori..."
Ma se si crea una struttura del tipo
struct contenitore{
int capacità;
int stato;
}
non dovrebbe servire un array perche tengo traccia della configurazione mediante la variabile stato di ogni contenitore.
Inoltre anche le funzioni del tipo riempi travasa ecc... andrebbero ad agire su questa variabile.
Ora siccome mi sembra una soluzione scontata, quali sono le controindicazioni? |
iDarbert |
Originally posted by asterix07
!-Chiarimento:
Nel progetto è scritto:"Denotiamo con un vettore (a1,a2...an) di interi la configurazione dei livelli d'acqua nei contenitori..."
Ma se si crea una struttura del tipo
struct contenitore{
int capacità;
int stato;
}
non dovrebbe servire un array perche tengo traccia della configurazione mediante la variabile stato di ogni contenitore.
Inoltre anche le funzioni del tipo riempi travasa ecc... andrebbero ad agire su questa variabile.
Ora siccome mi sembra una soluzione scontata, quali sono le controindicazioni?
Sì, ma ogni configurazione dovrà immagazzinare lo stato di ogni singolo contenitore. È lì che serve l'array.
Certo c'è da chiedersi se è il caso di creare una struct contenitore quando basterebbero magari due array, uno che indica le capacità in ordine e un altro che indica i volumi effettivamente contenuti.
Anche se questo complicherebbe un po' le operazioni penso, obbligando a ripescare l'array delle capacità anziché leggendo semplici proprietà della struct. |
ste182 |
sono riuscito a generare tutte le possibili combinazioni e inserirle nel grafo(implementato tramite liste di adiacenza). ora mi chiedo: per la funzione "esiste" uso una visita in ampiezza o profondità??
inserendo N 3 5 ottengo:
code:
nodi lista adiacenze
(0[3],0[5]) (3[3],0[5]) (0[3],5[5])
(3[3],0[5]) (3[3],5[5]) (0[3],0[5]) (0[3],3[5])
(0[3],5[5]) (3[3],5[5]) (0[3],0[5]) (3[3],2[5])
(3[3],5[5]) (0[3],5[5]) (3[3],0[5])
(0[3],3[5]) (3[3],3[5]) (0[3],5[5]) (0[3],0[5]) (3[3],0[5])
(3[3],2[5]) (3[3],5[5]) (0[3],2[5]) (3[3],0[5]) (0[3],5[5])
(3[3],3[5]) (3[3],5[5]) (0[3],3[5]) (3[3],0[5]) (1[3],5[5])
(0[3],2[5]) (3[3],2[5]) (0[3],5[5]) (0[3],0[5]) (2[3],0[5])
(1[3],5[5]) (3[3],5[5]) (0[3],5[5]) (1[3],0[5]) (3[3],3[5])
(2[3],0[5]) (3[3],0[5]) (2[3],5[5]) (0[3],0[5]) (0[3],2[5])
(1[3],0[5]) (3[3],0[5]) (1[3],5[5]) (0[3],0[5]) (0[3],1[5])
(2[3],5[5]) (3[3],5[5]) (0[3],5[5]) (2[3],0[5]) (3[3],4[5])
(0[3],1[5]) (3[3],1[5]) (0[3],5[5]) (0[3],0[5]) (1[3],0[5])
(3[3],4[5]) (3[3],5[5]) (0[3],4[5]) (3[3],0[5]) (2[3],5[5])
(3[3],1[5]) (3[3],5[5]) (0[3],1[5]) (3[3],0[5]) (0[3],4[5])
(0[3],4[5]) (3[3],4[5]) (0[3],5[5]) (0[3],0[5]) (3[3],1[5])
come vedete, i nodi sono 16(tutte le possibili combinazioni usando riempi, svuota e travasa).
ora per la esiste mi conviene visitare in ampiezza o profondità?? che casino:( |
f3d386 |
@ste182
cavolo ma come hai fatto????
io sto impazzendo sulla funzione che genera tt le possibili combinazioni...
al di là dell'inserimento nel grafo ke poi è il passo successivo, come fai a calcolare tt le combinazioni possibili??? |
ste182 |
Originally posted by f3d386
@ste182
cavolo ma come hai fatto????
io sto impazzendo sulla funzione che genera tt le possibili combinazioni...
al di là dell'inserimento nel grafo ke poi è il passo successivo, come fai a calcolare tt le combinazioni possibili???
1 parti dalla configurazione attuale, ne fai una copia
2 usi la copia per eseguire riempi svuota e travasa per ogni bidone, salvando i nuovi nodi generati e mettendoli in una coda(devi controllare che non ci sia già in coda)
3 estrai un elemento dalla coda e lo fai diventare la configurazione attuale
4 ripeti il punto 2 finchè ci sono elementi in coda
ps: al punto 3 estrai un nodo dalla coda, quindi questo non esisterà più. può però succedere che si rigeneri nelle prossime operazioni, quindi prima di rimetterlo in coda(creando così un loop) devi controllare anche che non esista tra i nodi già generati |
f3d386 |
grazie mille!
solo una cosa non ho capito...qui dici:
"ps: al punto 3 estrai un nodo dalla coda, quindi questo non esisterà più. può però succedere che si rigeneri nelle prossime operazioni, quindi prima di rimetterlo in coda(creando così un loop) devi controllare anche che non esista tra i nodi già generati"
cioè?
devo controllare che non sia nella coda ma nemmeno nei nodi generati?e l'elenco dei nodi già generati dove lo salvi?in una lista? |
ste182 |
esatto.. una lista o una coda vanno bene |
francescoo |
ciao ste 182..
io ho avuto la tua stessa idea solo che ho un blocco e non riesco a implementarlo..e una volta fatto saprei come finire il tutt..ti vorrei kiederti una cosa..hai msn?mi daresti il tuo contatto? |
francescoo |
c'è qlcn???
io l'ho pensato nelllo stesso modo di ste82..pero ho un problema:
faccio come ha detto lui al primo punto e cioè mi copio la lista che contiene configurazione attuale,dopo di che con questa copia dovrei cominciare a fare le varie operazioni di riempi,svuota e travasa per trovare le possibili configurazioni;
ora il mio problema quindi è:
prendo la lista(che è una copia di quella di partenza)
eseguo riempi, se riempi si puo fare io modifico la lista su cui stavo lavorando..
capite?cosi facendo io perdo la configurazione che avevo prima.. |
palaz |
beh crea un nuovo nodo che coniene la configurazione allora.. |
francescoo |
quindi ogni volta creo una copia della configurazione(chiamiamo la lista della conf l_conf),
faccio puntare la copia dalla lista configurazione(l_conf) e quindi sulla copia eseguo l'operazione? |
ste182 |
la configurazione iniziale è una array o un nodo contenente l'array, giusto?
quindi mettiamo che ho una funzione copia(sorgente, destinazione)
...facciamo
code:
copia(attuale,copia); //faccio una copia
for(i=0;i<dim;i++){
if(riempi(copia,i){
//inserisci nella coda
//inserisci nel grafo
}
copia(attuale,copia); //ripristina la config. iniziale
}
poi devi rifare per svuota e travasa(usa un doppio for) |
francescoo |
ok grazie mille per il chiarimento pero questo lo avevo capito,il mio problema è nel'esempio che mi hai fatto tu dove hai scritto inserisci nella coda,inserisci nel grafo.
qui dovrei creare ogni volta un nuovo vettore?non so come costruire la coda e il grafo..come impostare la struttura.. |
palaz |
beh per la coda ti basta creare una struttura con due puntatori uno al primo elemento e uno all'ultimo, e ti devi ricordare che se inserisci sposti il puntatore all'ultimo, mentre se estrai devi spostare il puntatore al primo... e legare tra di loro tutti gli elementi interni alla coda ad es con un puntatore next... |
palaz |
il grafo è un po piu incasinato ma ad esempio nel mio creo il primo nodo di partenza e in base a quanti nodi genero nella funzione genera, alloco un grafo **next in modo da legare tutti i figli al padre reallocando ogni volta che ne trovo uno nuovo... |
francescoo |
ok palaz ma non riesco a implementarlo..
la mia coda deve avere un puntatore a interi per gli array che hanno la conf giusto?
cioè io dalla conf attuale faccio riempi 1 , se possibile ottengo una nuova conf che salvo in un nuovo vettore che quindi alloco dinamicamente?giusto?
poi la mia coda sarà composta da un puntatore a interi e quindi gli faccio puntare il vet appena creato,giusto?
e poi dopo come faccio a collegare tutti questi vettori? |
palaz |
anche io ho usato delle code.. ma primo e ultimo li ho fatti puntare direttamente al nodo che contiene la configurazione |
palaz |
pero creare solo dei vettori è scomodo io ho messo tutto in un nodo
in modo da poter puntare i suoi figli con un puntatore next creato apposta nel nodo.. |
francescoo |
domani qlcn di voi e' in comelico?io sono li..nel caso io sono li.. |
f3d386 |
ragazzi ho un grosso problema in fase di compilazione che vi posto di seguito:
gcc -c main.c
In file included from intqueue.h:5,
from main.c:5:
intdummylist.h:8: error: redefinition of ‘struct configurazione’
intdummylist.h:12: error: conflicting types for ‘configurazione’
intdummylist.h:12: note: previous declaration of ‘configurazione’ was here
intdummylist.h:14: error: redefinition of ‘struct intlist’
intdummylist.h:19: error: conflicting types for ‘intlist’
intdummylist.h:19: note: previous declaration of ‘intlist’ was here
intdummylist.h:22: error: conflicting types for ‘createlist’
intdummylist.h:22: note: previous declaration of ‘createlist’ was here
intdummylist.h:25: error: conflicting types for ‘traverse’
intdummylist.h:25: note: previous declaration of ‘traverse’ was here
intdummylist.h:28: error: conflicting types for ‘countlist’
intdummylist.h:28: note: previous declaration of ‘countlist’ was here
intdummylist.h:31: error: conflicting types for ‘insert’
intdummylist.h:31: note: previous declaration of ‘insert’ was here
intdummylist.h:34: error: conflicting types for ‘insertatend’
intdummylist.h:34: note: previous declaration of ‘insertatend’ was here
intdummylist.h:37: error: conflicting types for ‘delete’
intdummylist.h:37: note: previous declaration of ‘delete’ was here
intdummylist.h:40: error: conflicting types for ‘destroylist’
intdummylist.h:40: note: previous declaration of ‘destroylist’ was here
make: *** [main.o] Errore 1
la cosa buffa è che tolta la struttura configurazione che è una mia creazione le altre sono quelle che si possono trovare nel file omonimo su algoteam...
potete aiutarmi????
vi posto anche il makefile nel caso l'errore fosse lì...
exe: main.o intdummylist.o intqueue.o
gcc -o exe main.o intdummylist.o intqueue.o
main.o: main.c intdummylist.h intqueue.h
gcc -c main.c
intdummylist.o: intdummylist.c intdummylist.h
gcc -c intdummylist.c
intqueue.o: intqueue.c intqueue.h intdummylist.h
gcc -c intqueue.c
grazie... |
nevRotico |
Ragazzi che casino =)
Io sono riuscito a fare acquisizione, creazione contenitori, riempimento, svuotamento e visualizzazione per il momento. Tutto questo però utilizzando una matrice bidimensionale in cui ogni riga corrisponde ad un contenitore e le due colonne equivalgono la prima al quantitativo di litri contenuto e la seconda alla capacità massima del contenitore.
Dite che va bene oppure sto sbagliando in partenza? |
nevRotico |
allora raga? si può procedere così o bisogna cambiare impostazione? che dite? |
middu |
allora sto cominciando a vedere quello che posso fare; io avrei fatto
struct contenitore{
int capacità;
int stato;
} e mettendo una lista che contiene le configurazioni di ogni contenitore . é giusto questo??? |
middu |
altro dubbio : comando N 3 5 mi crea un contenitore da 3 galloni e da 5 galloni ??? Nel senso che crea due nodi separati ??? Poi si parla di contenitori da 5 e 3 galloni . A questo punto mi chiedo. Se nel nodo da memorizzare devo tenere in mente anche questa variabile . Non so se mi sono spiegato :
struct contenitore{
int capacità;
int stato;
} ed è il nodo che rappresenta il contenitore. Adesso eseguo il comando N 3 2 i nodi vengono così creati :
nodo 1 : capacità = 3 e stato = 0;
nodo 2 : capacità = 2 e stato = 0;
se invece riempi (2) viene riempito il nodo 2 e lo stato del nodo 2 diventa 2 ?? Come sto procedendo??? |
iDarbert |
Originally posted by middu
altro dubbio : comando N 3 5 mi crea un contenitore da 3 galloni e da 5 galloni ??? Nel senso che crea due nodi separati ??? Poi si parla di contenitori da 5 e 3 galloni . A questo punto mi chiedo. Se nel nodo da memorizzare devo tenere in mente anche questa variabile . Non so se mi sono spiegato :
struct contenitore{
int capacità;
int stato;
} ed è il nodo che rappresenta il contenitore. Adesso eseguo il comando N 3 2 i nodi vengono così creati :
nodo 1 : capacità = 3 e stato = 0;
nodo 2 : capacità = 2 e stato = 0;
se invece riempi (2) viene riempito il nodo 2 e lo stato del nodo 2 diventa 2 ?? Come sto procedendo???
Esatto, giusto così |
middu |
ma dai ho ragionato giusto??? strano |
middu |
oltre a quei due parametri va messo qualche informazione in più??? |
middu |
// operazione di creazione dei nodi : si tratta di inserire nella
// struttua da implementare n nodi, tante sono le capacità passate dal
// comando. Ad esempio N 1 2 4 crea tre nodi nella struttura dati di
// capacità 1 2 e 4 galloni rispettivamente |
f3d386 |
@ste182
ormai dovrò fare l'appello del 1 febbraio, ma ho comunque problemi in quella parte di cui avevamo discusso...
riesci a contattarmi a qst indirizzo mail così puoi chiarirmi una parte del mio codice che non funziona?
grazie
f3d3ux@gmail.com |
francescoo |
ciao a tutti,
un mio amico lo ha consegnato con goldwurm e l'assistente di laboratorio(so che è una donna ma non ricordo il nome), gli ha detto che l'uso di liste per riempi,svuota e travasa non va bene perchè richiede troppo tempo per input grandi..
qualcuno lo ha consegnato con il prof del serale e mi sa dire se a lui va bene con le liste?? |
f3d386 |
domandina stupida...ma quando esco dal programma è necessario fare il free() di tutto ma proprio tutto quello che ho allocato in memoria???
@francescooo
Guarda io faccio il serale e Aguzzoli mi è sembrato molto disponibile ad accettare varie implementazioni.
Personalmente io le operazioni fondamentali di riempi,svuota e travasa le faccio su array, ma uso comunque le liste in varie parti del programma e non mi ha mai detto che sia sbagliato o inaccettabile... |
palaz |
beh io l'ho consegnato con aguzzoli ma prima del 22 non vi so dire nulla....cmq organizzate la struttura base con gli array cosi risolvete il problema dello scorrere la lista.. io il free() della struttura base non l'ho fatto perche tanto all'uscita del programma la memoria viene cancellata.. va fatto per quelle di supporto |
|
|
|
|