Potete fare domande con la form
in fondo.
Vi prego di postare gli eventuali
OffTopic nella loro pagina
(o di iniziarli qui ma poi di spostarvi in quella).
Lettura del file: leggiTokens(...)
Professore, ho notato che la funzione fscanf(...), con il formato %f, non legge un valore double dal file, bensí restituisce nella variabile 0.0000000...com'e' possibile? Ma soprattutto: come si puó ovviare a questo.....ed anche: Ho capito bene com'e' formattato il file??? GRAZIE!!!
-- Comment added by
DavidBenedetti on 29 Apr 2005
Ricerca dei 20 token piú distanti da 0.5
Professore, quando dice di "ricercare i 20 token DIVERSI il cui peso Wi dista maggiormente dal valore 0.5", vuol dire che possiamo decidere noi se considerare solo quelli che distano da 0.5 (TUTTI) in eccesso o (TUTTI) in difetto oppure ho capito male??? GRAZIE!!!
-- Comment added by
DavidBenedetti on 29 Apr 2005
Come lanci la fscanf? Prova (solo per fare un esempio) a lanciarla nel formato di lettura %s%f così sei sicuro che venga saltata la stringa che sta davanti al numero. Per quanto riguarda la ricerca dei token penso tu debba considerare quelli più distanti fregandotene se in eccesso o in difetto. Tra un 0.1 e un 0.8 prendi 0.1, che ti frega se sta in difetto? In bocca al lupo
-- Comment added by
MassimilianoNatale on 29 Apr 2005
Struct dizionario ed il parametro dimensioni
Da quanto ho capito la struttura dizionario va implementata tramite hashtable. Ma il parametro dimensioni (che indica il numero di elementi che la tabella può contenere) non dà alcuna informazione sul numero di buckets che la tabella hash deve avere. Possiamo scegliere un valore arbitrario oppure c'è specifica a cui attenerci?
-- Comment added by
MassimilianoNatale on 29 Apr 2005
Ricerca dei 20 token piú distanti da 0.5
Ti guardi token per token poi prendi i venti cho o sono più vicini a 1 o sono più vicini a 0...se hai 40 token sui 0,8-0.9 e tre a 0.3 sicuramente i venti che devi prendere saranno quelli tra 0.8 e 0.9...in eccesso (0.5 in su) = Token spam...in difetto (0.5 in giù) =token Ham...ora non ricordo come considerare il caso 0.5 (o non è stato detto)
-- Comment added by
AlessandroGrottoli on 29 Apr 2005
20 tokens più distanti....
O io sono sempre più distante da 'sti 20 token???
-- Comment added by
DavidBenedetti on 29 Apr 2005
Stricmp o strcmp ???
Professore, ma l'errore di DOUBLE_KEY_FOUND dobbiamo ritornarlo secondo il criterio del "case sensitive" o del "case not sensitive"???
-- Comment added by
DavidBenedetti on 30 Apr 2005
tabella hash o albero di ricerca???
David tu che usi tra queste due possibilità???
io l'ho fatte entrambe e penso che l'albero di ricerca sia mille volte più semplice e menu lungo da implementare, soprattutto perchè tanto non dobbiamo fare la funzione delete() che è l'unica cosa un pò più complicata!!tu che ne pensi??
-- Comment added by
TizianoFranchi on 30 Apr 2005
a che serve il parametro "dimensioni"?
Ragazzi, un dubbio che mi ha assalito è questo:
Nel momento in cui faccio il dizionario di ricerca (che è più facile da implementare ma ha un costo computazionale maggiore, dettaglio che però nel nostro caso è poco importante, dato che non credo si arriverà a milioni di parole memorizzate...questa valeva come opinione per la domanda di Tiziano) a cosa mi serve il paramentro "dimensioni"? Una delle cose utili del dizionario è che è dinamico, quindi i pezzi vengono aggiunti a destra o a sinistra a seconda di quante parole ci sono...come faccio a dare una dimensione ad una struttura che di suo non ne ha?
-- Comment added by
EnricoMontesi on 30 Apr 2005
funzione nuovoDizionario(int dimensione);
l'intero dimensione è il numero di chiavi che può contenere il dizionario giusto?
-- Comment added by
TizianoFranchi on 30 Apr 2005
dimensione
Sono pienamente d'accordo con te...:)
-- Comment added by
TizianoFranchi on 30 Apr 2005
dimensione
E comunque vale anche per l'hash table..non ha proprio senso!!!!a sto punto lo faccio col vettore no???
-- Comment added by
TizianoFranchi on 30 Apr 2005
dimensione
Peccato ke, a differenza del vettore, l'albero binario di ricerca sia più veloce nella ricerca e nell'inserimento Tiziano!Soprattutto x grandi dimensioni!!!Ma, a parte questo dettaglio, anke x me il parametro dimensione non ha molto senso...cmq io l'ho implementato ugualmente così: io fisso all'inizio la dimensione massima (e cioè il numero massimo di chiavi che può contenere appunto il dizionario) e poi eseguo il conteggio degli elementi man mano che li inserisco. Nel momento in cui voglio inserire un altro elemento, ma mi rendo conto che il dizionario ha raggiunto il suo massimo, lancio un'eccezione di TABLE_FULL!!!
-- Comment added by
DavidBenedetti on 30 Apr 2005
nuovoDizionario()
allora questa funzione che mi restituisce??se il dizionario lo crei mano a mano nell'inserisciValore().(Per quanto riguarda l'albero di ricerca)..mentre se usi l'hash table può ritornare appunto il puntatore all'hash table giusto?
-- Comment added by
TizianoFranchi on 30 Apr 2005
dimensione
Basta prevedere un campo int size nella struct dizionario, e incrementarlo nella insert!
-- Comment added by
GabrieleTarantino on 30 Apr 2005
nuovoDizionario(...)
Ricordi le lezioni del caro buon "vecchio" professor Tronci Tiziano??? Se tu definisci una struttura nodo per l'albero e poi una struttura dizionario (un handler) che abbia al suo interno il puntatore alla radice dell'albero (e cioè ad un suo nodo di fatto) hai la risposta alla tua domanda? E cioè questa funzione creerà un handler al dizionario (naturalmente un puntatore ad esso) avendone inizializzato i suoi membri...ad esempio, come diceva giustamente Gabriele, il campo dimensione con le dimensioni ke desideri tu, e il numero di elementi contenuti a 0 (x il momento!!!)
-- Comment added by
DavidBenedetti on 30 Apr 2005
Senza titolo?
"...(e cioè ad un suo nodo di fatto) hai la risposta alla tua domanda?..." Sorry, qui il ? non ci andava!!!
-- Comment added by
DavidBenedetti on 30 Apr 2005
Risposte
RE: Ricerca dei 20 token piú distanti da 0.5
Usate il valore assoluto (abs) prima di ordinarli.
RE: Struct dizionario ed il parametro dimensioni
Fate vobis, potete ad esempio usare una funzione che dipende dalle dimensioni fornite.
RE: Stricmp o strcmp ???
Stavolta il confronto è CASE SENSITIVE.
RE: a che serve il parametro "dimensioni"?
a dire quanti elementi ci sono dentro al massimo.
-- Comment added by
AndreaSterbini on 30 Apr 2005
Ricerca dei 20 token più distanti da 0.5
Professore, non ho ben capito la risposta...Cioè, ho capito quello ke intende, ma non sono riuscito a trovare la risposta alla mia domanda...Io kiedevo: dobbiamo seguire un qualche particolare criterio per selezionare i 20 token in questione, oppure (una volta ordinati per peso) possiamo sceglierli a nostro piacimento? Ad esempio scegliamo, da quello ke pesa di meno (di più), i 20 token successivi (precedenti)?
-- Comment added by
DavidBenedetti on 01 May 2005
ABS(...)
Tra l'altro, mi sembrava di aver capito ke i pesi delle parole variavano da 0.0 a 1.0, e non ke fossero anke negativi!!! (Non ke mi cambi la vita, giusto per kiarimento!)
-- Comment added by
DavidBenedetti on 01 May 2005
Pesi con abs(...)
Quando lei dice che dobbiamo utilizzare la funzione abs di valore assoluto prima di ordinare i token, intende dire che i pesi devono essere memorizzati nei campi già come valori assoluti?
-- Comment added by
DavidBenedetti on 01 May 2005
vi sono mancato...? :-|
ALR back again! (fischi e verdure marce...)
ho iniziato adesso a vedere la bozza, ho sbattuto un po' la testa contro il muro e mi sono fatto il bozzo; le funzioni del modulo le ho finite, non vorrei dire ma questo modulo effettivamente mi sembra *decisamente*---+ facile degli altri due... (ultime parole famose: l'armadietto fu aperto per il modulo 3 ^_^)
ok, allora prima cosa: David, avevi proprio bisogno delle lezioni di Tron C (il nuovo rivoluzionario linguaggio di programmazione, potenziamento dell'ANSI C) per capire quella cosa? seconda: un dizionario, ched'è, un albero binario di ricerca? terza: effettivamente la storia del parametro delle dimensioni merita una bella accigliata con grattatina di tempia... quarta: chi è che libera la memoria allocata da nuovoDizionario? (non mi dite la main... T___T) quinta: David, che ti lanci TABLE_FULL, il C non ha le eccezioni! o_O (non mi dire che il Tron C ce le ha... T______T) e sesta: perché il confronto è case sensitive? se uno spammer scrive "VIAGRA", "ViAgRa" o "viagra" non è da considerarsi sempre la stessa cosa???
-- Comment added by
AlbertoLaRocca on 01 May 2005
x chi implementa l'albero di ricerca:
suggerisco di definire la struct Dizionario come un'unione di due struct: la prima versione contiene dati tipo la dimensione massima e il puntatore alla root, mentre la seconda versione è di fatto un nodo dell'albero contenente puntatore alla chiave, valore e puntatori ai figli; secondo me è la soluzione migliore, visto che alcune funzioni (tipo cercaValore) devono essere ricorsive e come parametro dovrebbero avere un puntatore a un nodo, e invece hanno un puntatore a
struct Dizionario. considerate inoltre che secondo me il dizionario (allocato dalla main) potrà essere liberato solo (dalla main) facendo
free(d), quindi se voi allocate ciascun nodo in spazi separati la free libererà solo la root o quello che è; di conseguenza nuovoDizionario deve allocare uno spazio lineare grande abbastanza da contenere un numero di nodi (opportunamente linkati) pari a
dimensioni.
-- Comment added by
AlbertoLaRocca on 01 May 2005
unione
x "unione" ovviamente intendevo una
union del C, non era un termine generico.
-- Comment added by
AlbertoLaRocca on 01 May 2005
Chiarimenti...
A parte il fatto ke ricordavo il prof Tronci a Tiziano solo per non star lì a provare a spiegare tutta la roba che hai detto tu e riskiare poi ke poveretto nn ci capisse niente perké nn mi ero saputo spiegare: almeno pandava a riguardarsi gli appunti e rimuginava. E poi quello ke hai detto tu (la suddetta "roba") è esattamente quello ke ho detto io poco sopra...anke se forse spiegato male, nn pretendo nulla! In più NON NECESSARIAMENTE cercaValore dev'essere ricorsiva perché c'è un modo molto semplice (e anke lineare, dipendente dall'altezza massima dell'albero) per la ricerca in modo iterativo. Poi, scusa, ma se devi allocare un albero binario, come fai all'inizio ad allocare in nuovoDizionario uno spazio lineare???
NB = Non lo sapevo (quindi grazie x avermelo fatto nortare), ma il Deitel & Deitel parla anke di eccezioni (e gestione di esse) nel C!!!
-- Comment added by
DavidBenedetti on 01 May 2005
Ancora per il parametro "dimensione"
Per quanto riguarda la ricerca su albero binario...se non mi ricordo male altro che lineare, veniva addirittura in
LogN (battibile giusto dalla tabella Hash che ce la fa in O(1), poiché costnte). A parte questo, però, che tutto sommato a poco a che vedere col resto, io quando credo il dizionario alloco lo spazio solo per la "radice" (il mio dizionario è un albero binario di ricerca). Non potrei mai allocare altri spazi, poiché non saprei come agganciarli alla radice, dato che non potrei sapere preventivamente quanti figli destri o sinistri l'albero avrà (e fare un albero bilanciato è un suicidio per quanto riguarda il fattore tempo e complessità). A questo punto il termine dimensione potrei inserirlo nei nodi dell'albero...ma vorrebbe dire che ogni albero ha un campo "dimensione"...uno spreco di spazio immondo. Le idee migliori che mi vengono sono:
1) Creo una variabile "dimensione" globale (poiché non posso passarla a "nuovoDizionario" date le specifiche della funzione) e la faccio puntare solo dal nodo padre (mi sembra una soluzione veramente stupida e insensata, però)
2) Creo l'albero in modo che abbia tra i vari campi anche il campo "dimensione"...ma inizializzo con il giusto valore solo quello che appartiene alla radice, mentre tutti i nodi figli avranno il campo "dimensione" a NULL. In questo modo lo spreco di spazio su disco dovrebbe essere minimo.
Qualcuno di voi ha idee più intelligenti?
-- Comment added by
EnricoMontesi on 01 May 2005
Souzione personale...
Quello ke ho fatto io, Enrico, è creare una struttura Dizionario ke abbia il puntatore alla radice dell'albero, il campo dimensione (massima) e il campo elementi, ke si aggiorna ogni qualvolta inserisco un nuovo nodo; e poi la struttura "nodo" ke contiene la chiave, il peso e i puntatori ai figli (destro e sinistro). Il campo dimensione lo inizializzo quando kiamo nuovoDizionario(...) con il valore che gli passo...in questo modo il Dizionario sa già a priori la sua capacità massima e, quando kiami inserisciValore(...), basta ke prima controlli se il numero di elementi contenuti dal Dizionario è uguale alla sua capacità massima e, se così, resituisci TABLE_FULL!
-- Comment added by
DavidBenedetti on 01 May 2005
x David, varie
per l'albero binario di ricerca hai ragione, si può fare un algoritmo lineare, non ci avevo pensato!!

però non posso concordare sul fatto che sia più semplice: più veloce sicuramente, e anche meno gravoso per lo stack (quindi 1 ottima cosa), ma più semplice da realizzare non penso proprio :P
poi x quanto riguarda le eccezioni: x curiosità, come dice di fare il D&D per gestirle in C? io sapevo che esistevano solo nel C---++, a parte il fatto che Ms le ha portate anche nel C con le sue estensioni (si è presentta la necessità in quanto Windows, per compatibilità, è stato sviluppato in C, ma le eccezioni vengono usate e sono anche molto importanti)
x quanto riguarda l'allocazione dell'albero, x
EnricoMontesi e x chi implementa il dizionario in forma di albero binario di ricerca: il prof (che scrive la main)
non sa com'è fatta la struct "Dizionario", perciò l'unico modo che ha per deallocare il dizionario è
free(d) dove ovviamente "d" è un puntatore a un dizionario; se vuoi evitare memory leaks è necessario fare in modo che la free liberi
l'intero dizionario, cioè fare in modo che tutto il dizionario sia contenuto in un
unico blocco dell'heap; questo blocco naturalmente viene allocato dalla nuovoDizionario, e calcolarne la dimensione è semplice:
dimensione * sizeof(struct Dizionario)
no?
-- Comment added by
AlbertoLaRocca on 01 May 2005
formato file errato
professore, ma se il formato di una linea del file dei tokens è errato (ad esempio se una linea contiene un token ma non contiene nessuno spazio e nessun valore) interrompiamo la lettura e cosa ritorniamo, BAD_MATCH?
-- Comment added by
AlbertoLaRocca on 01 May 2005
Allocazione memoria ed eccezioni...
Il D&D nn parla della gestione delle eccezioni, ma parla delle eccezioni in quanto tali (ad esempio divisione per 0, segmentation fault, ecc...), e cmq, adesso ke ci penso, si possono gestire con la libreria signal.h attraverso una specie di catch effettuato dalla funzione signal che intercetta dal sistema qualsiasi tipo di interrupt di eccezione generato...(xlomeno se me la ricordo bene). Per quanto riguarda l'allocazione della memoria nn hai torto quando dici giustamente ke il professore nn sa come abbiamo implementato il dizionario, ma nn vedo xké allora dovremmo scervellarci a fare un albero binario di ricerca quando potremmo farlo direttamente in un array allocando memoria con il calcolo ke hai detto tu...nn mi sembra abbia senso...si vede ke il professore abbia già considerato questa ipotesi...oppure ce ne dobbiamo preoccupare noi una volta effettuato il calcolo del peso della mail, quindi da dentro calcolaPeso(...)....nn so...Per l'algoritmo di ricerca iterativo pensaci meglio...dammi retta!!!
-- Comment added by
DavidBenedetti on 01 May 2005
di nuovo allocazione lineare dell'albero binario
professore, mi sono accorto che per evitare memory leaks è necessario allocare anche le stringhe contenenti le chiavi degli elementi nello stesso blocco dell'albero; questo però purtroppo rende difficile il calcolo della dimensione del blocco in base al numero massimo di elementi, anzi più che difficile diciamo impossibile, visto che non c'è modo di farlo in quanto noi non possiamo conoscere inizialmente la dimensione delle singole stringhe; quindi propongo di modificare leggermente il significato del parametro della funzione nuovoDizionario (solo per chi implementa l'albero): possiamo stailire che il parametro rappresenta la dimensione massima del blocco espressa in bytes, non in numero di elementi.
-- Comment added by
AlbertoLaRocca on 01 May 2005
algoritmo iterativo di ricerca
ho appena finito di modificare la inserisciValore e la cercaValore sostituendole con implementazioni iterative: ti assicuro che le soluzioni ricorsive erano concettualmente più semplici, non scherzo!! è una legge fondamentale della realtà: se guadagni da qualche parte, perdi necessariamente da qualche altra: se in un algoritmo guadagno in termini di prestazioni e consumo di risorse, perdo in termini di semplicità! no?
-- Comment added by
AlbertoLaRocca on 01 May 2005
iterazione e ricorsione...
Per quanto riguarda la inserisciValore(...) hai ragione, ma infatti non avevo parlato di quella! Per quanto riguarda la ricerca sono in disaccordo...cmq è meglio se affrontiamo questo discorso al di fuori di Twiki Alberto...1)così il professore nn perde tempo 2)così i nostri colleghi nn perdono tempo 3)così nn incasiniamo il forum...
PS = Enrico hai ragione, la ricerca in un albero binario è tutt'altro ke lineare, ma è logN, ho sbagliato...x quanto riguarda la battibilità di questo metodo con quello dell'hashtable, se ben ricordo, nn mi sembra proprio vero (xlomeno nn sempre). In un hashtable hai un vettore di puntatori a liste e se devi ricercare un elemento in una posizione in cui ci sono state molte collisioni dovrai scandire (al peggio) tutta la lista (e cioè N elementi) x avere una risposta. Poi, certo, se l'hashtable è priva di collisioni, è un altro paio di manike!!!
-- Comment added by
DavidBenedetti on 01 May 2005
scartate le unioni (peccato, erano carine:) )
ora che ho trovato questi algoritmi iterativi e li ho sostituiti a quelli ricorsivi, vedo che non c'è più bisogno di definire i nodi dell'albero e il suo... "control block" (chiamiamolo così) in una stessa unione contenuta nella struct Dizionario, ma è possibile farlo in due strutture diverse; il "control block" (ovvero la struct che contiene il puntatore alla root e la dimensione massima) l'ho definito come la struct Dizionario, e i nodi li ho definiti in un'altra struct a parte.
-- Comment added by
AlbertoLaRocca on 01 May 2005
iterazione e ricorsione
ora non esageriamo David,

non mi sembra proprio di essere OT stavolta (a patto che lasciamo perdere la filosofia); aggiungo che l'algoritmo della inserisciValore è "simìllimo" (gh ^^) a quello della cercaValore, perché anche là si tratta semplicemente di una ricerca: per inserire un valore devi cercare la sua ipotetica posizione e crearla, diciamo così; quindi come complessità è analogo.
-- Comment added by
AlbertoLaRocca on 01 May 2005
iterazione e ricorsione...
Sicuro sicuro...??? E' la tua risposta definitiva? La accendiamo?
-- Comment added by
DavidBenedetti on 01 May 2005
ecco: quello era ot
-- Comment added by
AlbertoLaRocca on 01 May 2005
ancora sul formato del file dei tokens
se in una linea il token è separato dal valore da tabulazioni anziché da spazi, il formato è da considerarsi ancora valido? ed è valido anche quando si incontrano numerosi spazi e tabulazioni mischiati insieme?
-- Comment added by
AlbertoLaRocca on 01 May 2005
formato del file di tokens...
Domanda alla quale nn so affatto cosa rispondere...anke se a intuito potrei dirti ke nn si dovrebbero considerare errori del genere visto ke né nelle specifiche è stato detto né nel .h sono stati definiti dal professore errori ke segnalino situazioni del genere...l'ultima parola cmq sta al professore...
-- Comment added by
DavidBenedetti on 01 May 2005
ancora sul formato del file dei tokens
mi sembra difficile che si presentino errori di formato in un file scritto dal programma stesso...
-- Comment added by
GiovanniColombi on 01 May 2005
ancora sul formato del file di tokens...
Si, in effetti mi pare di aver capito che nel modulo 4 dovremmo proprio generare questo file...hai ragione Giovanni.....
-- Comment added by
DavidBenedetti on 01 May 2005
Formato dei tokens, complessità e dimensioni
Risposta generale (e ancora qualche perplessità). Per quanto riguarda il formato dei Tokens, dato che era l'argomento principale del primo modulo io direi che tutte le eccezioni ed i problemi venivano affrontati lì, no? Darei per scontato che il file che arriva è corretto (a parte i soliti errori di stringa vuota o nulla), altrimenti dobbiamo di nuovo ripetere le funzioni del primo modulo. Per quanto riguarda la complessità delle hashtable...questa, se fatta bene, è una struttra grazie alla quale puoi inserire ogni voce in maniera unica, grazie ad un calcolo matematico che adesso non ricordo (e non mi va sinceramente di andarlo a cercare ^^). Questo ci permette di far si che, nel caso dovessimo ricercare una voce, possiamo semplicemente rifare il calcolo sopracitato sulla suddetta voce (un calcolo anche se complicato ha sempre una complessità costante, e quindi O(1)) e quindi avere la posizione esatta della parola da noi ricercata...di conseguenza non dobbiamo scorrere nessun vettore ma andare direttamente nella posizione trovata...quindi un altro O(1). Complessità finale: O(1)---+ O(1) = O(1).
Per quanto riguarda la creazione del dizionario credo che alla fine anche io creerò un struttura che punta alla radice, i vari nodi saranno un'altra struttura.
-- Comment added by
EnricoMontesi on 02 May 2005
Valore "dimensioni" errato
E se il valore della variabile "dimensioni" è un valore negativo o vale zero, nel momento in cui lo passiamo a "nuovoDizionario" come facciamo a farci restituire errore, dato che la funzione non torna un intero? Per me le possibilità sono 3:
1) La funzione che chiama "nuovoDizionario" effettua il controllo della variabile "dimensioni", in modo da poter far si che l'unico errore all'interno della funzione possa essere fatto dalla malloc. A questo punto in caso di MEM_ALLOC_ERROR semplicemente "nuovoDizionario" tornerò NULL, e la funzione chiamante saprà che se le viene tornato NULL vuol dire che l'allocazione di memoria è andata male per qualche motivo (mi sembra la soluzione migliore).
2) La funzione nuovoDizionario controlla se il valore di "dimensioni" è valido, altrimenti torna NULL e la funzione chiamante saprà che tale valore di ritorno implica un'errata dimensione. In questo modo però come facciamo a restituire l'eventuale errore di allocazione di memoria?
3) qualsiasi tipo di errore fa si che la "nuovoDizionario" torni "UNKNOW_ERROR". Mi sembra però uno schifo di soluzione...non fa capire nulla del perché c'è stato un errore.
-- Comment added by
EnricoMontesi on 02 May 2005
perplessità su "calcoloPeso"
Nella descrizione della funzione "calcoloPeso" c'è un accenno alla "formula descritta a lezione". Dato che nella citata lezione io non c'ero, volevo sapere quale fosse (sempre che non sia banalmente ciò che c'è scritto poco dopo sempre nella descrizione della funzione). Qualcuno potrebbe gentilmente riscriverla qui, dato che credo sia di interesse per tutti coloro che non erano a lezione?
Grazie ^^
-- Comment added by
EnricoMontesi on 02 May 2005
formula x il calcolo del peso
io non me la ricordo x niente, ma penso cmq che stia in attachment (Sterbini dovrebbe aver messo in attachment tutte le sue lezioni, no?)
-- Comment added by
AlbertoLaRocca on 02 May 2005
chi gestisce gli errori?
per evitare che ci siano dubbi e che i test non funzionino su altri codici, non sarebbe meglio definire da subito quale funzione deve controllare quale errore?
-- Comment added by
GabrieleTarantino on 02 May 2005
Risposte
RE: ABS(...)
... ma che dici! ... abs della differenza da 0.5 !
RE: disallocazione
Grazie Alberto, me ne ero dimenticato, aggiungo il deallocatore (distruttore)
RE: case sensitive
mi pare di aver letto che conviene essere case-sensitive, e visto che non cambia molto ...
RE: Ancora per il parametro "dimensione"
preferisco che non usate variabili globali non necessarie
l'idea di DB non spreca memoria
RE: formato file errato
stavolta presumiamo che il file sia corretto.
RE: Allocazione memoria ed eccezioni...
Con signal si riescono a acchiappare diversi errori ma non c'e' la possibilità di passare velori (oggetti) che comunicano attraverso i dettagli dell'errore al catch. C---++ e Java da quel lato sono una meraviglia.
C'e' chi ha fatto una libreria per gestire eccezioni in C ma non l'ho provata a fondo.
NON fate un array semplice, che ci guardo e vi annullo l'esercizio.
RE: di nuovo allocazione lineare dell'albero binario
no,
dimensione è il numero di elementi del dizionario/alberodiricerca/hastable.
RE: algoritmo iterativo di ricerca
A me viene sempre spontaneo riscrivere le funzioni iterative come ricorsive ...
... devo aver programmato troppo in lisp e prolog ...
RE: scartate le unioni (peccato, erano carine:) )
Era un po' che DB lo stava suggerendo
RE: ancora sul formato del file dei tokens
Stavolta preferirei rimanere su una difficoltà più "umana" del modulo2.
[OT] eliminaTagsInvisibili si riesce a scrivere usando rimpiazzaEspressioneRegolare anche per i tags nidificati ... che forza!!!
RE: Valore "dimensioni" errato
... mmmhhhh mi sa che devo far tornare un codice anche lì ...
RE: perplessità su "calcoloPeso"
ma le slides che ce le ho messe a fare su twiki?
-- Comment added by
AndreaSterbini on 02 May 2005
slides
...adesso sarò rincitrullito io...ma le uniche slides che mi visualizza la pagina di laboratorio di programmazione (per la cronaca quella da cui si può accedere anche ai vari moduli) mi mostra solo 2 slides risalenti entrambe a Marzo...
-- Comment added by
EnricoMontesi on 03 May 2005
slides
e infatti la formula l'abbiamo vista a marzo...
-- Comment added by
AlbertoLaRocca on 03 May 2005
AIUTO!
..stò in crisi qualcuno per piacere mia dia una mano..qui di seguito riporto i quesiti che mi stanno ossessionando..e spero vivamente che qualche anima pia mi possa dare una mano..
1.Nella funzione nuovoDizionario i codici di errori non devono essere gestiti?cioè.. nel caso si presentivo problemi e/o incovenienti quali, uno a
caso, "dimensioni" negativo, bisogna ritornare sempre NULL?..è un pò ambigua come cosa..
2.Nella funzione inserisciValore si deve ricercare una chiave e se trovata inserire il valore..fin qua ok!
ma se la chiave non è presente nel dizionario la funzione
deve aggiungerla oppure deve restituire il codice d'errore KEY_NOT_FOUND?
..e se la chiave è presente và aggiunto il valore alla lista o ritornare il codice DOUBLE_KEY_FOUND?
in ultimo visto che tra i parametri che riceve la funzione non è presente la dimensione del vettore del dizionario,
durante la ricerca di una chiave come posso capire che il vettore è terminato?(e nel caso, se il vettore è pieno ritornare TABLE_FULL)?
..mi scuso per gli eventuali errori..spero di aver formulato le domande in maniera più chiara possibile.. e ringrazio sin da ora coloro che mi presteranno un pò di attenzione..Cordiali Saluti..
-- Comment added by
DavideFacente on 03 May 2005
Re: AIUTO!
ehm, a parte tutto cmq vorrei farti notare che il professore ha
esplicitamente vietato di implementare il dizionario come un vettore: o alberi binari o hash table! se lo fai come un vettore lui quando controlla il codice se ne accorge e ti caxxia ^^
-- Comment added by
AlbertoLaRocca on 03 May 2005
RE: algoritmo iterativo di ricerca
be', prof., si abitui a fare il contrario allora: :P in genere gli algoritmi iterativi sono preferibili a quelli ricorsivi per almeno due motivi:
- non gravano sullo stack
- nel caso in cui l'operazione sia eccessivamente prolungata gli algoritmi iterativi possono essere facilmente interrotti (basta aggiungere un controllo nella condizione del ciclo) e l'errore può essere gestito, e soprattutto non causano un crash, a differenza di quelli ricorsivi che causano facilmente lo stack overflow
-- Comment added by
AlbertoLaRocca on 03 May 2005
AIUTO!
Non penso di aver capito bene cosa intendi riguardo alla funzione inserisciValore(...) Davide...A quanto ho capito la funzione inserisce nel dizionario un nuovo nodo che avrà come chiave la stringa e come valore il double in entrata...Ma non deve cercarla prima...Anke xké poi nelle specifiche c'è scritto ke "...se la kiave è già presente si torni DOUBLE_KEY_FOUND...". Non so se ho capito bene o meno, fatto sta che, rileggendo le specifiche, mi sembra di capire così...
-- Comment added by
DavidBenedetti on 03 May 2005
calcolaPeso(...)
Professore, non riesco affatto a capire come si calcolano i pesi delle parole...soprattutto quando parla del calcolo della deviazione delle parole (immagino parli dei token!) da 0.5...Potrebbe spiegarlo terra terra (x me, povero tapino!)?
-- Comment added by
DavidBenedetti on 03 May 2005
Chiavi del dizionario: Ordine
Possiamo gestire il dizionario (mi riferisco all'ordine delle chiavi) a nostro piacimento? Io ho pensato ad esempio di creare un numero costante di buckets pari al numero di lettere dell'alfabeto, e di inserire le chiavi sempre in ordine alfabetico. Abbiamo, come immagino, tutta questa libertà di scelta o dobbiamo seguire qualche specifica?
-- Comment added by
MassimilianoNatale on 03 May 2005
Dubbio...
Inizio a pensare di non aver capito un emerito ca...volo di questo modulo.....:(
-- Comment added by
DavidBenedetti on 03 May 2005
nuovoDizionario: problema con il valore tornato
Ma siamo sicuri che la funzione nuovoDizionario() ,che alloca lo spazio per un array di puntatori che poi andranno a formare le liste, debba tornare un valore di tipo struct Dizionario *? Volendo implementare il dizionario tramite hash table sto trovando un pò di problemi con questa funzione
-- Comment added by
MassimilianoNatale on 04 May 2005
passaggio di puntatori
Sono un po' perplesso da una cosa che mi succede nella funzione nuovoDizionario. Innanzitutto sarei grato se qualcuno riuscisse a spiegarmi l'errore di compilazione
14 C:\Dev-Cpp\dizionario.h [Warning] useless keyword or type name in empty declaration
oltre a ciò il mio programma non salva i cambiamenti. Mi spiego meglio, io passo una variabile di tipo "struct Dizionario *" a "nuovoDizionario". Al suo interno viene allocata la memoria e quindi creata la struttra. In questa struttura c'è anche un campo "int" in cui viene memorizzato il valore di "dimensioni". Quando però si esce dalla procedura e si torna nel main, il valore il precedente intero non è più uguale a "dimensioni", bensì ha un valore random tipico delle variabili non allocate o non inizializzate. Non riesco a capire come sia possibile che il valore non venga memorizzato se io passo effettivamente il puntatore, e non solo il valore.
-- Comment added by
EnricoMontesi on 04 May 2005
AIUTO BIS
...`corregetemi se sbaglio..partendo dal presupposto che io sto cercando di implementare il dizionario con l`hashtable..(dove l`hashtable e' un vettore di puntatori a liste).. in pratica se mi ritrovo la stessa chiave vado a incrementare la lista e ritorno il codice..mentre se la chiave non e` presente l`asggiungo alla tabella e ritorno RESULT_OK!!giusto?..David scusami ma come faccio a ritornare il codice d`errore DOUBLE_KEY_FOUND se nn faccio prima una ricerca della chiave???..cmq gia` il fatto di aver capito piu` o meno cosa deve fare la funzione mi solleva...almeno posso iniziare a smanettare..fatto sta` che con tutto il rispetto, il pdf che ha tirato su il prof. per me e` un po ambiguo..o forse sono rinc*****ito io e/o ingorante(non escludo l`ultima ipotesi)..cmq resta ankora da svelare il mistero di cosa deve tornare nuovoDizionario..mbha..vedremo!..e il tempo passa..aspetto notizie..Cordiali Saluti..
PS. Alberto hai ragione niente vettore..

PPS. Non e che avete Msn ho simili?..magari ci si scambia il contatto!
-- Comment added by
DavideFacente on 04 May 2005
Risposte
RE: AIUTO!
[bel titolo utile
]
- nuovoDizionario torna NULL se qualcosa non funziona.
- inserisciValore torna errore solo se la chiave è già presente (o un parametro fa schifo), sennò la inserisce e torna RESULT_OK
- basta che ti ricordi il valore passato alla nuovoDizionario
[OT] algoritmo iterativo di ricerca
Visto che il tempo-macchina costa molto meno del tempo-uomo, continuo a scrivere funzioni ricorsive, meglio manutenibili.
RE: calcolaPeso(...)
Ho aggiornato le bozze che descrivono il progetto, ora il calcolo da fare dovrebbe essere più chiaro.
RE: Chiavi del dizionario: Ordine
Avete completa libertà sia nell'implementazione (ma senza usare un semplice vettore) sia per le strutture che per la funzione di hash.
RE: Dubbio...
[che bel subject ... e che bella domanda chiara!
]
RE: nuovoDizionario: problema con il valore tornato
potresti incapsulare la tua hashtable in una struct
Dizionario definita appropriatamente ....
RE: passaggio di puntatori
nuovoDizionario NON riceve un puntatore, bensì un intero che indica quanti elementi si potranno inserire nel dizionario.
Deve allocare una struct Dizionario (definita da te) e tornarla.
-- Comment added by
AndreaSterbini on 04 May 2005
AGGIORNAMENTO
Ho aggiornato i files in attachment al
ModuloTre.
I cambiamenti sono minimi, spero di aver chiarito abbastanza bene il conto da fare.
-- Comment added by
AndreaSterbini on 04 May 2005
[OT] algoritmi iterativi di ricerca
anche questo è vero, però stando a quanto dice DB gli algoritmi iterativi sono più semplici
-- Comment added by
AlbertoLaRocca on 04 May 2005
algoritmo iterativo di ricerca...
il sottoscritto DB non ha mai detto una cosa del genere...l'unica cosa ke ho detto e' ke l'algoritmo di ricerca NON NECESSARIAMENTE deve essere ricorsivo...punto. Ke poi ho detto anke ke sia semplice e' una cosa un pokino diversa.....!!!
-- Comment added by
DavidBenedetti on 04 May 2005
errore di compilazione
Ragazzi, scusate se torno con questa domanda ma è una cosa che mi lascia veramente perplesso ed una risposta sarebbe veramente gradita.
In fase di compilazione mi viene dato questo errore:
14 C:\Dev-Cpp\dizionario.h [Warning] useless keyword or type name in empty declaration
Ovviamente in quanto "warning" permette comunque di poter far girare il programma, ma non riesco a comprenderne il significato. Qualcuno di voi ha mai incontrato una cosa simile?
-- Comment added by
EnricoMontesi on 04 May 2005
errore di compilazione...
ad okkio potrei solo provare ad indovinare: forse ha qualcosa a ke vedere con un tipo di dato (magari dikiarato da te)...xo' non so cos'altro dire...se vuoi, porta il codice in classe ke provo a darti una mano...!
-- Comment added by
DavidBenedetti on 04 May 2005
Parametro dimensione
..visto che la funzione inserisciValore non riceve un parametro dimensione come faccio a calcolare il valore hash della chiave così da poter inserire la chiave e il relativo valore all interno dell'hashtable??? e più precisamente dentro la medesima funzione inserisciValore come faccio a capire quanto è grande l'hashtable visto che appunto, non è presente nessun parametro dimensione?
..il prof. mi ha risposto dicendomi "basta ricordare il valore passato alla nuovoDizionario"(ma non mi ha chiarito molto le idee..)..e io ho pensato:si ok ma se nelle altre funzione non ho nessun riferimento a quel parametro come posso utilizare il valore presente in quel parametro e quindi appunto sapere la dimensione dell'hashtable?..voi come avete fatto?? cioè stò sclerando di brutto..Cordiali Saluti
-- Comment added by
DavideFacente on 04 May 2005
scanf() e derivate per i valori double
Qualcuno può dirmi come chiamare la scanf() per la lettura dei valori double? Domanda un pò stupida però leggendo il valore tramite scanf("%f") (come faccio) mi porta per ogni chiave l'assurdo numero che è -0.000000... Da cosa può dipendere?
-- Comment added by
MassimilianoNatale on 05 May 2005
scanf() e derivate per i valori double
non usare scanf, usa atof, è più appropriata.
-- Comment added by
AlbertoLaRocca on 05 May 2005
Parametro dimensione...
Nella frase: "basta ricordare il valore passato alla nuovoDizionario" il professore ti ha praticamente dato la soluzione su un piatto d'argento Davide. Per 'ricordare' la dimensione basta ke consideri il Dizionario come un 'qualcosa' ke ha la facoltá di ricordare...!!!
-- Comment added by
DavidBenedetti on 05 May 2005
errata corridge in "freeDizionario"
C'è un errore nella dichiarazione di "freeDizionario" all'interno di "modulo3.h"
Il parametro che le viene passato è:
"Dizionario * dizionario"
mentre credo debba essere:
"struct Dizionario * dizionario"
Professore può confermare?
-- Comment added by
EnricoMontesi on 05 May 2005
Risposte
RE: errore di compilazione
che ne dici di farci sapere cosa c'e' scritto sulla misteriosa riga 14 del file dizionario.h ?
RE: Parametro dimensione
"basta ricordare il parametro dimensione" vuol dire: aggiungi un campo al tuo dizionario e ficcaci la dimensione quando lo crei.
RE: errata corridge in "freeDizionario"
I casi sono due: o usate una typedef o scrivete struct Dizionario, controllo e correggo il .h
-- Comment added by
AndreaSterbini on 05 May 2005
int calcolaPeso(...)
Il primo parametro è di tipo Token, quindi se il tokens->contesto è uguale a NULL come chiave prendiamo direttamente la stringa tokens->parola, altrimenti ci dobbiamo ricostruire la chiave in questo modo: tokens->parola---+ "*" + tokens->contesto. Esempio: "From*andrea" giusto??
-- Comment added by
TizianoFranchi on 05 May 2005
errata corridge in "freeDizionario"
"che ne dici di farci sapere cosa c'e' scritto sulla misteriosa riga 14 del file dizionario.h ? "
E anche lei ha ragione!
Comunque ho risolto...scoprendo di essere un deficiente! Il povero compilatore mi dava quel warning perché io dichiaravo le strutture usando "typedef struct", senza però rinominare la struct ala fine della dichiarazione. Ovviamente, dato che in tutti i prototipi di funzioni dateci Dizionario viene dichiarato come "struct", ho scelto di eliminare il typedef, poiché sarebbe inutile rinominarlo se poi tanto in tutte le funzioni devo dichiararlo con "struct". Di conseguenza, comunque, il warning è scomparso.
-- Comment added by
EnricoMontesi on 05 May 2005
errata corrige in "freeDizionario"
Sì, quell'errore lo dà anche a me
-- Comment added by
MassimilianoNatale on 06 May 2005
int calcolaPeso(...)
Si, almeno io ho fatto così Tiziano...!!!
-- Comment added by
DavidBenedetti on 07 May 2005
int calcolaPeso(...)
per il calcolo di bad e good come bisogna fare???
Da quello che ho capito si prendono i primi 20 tokens che hanno valore più alto e si calcola bad come il prodotto di tutti i valori, mentre good si fa il prodotto di 1 - il valore, che però sono gli stessi sia nel calcolo di bad che nel calcolo di good giusto??
oppure dobbiamo prendere i 20 valori più alti per bad e i 20 valori più bassi per good??
-- Comment added by
TizianoFranchi on 07 May 2005
int calcolaPeso(...)
Dovrebbero essere gli stessi 20 token in entrambi i casi Tiziano.....!
-- Comment added by
DavidBenedetti on 07 May 2005
20 token più distanti da 0.5...
Professore, ma se ci capitasse una situazione in cui abbiamo meno di 20 token diversi, come facciamo a prendere i famosi
20 token??? Se il loro numero è minore (o uguale) a 20 li prendiamo tutti o ne consideriamo meno?
-- Comment added by
DavidBenedetti on 07 May 2005
abs(...) e fabs(...)
Professore, visto che lavoriamo con numeri in virgola mobile per elaborare i pesi delle parole, avrei pensato ad usare la funzione fabs(...), che calcola i valori assoluti dei double...invece abs(...) lo calcola per gli interi...(infatti non capivo perché, usando quest'ultima, mi veniva sempre 0 il peso della mail)...conferma???
-- Comment added by
DavidBenedetti on 07 May 2005
calcolaPeso(...)
In questo caso Professore, è necessario il calcolo del valore assoluto del peso ottenuto dai calcoli oppure no?
-- Comment added by
DavidBenedetti on 07 May 2005
calcoloPeso()
scusa david ma la funzione fabs() come mai bisogna usarla??
i valori dei tokens non sono tutti positivi??
-- Comment added by
TizianoFranchi on 07 May 2005
calcolaPeso(...)
Si, ma il fatto è ke, x fare il calcolo del loro peso, devi vedere quei 20 fra tutti loro distano di più da 0.5 ( e cioè fabs((valore * occorrenze) - 0.5) )...ecco ke, quindi, potresti ritrovarti dei valori negativi...!!!
-- Comment added by
DavidBenedetti on 07 May 2005
problemi se ci sono troppi tokens
Ho notato una cosa, se ci sono troppi tokens, le produttorie per ottenere i punteggi di Bad e Good tendono ovviamente a zero (essendo produttorie di numeri compresi tra 0 e 1). Se questa tendenza supera la precisione che riesce a gestire la variabile double otterremo dei valori Bad: 0.000000 e Good = 0.000000
Quando quindi andremo a fare il calcolo di peso=bad/(good---+bad) faremo una divisione per zero...ed ovviamente il calcolatore si arrabbierà. Che facciamo quindi? Se otteniamo un valore di bad e good (entrambi, poiché tanto se ce n'è anche uno solo maggiore di zero il problema non sussiste più) uguale a zero ritorniamo "INVALID_PARAMETER"?
-- Comment added by
EnricoMontesi on 07 May 2005
divisione per 0....
Quello ke dici è vero Enrico, xò pensa anke al fatto ke dobbiamo considerare solamente 20 tra tutti i token ke ci arrivano dalla email (e tutti
diversi), e li scegliamo fra quelli ke distano maggiormente da 0.5, perciò si presume ke quei 20 abbiano un peso compreso tra 0.5 e 0.2-0.1...penso...ma cmq mi stavo facendo la stessa (lecitissima) domanda!
-- Comment added by
DavidBenedetti on 07 May 2005
Risposte
AGGIORNAMENTO di freeDizionario
Ho aggiornato
modulo3.h e
Modulo3.pdf aggiungento lo
struct che mancava.
RE: int calcolaPeso(...)
Esatto, la chiave è
parola oppure
contesto*parola
RE: int calcolaPeso(...)
Sono gli stessi valori, se ci fai caso in quei valori trovi sia i più SPAM (più alti) che i più HAM (più bassi)
RE: 20 token più distanti da 0.5...
Se avete meno di 20 tokens scegliete quelli che mancano casualmente.
[ma che ho fumato oggi?]
NO: se avete meno di 20 token fate i conti con quelli che avete.
RE: abs(...) e fabs(...)
Mi sembra sensato.
RE: problemi se ci sono troppi tokens
Mi pare di ricordare dalle prime slides che vi mostrai tanto tanto tempo fa che i pesi sono sicuramente maggiori di 0 e minori di 1.
RE: Attenti ai pesi
Il peso da usare nella produttoria è quello che sta nel dizionario, e NON gli va sottratto 0.5 (a parte per trovare i più lontani da 0.5)
-- Comment added by
AndreaSterbini on 08 May 2005
Problema pesi
Allora, capiamoci bene (soprattutto tu, David...mi hai messo una pulce nell'orecchio grossa quanto un elefante!) e cerchiamo di evitare che qualcuno (tra cui me) capisca male questo modulo. Leggo dalle specifiche che non sono sempre e solo i primi 20 tokens, bensì c'è scritto che tutti i tokens che hanno lo stesso valore del ventesimo devono far parte della produttoria (sul PDF c'è erroneamente detto che vanno "sommati" anche loro, mentre in realtà devono essere "moltiplicati", fate attenzione a non sbagliarvi) anche se in questo modo superiamo i 20 tokens, quindi se abbiamo 20 tokens con un valore uguale al ventesimo ecco che usciremo dalla tolleranza dei double...o è possibile che io mi stia sbagliando ed anche con un totale di 40 o 50 tokens con cui fare la produttoria non si uscirà mai da tale tolleranza? (ricordo che il numero 0.0000009 non può essere visto da un double, poiché può tener conto di sole 6 cifre dopo lo 0), quindi il nostro double darà come risultato 0.000000, poiché troncherà l'ultima cifra. Io ho provato con 22 tokens, ed il risultato è stato Bad = 0.000000 e Good = 0.000003
Possibile che aggiungendo altri dieci tokens non si superi la precisione del double?
-- Comment added by
EnricoMontesi on 08 May 2005
attenti ai pesi
quindi li devo ordinare facendo (occorrenze*peso)-0.5 ma per trovare bad e good devo fare il calcolo con occorrenze*peso
-- Comment added by
TizianoFranchi on 08 May 2005
E sempre per quanto riguarda i pesi
X quanto riguarda la domanda di Tiziano direi decisamente di si (ho letto e riletto le specifiche e sono abbastanza convinto di ciò).
Ho però un dubbio sulla definizione di "prendere i primi 20 tokens diversi" che viene data nel PDF. Nella mia testa prendere i primi 20 tokens diversi vuol dire prendere i primi 20 tokens che hanno parole diverse (dato che i tokens sono fatti solamente da parole) per esempio se ci sono tra i primi 20 ben 2 tokens = "pippo", ne prenderò uno solo. Il problema è che poi si parla di lavorare sui valori e di prendere i successivi valori uguali al ventesimo...quindi mi viene il dubbio che per "i primi 20 tokens diversi" si intendano i primi 20 che abbiano valore diverso (quindi "pippo" = 0.8 e "viagra = 0.8" non verranno presi entrambi, ma solamente uno). Professore, può specificare bene quale dei due modi è quello giusto? Devo prendere i primi 20 tokens diversi osservando le parole o i valori?
-- Comment added by
EnricoMontesi on 08 May 2005
E sempre per quanto riguarda i pesi
Io direi che la cosa più sensata da fare è questa!!
i primi 20 tokens diversi li prendiamo in base alla parola, mentre una volta preso il ventesimo dobbiamo vedere se i successivi hanno lo stesso valore..il prodotto perciò andrà avanti fino a quando non troveremo il primo token con peso diverso!!
-- Comment added by
TizianoFranchi on 08 May 2005
per il calcolo di bad e good
ma per calcolare bad bisogna fare bad * (peso * occorrenze) e per calcolare good bisona fare good * ((1-peso) * occorrenze)???? bad quasi sempre mi viene 0 anche se nell'array tokens ci sono molte occorrenze di token che indicano spam
-- Comment added by
TizianoFranchi on 08 May 2005
Precisazione sui pesi
Non ci sono occorrenze nel conto.
Dovete solo moltiplicare i valori selezionati trovando il 20mo token diverso (come key) e prendendo tutti quelli che hanno la stessa distanza da 0.5 o una distanza maggiore.
-- Comment added by
AndreaSterbini on 08 May 2005
Chiedo umilmente scusa...
Ragazzi vi chiedo scusa x avervi fatto impazzire su questo benedetto calcolo mettendovi pulci assurde nelle orekkie...avevo letto (o interpretato (peggio xké vuol dire ke nn capisco manco più l'italiano)) male le specifiche...perdonatemi.....
-- Comment added by
DavidBenedetti on 08 May 2005
Attenti ai pesi...
Professore, lei ha detto: "Il peso da usare nella produttoria è quello che sta nel dizionario, e NON gli va sottratto 0.5 (a parte per trovare i più lontani da 0.5)"...questo cosa vuol dire: ke dobbiamo ricordarci sia il peso di ogni token ke la sua distanza da 0.5? A me non torna molto la cosa, anke xké dalle specifiche avevo capito ke prima calcolavo tutte le distanze dei token da 0.5 e poi, con le distanze ottenute, calcolavo le produttorie considerando i 20 token---+ distanti da 0.5......oppure mi sono sbagliato un'altra volta???
-- Comment added by
DavidBenedetti on 08 May 2005
Calcolo del peso...
Ho appena modificato l'algoritmo del calcolo del peso ed ho notato una cosa abbastanza interessante (se così deve funzionare!). Se nei pesi delle parole c'è anche un solo peso che è uguale ad 1.0 l'email è automaticamente spam e cioè peso = 1.0. Invece per valori che si avvicinano (chi più, chi meno) a 1.0 (ma nessuno che ne sia uguale), l'email generalmente ha peso < 1: ad esempio 0.6 - 0.86324345...ecc......giusto professore?
-- Comment added by
DavidBenedetti on 08 May 2005
Le funzioni di test: ehm ma non è un po troppo "custom" come modulo per farle?
Iniziando a scrivere le funzioni di test mi sono trovato di fronte a questo interrogatio. Faccio subito un esempio:
funzione test_inserisciValore
per effettuare il test sul primo parametro (chiave in questo caso) devo inizializzare correttamente gli altri due (valore e *dizionario). Dizionario però è variabile, quindi non si può "inizializzare" manualmente. Di conseguenza per rendere la funzione di test universale, per inizializzarlo devo chiamare la funzione nuovoDizionario, non sapendo se questa sia corretta oppure no.
Come ci comportiamo?
-- Comment added by
RiccardoVona on 08 May 2005
funzioni di test
secondo me hai ragione Riccardo, però io vedo che il prof. finora ha applicato i test di ciascuno solo sul suo codice e sul codice di ciascuno; non ha mai fatto i nostri test sul codice degli altri; forse ho capito male, forse il torneo va fatto alla fine di tutto?
-- Comment added by
AlbertoLaRocca on 08 May 2005
risposte ai test ed a David
Secondo me dobbiamo banalmente mettere in ordine i primi 20 tokens diversi (per key) che più si allontanano dal valore 0.5
Dopodiché utilizzare il loro valore (e non la loro distanza da 0.5) per calcolare il peso. Per quanto riguarda i tests, io utilizzo le variabili "nuovoDizionario" e simili, specificando nei tests quando è che l'errore può essere dovuto solo alla funzione testata o quando può derivare anche dall'errato uso delle funzioni d'appoggio.
-- Comment added by
EnricoMontesi on 09 May 2005
[HASH O ALBERO]è possibile usare funzioni in più?
Prof volevo farle una domanda per gestire una tabella hash(tipo la funzione di hashig e quella di inserimento), secondo me, sarebbe comodo aggiungere delle funzioni che la gestiscano anche senza modificare l'header lei che ne pensa? posso farlo? inoltre visto che una hash table è un vettore di puntatori a strutture la free nn è molto indicata è possibile modificare il prototipo?
ultimo ma non meno importante nn ho capito bene come fare a calcolare il peso di una parola...
-- Comment added by
AndreaFerraresi on 10 May 2005
"la free non è molto indicata"?
scusa, tu come fai in C puro a deallocare qualsiasi blocco allocato dinamicamente? cosa vorresti usare al posto di free? (può essere che ci sia qualche funzione che non conosco... :P )
-- Comment added by
AlbertoLaRocca on 10 May 2005
Risposte
RE: Attenti ai pesi...
Scusa, Davide ... ma hai letto quello che ho scritto sulle specifiche? Mi sembra abbastanza chiaro. Una cosa è ordinare i token per scegliere quali moltiplicare, un'altra è moltiplicarne i pesi.
RE: Calcolo del peso...
Non mi torna, il prodotto di più numeri con la virgola minori o uguali a 1 dà 1 SOLO se sono TUTTI 1.
RE: Le funzioni di test: ehm ma non è un po troppo "custom" come modulo per farle?
Usate la funzione nuovoDizionario, inserisciValore eccetera.
RE: funzioni di test
Il torneo lo posso fare subito, basta che scriva due cicli nidificati che accoppino (nel senso di accoppiare, non di accoppare

) tutti i vostri compiti .... ma per il momento mi manca il tempo di analizzare i dati.
RE: [HASH O ALBERO]è possibile usare funzioni in più?
Basta che ne mettiate i prototipi nel vostro file dizionario.h
NON MODIFICATE modulo3.h o testsModulo3.h
-- Comment added by
AndreaSterbini on 11 May 2005
leggiTokens e DOUBLE_KEY_FOUND
come si deve comportare la leggiTokens se nel file trova più occorrenze di una chiave?
deve continuare ad aggiungere elementi o fermarsi e tornare errore?
-- Comment added by
MarcelloLagana on 11 May 2005
leggiTokens e DOUBLE_KEY_FOUND
Da quanto ha detto il professore alla stessa domanda che gli ho fatto mi sembra l'altra settimana, sembra si debba propagare immediatamente l'errore.
-- Comment added by
DavidBenedetti on 11 May 2005
Puntatore a puntatori
Come si dichiara un puntatore a puntatori?
Io ho fatto cosi: typdef struct List { char chiave[128];double valore;}Lista; struct Dizionario{int pos; Lista*vet[];}; ed eseguendolo da il seguente errore: array size missing in 'vet'.
-- Comment added by
SalvatoreDiPasquale on 11 May 2005
Puntatore a puntatori
Perche' devi semplicemente scrivere tra le parentesi quadre del vettore vet[] la dimensione che vuoi...Altrimenti, se la tua intenzione e' quella di allocare dinamicamente il vettore, quando viene chiamato nuovoDizionario(...) allora devi semplicemente
togliere le parentesi quadre...!!!
-- Comment added by
DavidBenedetti on 11 May 2005
Puntatore a puntatori
ma se tolgo le parentesi quadre diventa un puntatore "semplice"
-- Comment added by
SalvatoreDiPasquale on 11 May 2005
Puntatore a puntatori
Se hai bisogno di un puntatore a puntatorE e' un conto ma non puoi avere un puntatore a puntatorI...Se quello che intendi e' un array di puntatori a liste (al ché intuirei una tua volontá di implementare un hashtable) dovrebbe essere come ti dicevo...ammesso che io non mi sia completamente rinco*******o...!!!
-- Comment added by
DavidBenedetti on 11 May 2005
pesi
ma i pesi dei token che possono essere: 0.1 <= peso <=0.9 giusto???perchè se è 0 il prodotto bad viene 0, se è 1 il prodotto good viene 0 (1-peso)==>(1-1)=0. dato che facciamo i prodotti basta che il peso sia 0 o 1 ad annulare tutta la produttoria.
-- Comment added by
TizianoFranchi on 11 May 2005
Puntatore a puntatori, soluzione a puntate (4^ puntata puntata)
un puntatore a un puntatore si dichiara semplicemente con due asterischi, ma non penso che ti serva.
-- Comment added by
AlbertoLaRocca on 11 May 2005
asd

ma perche'
SalvatoreDiPasquale e' stato punito da
SuperMan?
-- Comment added by
AlbertoLaRocca on 11 May 2005
Per i test
Come faccio a verificare se le funzioni fanno le cose in modo giusto??ad esempio come faccio a sapere se l'inserisciValore(); inserisce correttamente la chiave e il valore nel dizionario se non conosco la struct di quest'ultimo??Posso solo controllare se restituisce result_ok
-- Comment added by
TizianoFranchi on 11 May 2005
test_leggiTokens()
per fare i test su FILE_UNREADABLE, FILE_EMPTY ecc metterà nella directory i file: file_unreadable.txt e file_empty.txt ecc..
-- Comment added by
TizianoFranchi on 11 May 2005
Problemi consegna
Vorrei consegnare un prima bozza del mio programma però ho problemi con la consegna
-- Comment added by
MassimilianoNatale on 11 May 2005
RE: Problemi consegna
Oggi pomeriggio lo aggiusto
-- Comment added by
AndreaSterbini on 12 May 2005
Senza titolo?
Volevo sapere se la leggiTokens nel caso trovi una chiave già presente nel dizionario va a quella successiva oppure ritorna il comando al main, e non inserisci più eventuali chiavi presenti?
-- Comment added by
LucaOlivieri on 12 May 2005
Spazio in memoria
posso crearmi nella struttura dizionario un campo che mi indichi la dimensione massima del mio dizionario, o questo non e' consentito per un impiego maggiore di spazio?
-- Comment added by
SalvatoreDiPasquale on 12 May 2005
Nomi di file standard
Prof. per il testing della leggiTokens possiamo assumere che nella directory siano presenti i files: file-empty e file-unreadable e che non sia sicuramente presente file-missing (come fu in modulo1)?
-- Comment added by
GiovanniColombi on 12 May 2005
RE: Senza titolo? [diciamo DOUBLE_KEY_FOUND in leggiTokens]
IMHO deve tornare immediatamente l'errore DOUBLE_KEY_FOUND (e così per qualsiasi altro codice riceva da una funzione chiamata).
-- Comment added by
GiovanniColombi on 12 May 2005
Spazio in memoria
Mi sembra doveroso. Ti serve per far tornare il codice TABLE_FULL a inserisciValore.
-- Comment added by
GiovanniColombi on 12 May 2005
File Token
vorrei sapere se il file passato alla funzione leggiToken termina con un \n\0 o PUO terminare anche solamente con un \0 ? grazie
-- Comment added by
GiuseppeIamele on 12 May 2005
Errore in testModulo3.h ??? + file di esempio
Prof. mi scusi ma ho un problema con i .h anche in questo modulo. Compilando, in testModulo3.c mi da errore < `INVALID_PARAMETER' undeclared >. Allora ho spulciato nei .h e ho notato che testModulo3.c non ha accesso alle definizioni del modulo2 poichè non include testModulo2.h (che a sua volta include testModulo1.h e modulo2.h).
Facendo le seguenti modifiche a testModulo3.h tutto fila liscio:
aggiungo:
#include "testModulo2.h"
#include "modulo3.h"
elimino
#include "testModulo1.h"
Potrebbe mica controllare? A qualcun'altro è capitata la stessa cosa?
PS: potrebbe anche dirci il nome del file d'esempio da usare nei test di leggiTokens?
-- Comment added by
GiovanniColombi on 12 May 2005
File Token
dalla bozza 2: [CUT] Si assuma che il file sia corretto e che finisca per \n [CUT]
prego
-- Comment added by
GiovanniColombi on 12 May 2005
Double Key Found
Quando vado ad inserire una chiave già presente,devo inserirla nel dizionario e tornare KEY_DOUBLE_FOUND oppure non la inserisco nel dizionario perchè già presente e torno semplicemente KEY_DOUBLE_FOUND??Grazie
-- Comment added by
MarcoMagnaneschi on 13 May 2005
Chiarimenti......
Ciao, dato che purtroppo non sono riuscito a venire a lezione vorrei se possibile dei chiarimenti su questo modulo, la funzione calcola peso non riesco a capire bene cosa fa nella sua parte iniziale qualcuno potrebbe gentilmente spiegarmelo?
Da quello che ho capito io una volta che abbiamo preso i valori con la leggi token li dobbiamo mettere con la inserisci nel nostro dizionario in maniera ordinata (l'ordine è dato dalle chiavi e non dal valore)e così per tutte le chiavi che vengono lette, finito questo, dobbiamo chiamarci la calcola peso che prende il nostro dizionario e il fantomatico vettore Token tokens[] che non ho capito bene a cosa serva......insomma un anima pia che mi spieghi la funazione calcola peso nella quale credo vada usata anche la cercaValore
-- Comment added by Users.691942 on 13 May 2005
Risposte
RE: form di consegna
L'ho sistemata.
RE: Spazio in memoria
Certo che devi ricordare la dimensione, sennò come controlli se non ne devi inserire più?
Ma non c'e' bisogno di averla in tutti i nodi dell'albero
Ti servono DUE struct, una esterna (il diz) ed una interna (i nodi del diz)
RE: Nomi di file standard
Certamente
RE: File Token
Il nome del file finisce con '\0' (visto che è una stringa)
Il file finisce con '\n' e poi c'e' l'EOF
RE: Errore in testModulo3.h ???
Includete voi i file .h necessari
RE: file di esempio
Mettiamoci d'accordo che il nome del file di esempio sia
dizionario.txt
RE: Double Key Found
La seconda che hai detto
-- Comment added by
AndreaSterbini on 13 May 2005
dizionario.txt
Ho messo in attachment a
ModuloTre uno (scemo) esempio di
dizionario.txt
-- Comment added by
AndreaSterbini on 13 May 2005
DUBBIO: struct dizionario
io ho usato una hash-table, dove ho due strutture definite nel modo seguente, cioe' la struttura dizionario: contenente un campo con la dimensione e un campo con un puntatore a una struttura formata dai due campi: chiave e dizionario. Volevo capire se puo' andare bene? grazie
-- Comment added by
SalvatoreDiPasquale on 13 May 2005
dubbio struct dizionario
scusate i due campi sono chiave e posizione.
-- Comment added by
SalvatoreDiPasquale on 13 May 2005
leggiTokens()
se durante la lettura e inserimento nel dizionario la funzione inserisciValore() che questa funzione chiama restituisce DOUBLE_KEY_FOUND come ci si comporta??ritorniamo l'errore o semplicemente lo ignoriamo e si prosegue con l'inserimento??
-- Comment added by
TizianoFranchi on 13 May 2005
Calcolo del peso
Se nn ho commesso errori... sia good che bad (per il calcolo del peso finale) sono calcolati sui 20 token piu significativi(a distanza maggiore).
bad è uguale alla produttoria dei pesi spam compresi nei 20 token, e good alla produttoria dei pesi ham... giusto?
-- Comment added by
GiuseppeIamele on 13 May 2005
calcolo del peso
No..il calcolo va fatto senza distinguere se il peso è spam o ham. Ovvero le due produttorie vanno fatte su gli stessi valori, solo che bad=bad * peso mentre good=good * (1-peso) inizializzando sia bad che good a 1.0
-- Comment added by
TizianoFranchi on 13 May 2005
E se i tokens sono tutti uguali?
Non mi è ben chiara una cosa....
Nelle specifiche di calcolaPeso c'è scritto di calcolare il peso dell'email in base ai primi VENTI tokens DIVERSI ... e se i tokens sono tutti uguali?
mettiamo che il body di un email è
viagra viagra viagra viagra viagra viagra viagra
viagra viagra viagra viagra viagra viagra viagra
viagra viagra viagra viagra viagra viagra viagra
viagra viagra viagra viagra viagra viagra viagra
Come devo comportarmi?
I token DIVERSI in "tokens" di sicuro non arrivano a venti, quindi devo considerare al MASSIMO i primi venti token o devo fare il calcolo quando ho MINIMO venti token?
-- Comment added by
MarcoEsposito on 14 May 2005
Senza titolo?
-- Comment added by
MarcoEsposito on 14 May 2005
E se i tokens sono tutti uguali?
ok ok ho leggendo sopra ho concluso che devo fare il calcolo con i token che ho ...
-- Comment added by
MarcoEsposito on 14 May 2005
E se i tokens sono tutti uguali
se sono tutti uguali tu comunque devi prendere quelli diversi quindi nel caso dell'email con scritto solo viagra questo sarà l'unico token da considerare e l'email avrà il suo peso!se ci sono meno di venti token fai il calcolo con quelli che hai!
-- Comment added by
TizianoFranchi on 14 May 2005
E se i tokens sono tutti uguali
Ok, si questo penso di averlo capito, e solo per sicurezza voglio chiedere un'altra cosa
quindi un email come ho scritto sopra ha lo stesso peso di un email che contiene solo
"viagra"
??
-- Comment added by
MarcoEsposito on 14 May 2005
E se i tokens sono tutti uguali
Si perchè il prof ha detto che le occorrenze non vanno prese in considerazione
-- Comment added by
TizianoFranchi on 15 May 2005
contesti e parole
professore, mi dica se ho capito bene: io prima tokenizzo una email creando un vettore di strutture Token, le quali contengono (ciascuna) un campo "contesto" opzionale e un campo "valore" sempre presente; prendiamo in esame gli elementi con entrambi i campi presenti, ad esempio
"From:*Alberto"
; a questo punto io chiamo la calcolaPeso passandogli il puntatore a questo vettore nonché un bel dizionario contenente tutti i pesi; nel dizionario (che io ho implementato ad albero) potrebbe anche esserci un nodo la cui chiave è
"From:*Alberto"
e con un certo peso; dunque io per sapere il peso di quella roba nel dizionario devo cercare
"From:*Alberto"
, e non solo "Alberto", quindi per avere la stringa da cercare nel dizionario non devo cercare direttamente token[i].parola, devo creare un nuovo buffer con il formato
"<token[i].contesto>*<token[i].parola>"
e cercare quello, giusto?
PS: potrebbe riaggiustare il forum, che qualcuno ha di nuovo sfondato il margine orizzontale? thx
-- Comment added by
AlbertoLaRocca on 15 May 2005
parametro valore
professore, ma i valori che noi assegniamo ai tokens sono sempre compresi tra 0 e 1? se sì, quando viene chiamata una funzione che ha come ingresso un parametro
double valore dobbiamo restituire INVALID_PARAMETER se questo è negativo o strettamente maggiore di 1?
-- Comment added by
AlbertoLaRocca on 15 May 2005
ommioddio, voglio tornare al liceo!!!

adesso mi sono pure scordato l'italiano: "
ASSEGNIAMO"!!!! ma dimmi te!!
-- Comment added by
AlbertoLaRocca on 16 May 2005
Risposte
RE: leggiTokens()
Direi di tornare immediatamente l'errore.
RE: E se i tokens sono tutti uguali
Non era questo che volevo, ma mi rendo conto che è troppo tardi per cambiare.
Quindi stabiliamo che:
- si moltiplicano tra loro i primi venti token diversi
- e che le ripetizioni dello stesso token vengono ignorate
PS nel prossimo modulo metto le occorrenze
RE: contesti e parole
Esatto, il token è
contesto*parola
RE: parametro valore
Sì, direi di tornare errore.
Il valore dev'essere compreso tra 0 e 1
-- Comment added by
AndreaSterbini on 16 May 2005
Segmentation Fault in calcolaPeso
Se creo manualmente un vettore Token, con vari elementi e lo mando a calcolaPeso, tutto ok, se gli mando un token creato con tokanizzaEmail, limitandolo a 50-60 "quanti" tutto ok, ma se vado oltre, impazzisce...(i token sono molti di più, e se finiscono prima di "quanti" non va oltre) qualcuno è disposto ad aiutarmi...? PLEASE
-- Comment added by
AlessandroGrottoli on 16 May 2005
Funzione di Hash
Sbaglio a dichiararla nel file dizionario.h e scriverla in modulo3.c?
-- Comment added by
AlessandroGrottoli on 16 May 2005
test sulla freeDizionario
Come faccio a verificare che la freeDizionario liberi effettivamente TUTTA la struttura dizionario con tanto di handler, nodi, sotto-nodi, etc?
A run-time penso sia possibile usare un debugger (quale mi consigliate?) per "spiare" nella memoria dinamica, ma come faccio a scrivere una funzione di test?
-- Comment added by
AndreaMantoni on 16 May 2005
Io purtroppo non ho capito molto a questo punto del
CalcolaPeso, prendiamo solo i primi 20 Token diversi e facciamo le produttorie, senza fare il calcolo con le occorrenze?
-- Comment added by
SimoneMurzilli on 16 May 2005
a proposito della deallocazione del dizionario
nn avevo letto che la struttura di handling dell'hash table doveva essere dinamica(ma in teoria nn dovrebbe essere un vettore???)cmq alberto quando ho parlato di free non intendevo free() ma freeDizionario() che come avrai ormai capito per un vettore nn era molto indicata...cmq qualcuno di voi ha avuto problemi di multiple definitions nei .h?
-- Comment added by
AndreaFerraresi on 16 May 2005
parametro valore
ma deve essere diverso sia da 0.0 che da 1.0 giusto? quindi l'errore invalid_parameter viene lanciato anche in questo caso
-- Comment added by
TizianoFranchi on 16 May 2005
RE: test sulla freeDizionario
Non si può testare la funzione free(), poichè non torna nessun error-code e non setta neanche errno. In più il suo comportamento in casi "speciali" è indefinito. Generalmente si assume che free() vada a buon fine. Quindi personalmente nel test su RESULT_OK di freeDizionario() controllo solo che il codice di ritorno è appunto RESULT_OK. Qualcuno conosce un modo migliore?
-- Comment added by
GiovanniColombi on 16 May 2005
[OT] Brevetti software: 17/5 mobilitazione nazionale
Penso sia una cosa importante che ci riguarda tutti:
http://punto-informatico.it/p.asp?i=52786
Se qualcuno è interessato si continua in
OffTopic. Altrimenti scusate l'ot.
-- Comment added by
GiovanniColombi on 16 May 2005
cerca valore
se ho trovato la chiave, torno il valore associato nella variabile(passata per puntatore) e return (RESULT_OK)?
-- Comment added by
SalvatoreDiPasquale on 16 May 2005
cerca valore
Si Salvo!!
-- Comment added by
MarcoMagnaneschi on 17 May 2005
Dubbio su BAD E GOOD
Ma Bad è semplicemente il prodotto degli Wi pesi e Good è il prodotto degli (1-Wi) pesi???GRAZIE
-- Comment added by
MarcoMagnaneschi on 17 May 2005
Dubbio su BAD E GOOD
si, almeno così è scritto sulle specifiche
-- Comment added by
RiccardoVona on 17 May 2005
Contesto o Parola?
Ma le chiavi contenute nella struttura Token sono nel campo "contesto" o "parola"? Io ho sempre assunto il campo "parola" come quello in cui è sta la chiave, ma leggendo qualche affermazione nel forum ho qualche dubbio di questa mia scelta.
-- Comment added by
MassimilianoNatale on 17 May 2005
contesto o parola?
se il campo contesto è NULL allora la chiave si trova solo su parola ma se non è NULL allora la chiave te la devi costruire come abbiamo fatto per la printTokens() del primo modulo...ovvero contesto*parola
-- Comment added by
TizianoFranchi on 17 May 2005
Confusione
da quello che so io per calcolare l'hash di una parola serve la dimensione della hash table se non posso dichiarare variabili globali come faccio a tenermi dim?oppure posso dichiarare variabili globali in via del tutto eccezionale??explain it please
-- Comment added by
AndreaFerraresi on 17 May 2005
Confusione
è concettualmente errato memorizzare la dimensione dell'hash table al di fuori di essa: memorizzala all'interno della struct Dizionario.
-- Comment added by
AlbertoLaRocca on 17 May 2005
Risposte
RE: Funzione di Hash
Non credo, visto che i due files andranno sempre in coppia.
RE: test sulla freeDizionario
Buona domanda ...
Io faccio comunque una analisi della memoria non deallocata ... vedrete i nuovi run dei test ...
RE: calcolaPeso
Esatto
-- Comment added by
AndreaSterbini on 17 May 2005
RE: Confusione
Puoi incapsulare la tua hashtable in una struct in cui metti la dimensione e le altre informazioni relative alla hashtable.
Fai conto che stai costruendo un oggetto

(nel senso della OOP)
-- Comment added by
AndreaSterbini on 17 May 2005
Problema fabs
Ho un problema con la fabs (a parte che nell'ordinamento delle distanze i valori ricavati da valori negativi è più "pesante" di quelli già positivi). Cmq il mio problema è un'altro quando cerco le distanze superiori al 20°token il test arriva fino alle distanze ricavate da valori positivi...le distanze negative(rese positive dalla fabs) non passano il test...qlc ha avuto questo problema??? (con la printf danno gli stessi valori...)
-- Comment added by
SimoneMurzilli on 17 May 2005
Problema fabs...
Penso sia del tutto normale una cosa del genere Simone...!!!
-- Comment added by
DavidBenedetti on 17 May 2005
Problema fabs
quindi, è giusto che pur avendo la stessa distanza non passi il test?
-- Comment added by
SimoneMurzilli on 18 May 2005
Per vedere se ho implementato bene la calcolaPeso...
Potrebbe farci un esempio di un'email tokenizzata e del peso ad essa associata?
(assumendo che i pesi vengano letti da "dizionario.txt")
-- Comment added by
AndreaMantoni on 18 May 2005
già
sarebbe servito anche a me, ma temo che ormai non si faccia in tempo purtroppo ^^
incrociamo le dita

a me apparentemente funziona
-- Comment added by
AlbertoLaRocca on 18 May 2005
test su calcolaPeso
professore, alcuni test sulla calcolaPeso mi falliscono perché di fatto la calcolaPeso riesce a calcolare il giusto valore in virgola mobile della mail, ma ci sono dei problemi quando vado a confrontare il risultato ottenuto con quello che avrei voluto ottenere. mi spiego meglio: inizialmente in un test la calcolaPeso mi restituiva 0.1, e il risultato che volevo ottenere era appunto 0.1, però la funzione di test mi dava TEST_FAILED; inizialmente non ne capivo il motivo, poi ho fatto un memory dump del valore 0.1 e del risultato ottenuto dalla calcolaPeso (apparentemente sempre 0.1) e mi sono accorto che effettivamente i due valori erano diversi, ma lo erano
di un unico bit
; di conseguenza i due valori double rappresentavano (quasi!) lo stesso valore e la calcolaPeso faceva correttamente il suo lavoro, ma il test falliva. lo so che è un po' tardino per accorgersene, ma vorrei che ne tenesso conto anche lei quando farà i test. grazie
-- Comment added by
AlbertoLaRocca on 18 May 2005
Primi tests
Ho appena messo in linea qualche primo test del modulo 3
-- Comment added by
AndreaSterbini on 30 May 2005
No such template def TMPL:DEF{PROMPT:thread}
- Se usate dei titoli comprensibili ci capiamo tutti un po' meglio
- Ricordatevi di chiudere i tag che inserite nei post.
- C'è una pagina apposta per gli OffTopic.
--
AndreaSterbini - 28 Apr 2005