PDA

Visualizza la versione completa : [C]creare file indice NO PAROLE DOPPIA


esoni
22-05-2010, 05:21
ciao avrei un problema,
devo implementare un programma che dato un file A stampi su un file index.txt tutte le parole presenti nel file A col seguente formato *parola1*parola2* scrivendo la parola su index solo se non l ho gia scritto
chiarisco con un esempio
file A:
ciao luca come stai
ciao matteo come stai
io bene ciao ciao ciao

file index(contiene tutte le parole presenti in file A senza i doppioni):
*ciao*luca*come*stai*matteo*io*bene*


vi spiego il mio problema,devo implementare il programma con due vincoli
1)non devo modificare il file A
2)deve essere OTTIMO come tempo di esecuzione il programma anche s un file di testo lungo

vi dico la mia soluzione che pero non reputo ottima
-uso una stringa di appoggio molto lunga che chiamo CNT
-leggo una parola alla volta dal file(eliminando opportunatamente spazi e caratteri di punteggiatura)
-la prima parola che leggo la scrivo dentro CNT con '*' prima e dopo--> *parola*
-continuo a leggere le parole dal file A una dopo l altra e tramite strstr controllo se *parola* letta è contenuta in CNT se non è contenuta la concateno a CNT .(QUESTA FASE E' QUELLA CHE REPUTO LA PIU ONEROSA IN QUANTO STRSTR SCORRE TUTTA LA STRINGA CNT ,CHE E' MOLTO LUNGA IN QANTO CONTIENE LE PAROLE DEL FILE,E IN PIU L OPERAZIONE DI CONCATENAMENTO)
-finito di leggere tutto il file A,CNT conterrà *parola1*parola2*...* cioè tutte le parole (NON DOPPIONI)separate da *. A questo punto stampo la stringa CNT sul file index.txt

avete in mente una soluzione migliore??
vi ringrazio gia in anticipo,spero di essere stato chiaro vi aggiungo uno pseudocodice della mia soluzione

//leggo prima parola del file
//sprintf su CNT di *parola*
//WHILE(NON E' FINITO IL FILE)
//LEGGO PAROLA
// STRSTR(CNT,*PAROLA*
//SE NON è CONTENUTA IN CNT CONCATENO *PAROLA* CON CNT USANDO L APPOSITA FUNZIONE DI STRING.H

//ALLA FINE FPRINTF(INDEX.TXT,CNT);

oregon
22-05-2010, 08:18
Stai studiando a scuola? Quali argomenti hai affrontato?

Array?
Ordinamenti?
Strutture?
Allocazione dinamica?
Alberi?

esoni
22-05-2010, 12:04
si sto studiando a scuola..
diciamo s array ordinamenti
strutture allocazione dinamica sono un po piu ferrato
mentre su alberi e liste non l ho ancora studiate ma se è la soluzione piu ottimale sono disponibile anche a studiarle..te damme quelache dritte :-)

oregon
22-05-2010, 13:05
Usa un array inserendo le parole che leggi in modo ordinato nello stesso. Se mantieni l'array ordinato, puoi facilmente cercare la parola per vedere se esiste (ad esempio, con una ricerca binaria). Alla fine potrai scrivere l'array ordinato nel file di destinazione, sicuro che le parole saranno presenti una sola volta.

esoni
22-05-2010, 18:35
ma ogni volta che inserisco la parola,devo ordinare l array??
quindi ricapitolo
-prendo la parola da file
-ricerca binaria(parola,array)
-senon è presente la inserisco nel array
-ordino l array

itero queste operazioni,alla fine stampo il contenuto nell array

oregon
22-05-2010, 19:52
No ... l'array non deve essere ordinato. La ricerca binaria ti indica anche in quale posizione deve essere inserita la nuova parola. Dovrai quindi spostare tutti gli elementi in avanti di una posizione per fare posto al nuovo.

Questo è ovviamente inefficiente. Se implementassi una "lista semplice" ordinata secondo la parola, potresti inserire il nuovo dato semplicemente lavorando con i puntatori agli elementi della stessa.

esoni
22-05-2010, 19:58
se tu mi dessi maggiori info sulla soluzione con una lista semplice te ne sarei grato, mi metterei subito alavoro :-)
preferisco intraprendere la via delle liste se è piu efficente

oregon
22-05-2010, 20:05
Se tu cercassi un po' su google in base a quello che ti si suggerisce ...

Cerca

Linked list

esoni
22-05-2010, 20:14
scusa mi sono sbagliato ,non voglio sapere come funzionano le linked list(quello lo so) volevo sapere la tattica che avevi in mente per risolvere il mio problema con l uso delle linked list

oregon
22-05-2010, 20:17
Piu' che una linked list, mi sembra necessario che tu utilizzi un albero binario.

Loading