 | |
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 |
[Algoritmi] Progetto "CONTROLLO REMOTO" Clicca QUI per vedere il messaggio nel forum |
Teju |
Originally posted by Ariok
X teju
In questo punto non manca una parte dopo il printf? non dovresti anche specificare a che variabili fanno riferimento i vari %d %d %c ecc?
case 'a':
scanf("%d%d%d%d", &a, &b, &c, &d);
printf("crea automa: %d %d %c %d\n");<--- intendo qui
Si, hai ragione, mi ero scordato di dire che mi ero accorto dell'errore! :D
Però rimane il dubbio amletico su come leggere i nomi degli automi nuovi!!!
Ditemi per favore dove trovo i famosi esercizi svolti di cui parla il prof!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :( |
Ariok |
Originally posted by Teju
Ditemi per favore dove trovo i famosi esercizi svolti di cui parla il prof!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :(
:clap: :clap: :clap: :clap: :clap: :clap: :clap: :clap: :clap: :clap: :clap: |
LoneWolf |
All'indirizzo http://homes.dsi.unimi.it/~fiorenti.../lucidi08_4.pdf pagina 5 c'e' un esempio che dovrebbe proprio fare al caso nostro; peccato che se copiate il codice paro paro il compilatore vi spara fuori un bell'errorone.
Infatti, nella dichiarazione dell'array fra le due quadre non c'e' alcun numero, mentre il compilatore si aspetta il numero massimo di elementi. :| |
Skilotto83 |
Originally posted by Ariok
Per chi non fosse ancora sicuro se dare o no il progetto:
Trubian ha confermato che lo scritto dello scorso anno universitario rimarra valido per altri due appelli.
io ci provo comunque anceh se mi sa che mi mancano un po' di nozioni
sikuro??
Ci hai parlato tu???
A me aveva mandato una mail...e diceva proprio cosi'.. |
Jacoposki |
oh che strano un programma di fiorentini che non funziona... :D
vabè, comunque per chi sta seguendo Algoritmi con Torelli/Fiorentini: questo progetto non è per noi, il nostro uscirà l'8 febbraio con orale ai primi di marzo. |
Ariok |
Originally posted by Skilotto83
sikuro??
Ci hai parlato tu???
A me aveva mandato una mail...e diceva proprio cosi'..
Sicuro 100%
Questa e' la sua risposta
Lo scritto rimane valido ancora per un paio di appelli (oltre a questo).
Cordialmente,
M.T. |
mitnik |
Ciao a tutti, come vi procede il lavoro?
avete trovato il modo per memorizzare una stringa di lunghezza indefinita? o meglio qual è il modo più efficiente |
Dante |
Originally posted by mitnik
Ciao a tutti, come vi procede il lavoro?
avete trovato il modo per memorizzare una stringa di lunghezza indefinita? o meglio qual è il modo più efficiente
Se definisci un puntatore a char così:
char ch,d, *n;
e lo leggi così:
scanf ( "%d%d %c %s", &x,&y,&d,n);
e lo stampi così:
printf("\nx= %d, y= %d, d= %c, n= %s", x, y, d, n);
funziona... poi non so ancora se per il progetto sia la soluzione migliore cmq... funziona... |
p2p |
secondo me basta leggere carattere per carattere il nome,una volta che si termina di leggere si sa quanto è grossa la stringa e quindi la si memorizza normalmente in un array.
Ieri sono andato a lezione dal prof. Fiorentini e proprio lui mi ha detto che basta fare cosi; NON ha parlato pero' di array, mi ha solo detto che basta leggere carattere per carattere e che una volta che si conoscono le dimensioni allocare e memorizzare... pero' l array a quel punto si puo' usare secondo me, anche perchè il C non permette di creare qualcosa di cui non si conoscano le dimensioni...
Inoltre parlando con lui, diceva che gli studenti si fissano ad usare troppe liste,che sono inefficienti,invece gli alberi binari di ricerca sono molto meglio(soprattutto per il discorso prefissi), io infatti usero un albero per gli automi in cui ogni nodo è in realta' un puntatore ad una struttura dati che contiene i dati satellite necessari.
Altra cosa: ha detto che normalmente è difficile che si riesca ad ottenere che tutte le funzioni siano efficienti,ad esempio se devo fare una ricerca su un dato dell' albero che non è chiave ma dato satellite, mi dovro' scorrere tutto l' albero come se fosse una lista(ovv. ineficiente) pero' mi ha fatto trapelare l' idea che andrebbe bene lo stesso ai fini del progetto... certo se si riesce ad ottimizzare tutto è molto meglio.
PS. Se qualcuno potesse andare a lezione dal prof. Aguzzoli e chiedergli qualche dritta...io ho gia' dato e tra l' altro oggi non posso andare. |
LoneWolf |
Originally posted by p2p
secondo me basta leggere carattere per carattere il nome,una volta che si termina di leggere si sa quanto è grossa la stringa e quindi la si memorizza normalmente in un array.
Ieri sono andato a lezione dal prof. Fiorentini e proprio lui mi ha detto che basta fare cosi; NON ha parlato pero' di array, mi ha solo detto che basta leggere carattere per carattere e che una volta che si conoscono le dimensioni allocare e memorizzare... pero' l array a quel punto si puo' usare secondo me, anche perchè il C non permette di creare qualcosa di cui non si conoscano le dimensioni...
Ma secondo te, mentre leggi carattere per carattere, questi dove li vai a mettere, se non hai ancora creato l'array? |
LoneWolf |
Volevo aggiungere che inizialmente avevo pensato di scrivere char per char in un riga di un file, poi leggere la riga una volta che l'input da tastiera per la corrente istruzione e' finito.
Chiedendo a mio fratello mi ha detto che lui aveva fatto una lista di char.
Off-Topic: Scusate, ho trovato la edit solo ora, altrimenti avrei editato il precedente messaggio. |
p2p |
Originally posted by LoneWolf
Ma secondo te, mentre leggi carattere per carattere, questi dove li vai a mettere, se non hai ancora creato l'array? leggi la lezione 9 di Aguzzoli le ultime pagine, cè un programma di esempio che parte pa pag.26 dove "L’elenco delle parole viene memorizzato in un array di stringhe
allocato dinamicamente."
potrebbe andare no? |
Teju |
Originally posted by Dante
scanf ( "%d%d %c %s", &x,&y,&d,n);
e lo stampi così:
printf("\nx= %d, y= %d, d= %c, n= %s", x, y, d, n);
Ho provato, funziona.... più o meno.... nel senso che con input corti è perfetto, ma prova a inserire un numero lungo: a me si chiude male l'applicazione, da errore.... :? Perchè???????
Mi auto quoto! Ora funziona, mi sa che aveva compilato male il GCC! :D |
Dante |
già, caspio! è vero... cmq a me da errore quando termino il progrmamma con la f... bah... compilatori del cacchio... nn lo so... ci penso... se qlcn lo sa lo dica... |
LoneWolf |
Originally posted by p2p
leggi la lezione 9 di Aguzzoli le ultime pagine, cè un programma di esempio che parte pa pag.26 dove "L’elenco delle parole viene memorizzato in un array di stringhe
allocato dinamicamente."
potrebbe andare no?
Non lo so, hai provato a farlo?
Comunque gli altri hanno suggerito una soluzione che sembra funzionare. |
LoneWolf |
Se siete in Silab e volete fare due chiacchiere sul progetto, io e Teju siamo in SILAB, vicino all'aula Delta, nell'angolo verso il cortile interno.
Ci riconoscete vedendo i manuali di C tutt'attorno. |
joe.satriani |
scusate ragazzi, ma per fare l'appello di torelli non è indispensabile fare lo scritto, vero? |
andrea |
No, con Torelli no. |
luca8684 |
Col torelli c'è solo l'orale dopo il progetto!!
Originally posted by joe.satriani
scusate ragazzi, ma per fare l'appello di torelli non è indispensabile fare lo scritto, vero? |
andrea |
ciao ragazzi,
ho scritto anche io a Fiorentini per chiedergli se la stringa dell'automa poteva essere limitata da una dimensione massima. Questa è la risposta:
...
La specifica dice che il nome e' una sequenza finita.
La frase ha un'unica interpretazione, ossia (come e' poi scritto
esplicitamente) il nome e' una sequenza di 0 e di 1
di lunghezza n>=1 non definita a priori
...
A questo punto mi pare chiaro che non si può usare la scanf con array. Credo proprio che le stringhe vadano gestite con la getchar. |
Teju |
Originally posted by andrea
Credo proprio che le stringhe vadano gestite con la getchar.
Ok, lì ci siamo: dunque van salvate in una lista di char i vari caratteri del nome... oppure no? |
andrea |
Sì, credo proprio che l'unica strada sia questa. Anche se diventa veramente tutto molto macchinoso. |
p2p |
Originally posted by Teju
Ok, lì ci siamo: dunque van salvate in una lista di char i vari caratteri del nome... oppure no? scsate se mi ripeto, ma sopra avevo detto che lo stesso Fiorentini mi ha detto di leggere carattere per carattere e che una volta finito sappiamo la dimensione per memorizzare il nome....
quindi secondo me come l esempio che avevo riportato prima, cioe' alloco tot spazio e continuo a leggere se vedo che non mi basta uso un realloc(), alla fine sapro' quanto spazio mi serve per aggiungere sto automa allastruttura che uso...
almeno credo, adesso vado a lezione,stasera lo provo e vi faccio sapere
ciao |
mitnik |
io provo così: leggo l'input e il nome dell'automa lo metto in un array tipo:
char nome[N]; con N che indica la massima lunghezza che può avere il nome; lo so che non è definita però è finita quindi N lo si può porre anche molto grande.
poi uso strlen e strcpy per sapere la lunghezza del nome e allocare quindi lo spaxio necessario ad un array di char che contiene il nome dell'automa. |
Teju |
Originally posted by p2p
realloc()
Cioè mi vuoi dire che se dichiaro un array di dimensione N definito, posso, tramite la realloc, aumentare lo spazio disponibile??
Come si usa questa funzione? |
andrea |
mitnik, credo che non possa fare come tu dici, perchè N può essere grande finchè vuoi, ma è pur sempre limitato |
Freddy3 |
Originally posted by p2p
leggi la lezione 9 di Aguzzoli le ultime pagine, cè un programma di esempio che parte pa pag.26 dove "L’elenco delle parole viene memorizzato in un array di stringhe
allocato dinamicamente."
potrebbe andare no?
quale lezione dici? quella del 16 dicembre? |
mitnik |
ma scusa il testo dice: ogni automa è identificato da un nome che è una stringa finita sull'alfabeto (0,1)....
...La sorgente remota può emettere segnali rappresentati da stringhe finite del tio a,B..
allora pongo per esempio N=65536; tale valore dovrebbe essere abbastanza grande. Certo la stringa potra essere più lunga ma non infinitamente lunga. che dici? |
andrea |
Anche io avevo interpretato così, ho chiesto a fiorentini che mi ha risposto che non va bene. La stringa è finita, ma non c'è limite superiore. Leggi la sua mail di risposta che ho postato qualche messaggio fa. |
Freddy3 |
ideina:-D :
se facciamo leggere la stringa e la memorizziamo in un puntatore a char (come diceva dante) e poi dichiariamo un array di dimensione di quello che è puntato da questo puntatore e ce lo copiamo dentro?
potrebbe funzionare!!! :? |
andrea |
Non credo, perchè con un puntatore a char puoi leggere solo un char. Come fai a capire dove finisce la stringa che hai letto? |
mitnik |
sia utilizzando i puntatori a char sia utilizzando altri metodi come per esempio la lettura con getchar è necessario allocare dello spazio in memoria per contenere il tutto. Per fare cio è necessario dare una dimensione finita (considerato anche che la memoria lo è). Quindi io penso di proseguire con la mia idea di allocare uno spazio in memoria di supporto per contenere la stringa; poi in base alle dimensioni di questa alloco spazio definitivo per contenere il bone dell'automa, liberando quello utilizzato come supporto. Non sarà sicuramente il metoso più corretto ma sinceramente non trovo altre soluzioni per poter esaminare una stringa di lunghezza arbitraria. Se continup a sbattere la testa su questo problema il 30 gennaio sarò qui ancora a pensare a come e dove memorizzare una cazzo di stringa. |
andrea |
Scusa, mitnik, ma non è più semplice se allochi lo spazio in memoria elemento per elemento della lista invece che allocare all'inizio lo spazio di una lista intera? Mi spiego: se fai un ciclo sulla getchar, ti arriva il carattere, a questo punto allochi il nodo e lo inserisci nella lista. Poi vai a leggere il carattere successivo, allochi il nodo e lo inserisci. Continui così fino a quando il carattere non è un new line. |
Skilotto83 |
Originally posted by andrea
Scusa, mitnik, ma non è più semplice se allochi lo spazio in memoria elemento per elemento della lista invece che allocare all'inizio lo spazio di una lista intera? Mi spiego: se fai un ciclo sulla getchar, ti arriva il carattere, a questo punto allochi il nodo e lo inserisci nella lista. Poi vai a leggere il carattere successivo, allochi il nodo e lo inserisci. Continui così fino a quando il carattere non è un new line.
infatti sekondo me questo è il metodo corretto..
essendo in un while è potenzialmente infinita la stringa... |
mitnik |
ok questo modo è giustissimo però cio vuol dire che utilizzi una lista per contenere ogni nome dell'automa? ad ogni elemento della lista corrisponde un carattere?
Potrebbe essere giusto ma considera che probabilmente del nome di un automa utilizzerai solo i primi caratteri pre verificare che un segnale influenzi un automa, quindi parte della lista non verrà mai usata e questo è uno spreco doppio rispetto all'utilizzo di un puntatore ad un array di char |
joe.satriani |
qualcuno mi sa indicare un buon editor magari da scaricare? |
Dav83 |
qualcuno ha idea di come si faccia a verificare la presenza di un prefisso nel campo char *nome della struttura di automa???
Una buona soluzione strutturale potrebbe essere quella degli alberi binari sia per automi che per ostacoli...a proposito ci dovrebbe essere da qualche parte nella sezione Filez il progetto Banchetto. ALtrimenti sulla pagina di fiorentini la lezione 12 ci può aiutare! |
mitnik |
quindi tu Andrea utilizzi una lista anche per contenere il segnale dato in ingresso? |
andrea |
uso la lista per prendere il parametro in input (la stringa binaria), ma poi secondo me mantenere una lista per ogni automa è troppo. Bisogna pensare a qualcosa di diverso. |
mitnik |
so potrebbe leggere l'input e metterlo in una stringa, contare gli elementi, allocare lo spazio per un array di char (relativo all'automa inserito ) copiare il cotenuto della lista in tale array, svuotare la lista. E' un po lungo ma effettivamente si può inserire una stringa di qualsiasi dimensione.
Il problema rimane esaminare in modo corretto il segnale. avete qualche idea? |
LoneWolf |
Originally posted by Dav83
qualcuno ha idea di come si faccia a verificare la presenza di un prefisso nel campo char *nome della struttura di automa???
Una buona soluzione strutturale potrebbe essere quella degli alberi binari sia per automi che per ostacoli...a proposito ci dovrebbe essere da qualche parte nella sezione Filez il progetto Banchetto. ALtrimenti sulla pagina di fiorentini la lezione 12 ci può aiutare!
Puoi mettere in AND il prefisso e il nome dell'automa, considerando nel risultato soltanto un numero di bit pari alla lunghezza del prefisso.
Se sono tutti 1 il prefisso è contenuto nell'automa. |
andrea |
non credo proprio in AND (0 AND 0 fa 0, non 1). Magari in EXOR per vedere i bit diversi e quelli uguali. |
LoneWolf |
Originally posted by andrea
non credo proprio in AND (0 AND 0 fa 0, non 1). Magari in EXOR per vedere i bit diversi e quelli uguali.
Hai ragione anche tu, ma non essendo arrivato ancora a quel punto non avevo approfondito l'idea.:-o
Comunque la strada a mio parere è quella. |
dirkpitt |
Qualcuno sa cosa significa questo messaggio di errore che compare all'atto della compilazione:
C:/Programmi/cs1300/bin/../lib/gcc-lib/mingw32/3.3.1/../../../libmingw32.a(main.o)(.text+0x97):main.c: undefined reference to `WinMain@16'
:? :? :?
Edit:
--> PROBLEMA RISOLTO... nel file non è presente la funzione main... cosa normale visto che lo uso semplicemente come file contentente l'implementazione della lista... |
LoneWolf |
Originally posted by dirkpitt
Qualcuno sa cosa significa questo messaggio di errore che compare all'atto della compilazione:
C:/Programmi/cs1300/bin/../lib/gcc-lib/mingw32/3.3.1/../../../libmingw32.a(main.o)(.text+0x97):main.c: undefined reference to `WinMain@16'
:? :? :?
Guarda, ieri sera mi è saltato fuori un errore del genere; non ricordo che errore avessi fatto di preciso, comunque era qualcosa del tipo errore di sintassi, punto e virgola saltato o simili. |
LoneWolf |
Ragazzi, qualcuno ha avuto come me e Teju la malsana idea di utilizzare gli alberi?
Abbiamo trovato due implementazioni differenti di alberi che potrebbero andare bene.
Altro quesito: ricordate se a lezione hanno sconsigliato l'utilizzo degli alberi radicati con un numero illimitato di figli (pagina 201 di Introduzione agli Algoritmi)? |
mitnik |
ma avete risolto il problema della lettura dell'input? come suddividete per esempio il comando
a 12 6 N 010101
dove memorizzate il tutto? |
Teju |
Io invece pensavo ad un albero binario in cui ho un nodo e il figlio sinistro è un automa di nome più lungo con almeno uno 0 dopo il nome del nodo padre e con un 1 il figlio destro...
NON occupo ovviamente tutto l'albero, ma purtroppo alcuni nodi vuoti mi capiteranno....
PHP:
-------------------------- 000n -------------------------------------
------------------- 0000a --- 000111111111a -----------------
dove c'è a = è un automa, n = non è un automa |
dirkpitt |
Una domanda forse stupida, ma che è meglio avere capito chiaramente. Il rettangolo R(x0,y0,x1,y1) che rappresenta un ostacolo, graficamente è così:
----------------------- (x1,y1)
| |
| |
(x0,y0) -----------------------
vero? Cioè, le coordinate rappresentano i vertici giusti o l'avete interpretato in un modo differente?
Edit:
cavolo, esce uno schifo. In parole povere, il punto (x0,y0) equivale al vertice in basso a sinistra del rettangolo e il punto (x1,y1) equivale a quello in alto a destra, giusto? |
LoneWolf |
x0,y0 indicano l'angolo in basso a sinistra del rettangolo, x1,y1 l'angolo in alto a destra, proprio come hai detto tu. |
Dav83 |
si dovrebbe essere proprio così...
per quanto riguarda l'input io memorizzo la riga di comando in un vettore [512]. Se controllate l'input non può essere più lungo di 330 e spiccioli caratteri...dopodichè ho trovato un funzione strtok che separa i caratteri letti con gli spazi e li memorizzo... |
LoneWolf |
Originally posted by Dav83
si dovrebbe essere proprio così...
per quanto riguarda l'input io memorizzo la riga di comando in un vettore [512]. Se controllate l'input non può essere più lungo di 330 e spiccioli caratteri...dopodichè ho trovato un funzione strtok che separa i caratteri letti con gli spazi e li memorizzo...
Scusa, ma così poni un limite massimo alla lunghezza della stringa letta da tastiera, e quindi alla lunghezza del nome (prefisso) dell'automa e alle operazioni di movimento.
Pur essendoci un limite di sistema come hai detto tu, il prof vuole che non lo si consideri... |
p2p |
Originally posted by LoneWolf
Ragazzi, qualcuno ha avuto come me e Teju la malsana idea di utilizzare gli alberi?
Abbiamo trovato due implementazioni differenti di alberi che potrebbero andare bene.
Altro quesito: ricordate se a lezione hanno sconsigliato l'utilizzo degli alberi radicati con un numero illimitato di figli (pagina 201 di Introduzione agli Algoritmi)?
Io sto facendomi qualche conto ancora, e sto valutando le seguenti alternative:
1)Albero binario di ricerca con una funzione che ad ogni inserimento/cancellazione mi verifica se l' albero è bilanciato in altezza, se si ok se no, lo bilancia;
2)Alberi RB, che sinceramente vorrei evitare...
3)B-alberi
ancora sto cercando di capire quale di queste potrebbe essere la migliore... |
joe.satriani |
per quel che riguarda le stringhe io (anche se con pochi esempi) non ho problemi a dichiararle char *n e a scorrerle con cicli del tipo:
for(k = 0;k != strlen(n);k++){
printf("%c\n", n[k]);
}*/
la mia idea per quanto riguarda la struttura degli automi è di utilizzare una lista ordinata lessicograficamente (con la funzione strcmp(s1, s2) )anche se si parla solo di uni e zeri. questo mi consente di avere una lista che ha i nomi con uno stesso prefisso tutti consecutivi.
qualcuno mi sa dare un straccio di codice per inserimento ordinato in lista uni-direzionale? |
LoneWolf |
Originally posted by p2p
Io sto facendomi qualche conto ancora, e sto valutando le seguenti alternative:
1)Albero binario di ricerca con una funzione che ad ogni inserimento/cancellazione mi verifica se l' albero è bilanciato in altezza, se si ok se no, lo bilancia;
2)Alberi RB, che sinceramente vorrei evitare...
3)B-alberi
ancora sto cercando di capire quale di queste potrebbe essere la migliore...
1) Ad ogni inserimento però devi controllare l'albero e se è sbilanciato ribilanciarlo, che ti costa parecchio tempo di calcolo, soprattutto su input molto grandi (tanti automi).
2) :sbocco: Che sbattimento!
3) Un B-albero si avvicina molto alla struttura a cui ho pensato io, cioé nodi con più figli, ma senza tenere i puntatori a ciascun figlio... |
p2p |
Originally posted by LoneWolf
1) Ad ogni inserimento però devi controllare l'albero e se è sbilanciato ribilanciarlo, che ti costa parecchio tempo di calcolo, soprattutto su input molto grandi (tanti automi).
2) :sbocco: Che sbattimento!
3) Un B-albero si avvicina molto alla struttura a cui ho pensato io, cioé nodi con più figli, ma senza tenere i puntatori a ciascun figlio...
1) Si infatti tale operazione richiede tempo lineare alle dimensioni dell' albero(che se l' albero è piccolo non andrebbe neanche male...ma se è grande non va bene), ma,se non erro, puo' addirittura diventare quadratico,nel caso incui inserisco una sequenza di chiavi tra due bilanciamenti....;scartato!
2)Quoto!!!
3)mi concentro su questo. |
p2p |
stavo valutando i costi di un po' tutto quello che possiamo usare, e ho letto su un libro(non il nostro di testo)un interessante paragone tra alberi bin, alberi bin con inserimento allar adice,alberi randomizzati,RB alberi e tanti altri...
risultato:gli RB sono in asoluto i piu' performanti...
azz... |
LoneWolf |
Originally posted by joe.satriani
per quel che riguarda le stringhe io (anche se con pochi esempi) non ho problemi a dichiararle char *n e a scorrerle con cicli del tipo:
for(k = 0;k != strlen(n);k++){
printf("%c\n", n[k]);
}
Scusa, ma io continuo a non capire come si possa implementare una lettura da tastiera simile; all'n che hai scritto tu devi dare per forza un valore, limitando quindi l'input.
Peraltro, devi prima allocare memoria per scrivere i char che ricevi da tastiera, e controllare di non averla esaurita se stai ancora leggendo, nel qual caso devi allocarne altra. |
LoneWolf |
Originally posted by p2p
stavo valutando i costi di un po' tutto quello che possiamo usare, e ho letto su un libro(non il nostro di testo)un interessante paragone tra alberi bin, alberi bin con inserimento allar adice,alberi randomizzati,RB alberi e tanti altri...
risultato:gli RB sono in asoluto i piu' performanti...
azz...
In assoluto sono anche i più difficili da implementare!
:sbocco:
Comunque stasera mi rileggo la teoria sugli RB-alberi e valuto se abbandonare i B-alberi moddati che avevo pensato di utilizzare. |
p2p |
Originally posted by LoneWolf
In assoluto sono anche i più difficili da implementare!
:sbocco:
Comunque stasera mi rileggo la teoria sugli RB-alberi e valuto se abbandonare i B-alberi moddati che avevo pensato di utilizzare.
Si si concordo con te che sono un casino... infatti stavo valutando anche altro, ad esempio ho guardato gli alberi randomizzati,che comunque sembra garantiscano prestazioni medie molto buone, non credo che se mi faccio il culo sugli RB avro' un voto molto piu' alto che se implementassi un albero randomizzato o un B-albero fatto bene... quindi.. |
marchinkus |
partendo dall'input " N20W40": come diavolo fate a suddividere il primo comando N20 dal secondo W40?????????? |
marchinkus |
se non risolvete il problema del segnale, è inutile partire in quarta pensando già alle strutture da implementare...non farete molta strada |
p2p |
Originally posted by marchinkus
partendo dall'input " N20W40": come diavolo fate a suddividere il primo comando N20 dal secondo W40??????????
non so ma intuitivamente divido i numeri dalle lettere... |
Teju |
Originally posted by p2p
non so ma intuitivamente divido i numeri dalle lettere...
io ho provato con la doppia scanf (prima su un char e poi su un int) in un ciclo fino a fine riga, ma mi da ancora qualche piccolo problemino, ma lo risolverò! :D
Altrimenti lo si legge come stringa e lo si scorre cercando se il contenuto è carattere o numero e fare un po' di moltiplicazioni per 10 dei numeri se i successivi sono ancora numeri....
Ma te l'ho detto, queste sono idee buttate giù veloci, avevo altri problemi prima da risolvere! :D :D |
p2p |
scusate, ma voi alla crea() le fate inizializzare la struttura che conterra gli automi?o le fate fare altro? |
Teju |
Originally posted by p2p
scusate, ma voi alla crea() le fate inizializzare la struttura che conterra gli automi?o le fate fare altro?
Io credo debba inizializzare anche la struttura degli ostacoli, no? |
p2p |
Originally posted by Teju
Io credo debba inizializzare anche la struttura degli ostacoli, no?
si... anche secondo me....
ancora una cosina... voi come vi state organizzando con i file? nel senso, state facendo un file unico con funzioni, main ecc... o fate dei file.h che importate....?
EDIT. guardando qualche vecchio progetto sono effettivamente tutti in un file... va beh faro' cosi anch io ma era solo per avere un ordine migliore... |
Teju |
Piccola curiosità...
Il dato "direzione" dentro l'automa serve solamente se il segnale comincia per "A" oppure se direzione=W segnale=E11 conto come un movimento il cambiare da W a E?!? |
andrea |
Teju, non ho capito bene la domanda...
Io ne ho una: ma l'output a video deve apparire quando si digita f per la fine dei comandi o subito dopo che si dà un comando p? |
Teju |
Originally posted by andrea
Teju, non ho capito bene la domanda...
Esempio pratico: ho l'automa 001 con x=1 y=2 D=W.
Arriva il segnale "s 00 E23".
Devo muovermi verso E per 23 oppure il fatto che cambia W in E mi fa perdere un passaggio, dunque mi devo muovere a E di 22?? E' più chiara così?
Originally posted by andrea
Io ne ho una: ma l'output a video deve apparire quando si digita f per la fine dei comandi o subito dopo che si dà un comando p?
Bel quesito... :D Prova a chiederlo a Fiorentini, magari ti risponde in maniera più simpatica che a LoneWolf! :D |
andrea |
Sì, è più chiara. Onestamente non saprei, forse facendo i conti dell'esmpio fatto da lui nel test del progetto si riesce a capire. Stasera ci provo. |
p2p |
Originally posted by Teju
Esempio pratico: ho l'automa 001 con x=1 y=2 D=W.
Arriva il segnale "s 00 E23".
Devo muovermi verso E per 23 oppure il fatto che cambia W in E mi fa perdere un passaggio, dunque mi devo muovere a E di 22?? E' più chiara così?
secondo me devi muoverti di 23;guarda l' esempio a pag4 se noti l' automa 010 è 12 3 N , + sotto cè il 1° comando,cioe' s 01 A3, poi ancora stampa (p 0) se vai a vedere l' output vedrai 010: 12, 6, N
Originally posted by andrea
Io ne ho una: ma l'output a video deve apparire quando si digita f per la fine dei comandi o subito dopo che si dà un comando p?
secondo me subito dopo ogni comando va eseguita l' azione corrispondente(pag 3 "Quando una linea è letta, viene eseguita l' operazione associata: ...") |
LoneWolf |
X Teju:
Credo che ci si perda uno spostamento solo se il cambio di direzione avviene in movimento, non se cambia da fermo.
X andrea:
L'output viene generato solo dall'operazione p, quando inserisci f il programma si interrompe senza output.
X p2p:
Nella crea() devi svuotare/inizializzare tutte le strutture dati che utilizzi per organizzare il piano, gli automi e gli ostacoli; ovviamente, saranno vuote, quindi avrai dei puntatori a NULL. |
p2p |
scusate se ripeto la domanda... ma voi inserite tutto in un unico file o suddividete? |
andrea |
a me non piace tanto, ma io inserisco tutto in un solo file, mi pare che il testo parli di due files, uno il programma e l'altro la relazione |
mitnik |
come avete risolto la divisione della stringa in input segnale? (tipo s 1001 N10S4)
mi dareste qualche indicazione
grazie |
joe.satriani |
ragazzi, ma voi che strutture state usando visto che le liste sono le più sconsigliate? |
andrea |
visto che la cosa ha lasciato parecchi dubbi a tutti, io gestisco le stringhe i cui parametri hanno formati diversi con la getchar. Prendo un carattere alla volta, lo metto in una lista. Quando c'è uno spazio significa che il parametro è terminato. Questa cosa dovrebbe consentire, se uno vuole, di fare tutti i controlli che si vogliono (anche se non sono richiesti) sulle stringhe in input. |
p2p |
Originally posted by joe.satriani
ragazzi, ma voi che strutture state usando visto che le liste sono le più sconsigliate?
io sto usando un RB albero per gli automi e penso usero' una lista per gli ostacoli... è vero che la lista non è efficiente,xò gia' mi sto faceno un mazzo per cercar di tirar fuori qualcosa dall rb, figuriamoci mettersi ad usare tabelle hash o altro...non vorrei incasinarmi piu' di quello che son gia' :) |
joe.satriani |
ma il problema è che se si vuole sapere se un punto è in uno o più ostacoli bisogna valutarli tutti, o quasi perche io credo che si possono non considerare solo ostacoli completamente inclusi in altri che credo sia un caso molto raro... |
LoneWolf |
Un dubbio tremendo mi attanaglia: sto scrivendo lo pseudo codice dell'operazione posizione().
Ho notato che nell'esempio del progetto l'output è ordinato in base al nome dell'automa; il problema è che se usiamo una lista per gli automi è ovvio che ci verranno ordinati in output, ma se utilizziamo un albero (di qualsiasi tipo) non lo saranno.
Per cui, l'output deve essere ordinato?
Se si, è un invito implicito ad usare le liste o un ennesimo tentativo di incasinarci la vita? |
LoneWolf |
Originally posted by p2p
io sto usando un RB albero per gli automi [...]
Non so se considerarti un temerario o un folle!:D |
LoneWolf |
Originally posted by joe.satriani
ma il problema è che se si vuole sapere se un punto è in uno o più ostacoli bisogna valutarli tutti, o quasi perche io credo che si possono non considerare solo ostacoli completamente inclusi in altri che credo sia un caso molto raro...
E' una situazione talmente rara che non la considero nemmeno, inoltre è possibile che ti venga richiesto di rimuovere un ostacolo grande, pur mantenendo il piccolo.
Io scorro tutta la lista di ostacoli alla ricerca di almeno uno che contenga l'automa, nel qual caso non creo l'automa. |
LazerPhEa |
Mah... io seguirei il consiglio di Torak... provate il prossimo appello! :D :D
:ciaoo: |
LoneWolf |
Originally posted by LazerPhEa
Mah... io seguirei il consiglio di Torak... provate il prossimo appello! :D :D
:ciaoo:
Aveva ragione la tua tipa, sei troppo irritante!:D :D :D
:ciaoo: Paolo! |
p2p |
Originally posted by LoneWolf
Non so se considerarti un temerario o un folle!:D
un folle :)
guarda, se non riesco, uso un albero binario di ricerca con una funzione per ribilanciarlo ad ogni cancellazione/inserimento e pace! + lista x ostacoli ovviamente! |
LoneWolf |
Originally posted by p2p
un folle :)
guarda, se non riesco, uso un albero binario di ricerca con una funzione per ribilanciarlo ad ogni cancellazione/inserimento e pace! + lista x ostacoli ovviamente!
Visto che anche tu stai utilizzando un albero, che mi dici sulla mia domanda dell'ordinamento dell'output? |
LazerPhEa |
Originally posted by LoneWolf
Aveva ragione la tua tipa, sei troppo irritante!:D :D :D
:ciaoo: Paolo!
:asd:
Ok, dai... vi lascio all'ingrato compito! :)
:ciaoo: |
p2p |
Originally posted by LoneWolf
Visto che anche tu stai utilizzando un albero, che mi dici sulla mia domanda dell'ordinamento dell'output?
perchè non vengono ordinati con un albero ? scusa se non mi è chiaro, ma ancora non sono li e devo ancora rivedermi la parte di ricerca ... |
LoneWolf |
Originally posted by p2p
perchè non vengono ordinati con un albero ? scusa se non mi è chiaro, ma ancora non sono li e devo ancora rivedermi la parte di ricerca ...
Immagina l'albero così:
--------- 0 ------------
-- 00 -------- 01 ----
000 001 --- 010 011
Se fai una ricorsiva che attraversa prima il figlio sinistro, poi la radice, infine il figlio destro, l'ordinamento finale sarà:
000
00
001
0
010
01
011
Ovviamente non sono ordinati.
Facciamo pure che il prefisso sia 01, l'output sarà:
010
01
011
L'unico sistema per avere l'output ordinato sarebbe sfogliare ciascun livello dell'albero da sinistra a destra, poi procedere al livello successivo.
Che ne dici? |
LoneWolf |
Se invece ordini nel seguente modo:
radice->figlio sinistro->figlio destro, l'output è:
0
00
000
001
01
010
011
No, in effetti così i conti tornano...:shock:
Mi sono fatto ingannare dalla lunghezza delle stringhe!
OK, parte il coro!
Poro poro poro poro poroporopopo figur de ...!
X Teju: Per caso hai già scritto al prof? :oops: |
p2p |
Originally posted by LoneWolf
Immagina l'albero così:
--------- 0 ------------
-- 00 -------- 01 ----
000 001 --- 010 011
Se fai una ricorsiva che attraversa prima il figlio sinistro, poi la radice, infine il figlio destro, l'ordinamento finale sarà:
000
00
001
0
010
01
011
Ovviamente non sono ordinati.
Facciamo pure che il prefisso sia 01, l'output sarà:
010
01
011
L'unico sistema per avere l'output ordinato sarebbe sfogliare ciascun livello dell'albero da sinistra a destra, poi procedere al livello successivo.
Che ne dici?
capito... ma con un ordine anticipato(sottoalbero sinistro,redice,sottoalbero destro) mi pare venga ordinato, no?
EDIT: ho visto adesso che ti eri gia' risposto... |
LoneWolf |
Originally posted by p2p
capito... ma con un ordine anticipato(sottoalbero sinistro,redice,sottoalbero destro) mi pare venga ordinato, no?
EDIT: ho visto adesso che ti eri gia' risposto...
Con l'ordine anticipato non viene.
Viene con radice, sottoalbero sinistro, sottoalbero destro.
Off-Topic: Sto cominciando a fondere e dico scemenze! :D |
Teju |
Originally posted by LoneWolf
Off-Topic: Sto cominciando a fondere e dico scemenze! :D
A dire il vero al telefono mi avevi quasi pure convinto xkè non avendo sotto il disegno non riuscivo a immaginarmelo bene, ma dunque, alla luce di tutto ciò, dico che l'albero binario è la soluzione migliore! :D :D |
LoneWolf |
Originally posted by Teju
A dire il vero al telefono mi avevi quasi pure convinto xkè non avendo sotto il disegno non riuscivo a immaginarmelo bene, ma dunque, alla luce di tutto ciò, dico che l'albero binario è la soluzione migliore! :D :D
Anche il mio B-albero funziona alla grande, solo che non me n'ero accorto! :D |
andrea |
Ho scritto a Fiorentini per essere sicuro di quando produrre l'output del comando p. Posto la risposta:
"
come scritto nel testo, ogni comando va eseguito subito dopo essere
stato letto da standard input (e quindi prima di leggere il successivo
comando)
Percio', subito dopo la lettura letto
p ...
deve essere stampato il corrispondente output (nell'esempio a pag. 5 le
righe su standard output sono riportate una di seguito all'altra)
"
questa cosa è chiarita. |
|
|
|
|