.dsy:it.
Show 150 posts per page

.dsy:it. (http://www.dsy.it/forum/)
- Forum De Bell Tolls (http://www.dsy.it/forum/forumdisplay.php?forumid=7)
-- [INFORMATICA] conteggio stringhe ripetute (C) (http://www.dsy.it/forum/showthread.php?threadid=8361)


Posted by Flyzone on 28-01-2004 01:43:

Question [INFORMATICA] conteggio stringhe ripetute (C)

Help...mi ritrovo un file di testo di lunghezza massima N, con un tot di stringhe ripetute;
devo contare per ogni parola, quante volte è ripetuta...
Non mi viene in mente un algoritmo decente...o per meglio dire non sò come non far ricontare la stessa parola quando con fseek ritorno al punto di partenza... uffff odio il C per queste cose!
Stò usando fgets fprintf su di un file in input (in sola lettura) e uno in output.

E' per uso personale, non fa parte di nessun progetto della nostra uni (almeno x quel che ne sò io!)

P.S: da evitare esplicitamente puntatori, array bidimensionali, alberi, il file non è ordinato e sopratutto non si possono usare funzioni del C++ :roll: (la ucciderei certa gente)


Posted by Hamelin on 28-01-2004 08:34:

Non puoi salvare ogni stringa già contata in un array e prima di ogni fseek fare un bel strcmp? Non ho idea di come funzioni fseek perché non l'ho mai usata, quindi potrei dire una marea di str****te....

__________________
Bjarne Stroustrup: "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone."
Andrew S. Tanenbaum: "Never underestimate the bandwidth of a station wagon full of tapes hurtling down the highway."
Edsger Dijkstra: "Computer Science is no more about computers than astronomy is about telescopes."
Robert Firth: "One of the main causes of the fall of the Roman Empire was that, lacking zero, they had no way to indicate successful termination of their C programs."
Donald Knuth: "A mathematical formula should never be 'owned' by anybody! Mathematics belong to God."


Posted by Flyzone on 28-01-2004 09:32:

Originally posted by Hamelin
strcmp?

ma non confrontava due stringhe e basta?
Cioè se strcmp(s1,s2)=0 le stringhe sono uguali altrimenti sono diverse..non mi dice se è _contenuta_ ...
Avrei qualcosa come

ciao sono un gatto nero gatto
come la pece ciao

mi dovrebbe ridare un:
ciao 2
gatto 2
sono 1
pece 1
(etc....)


Posted by Hamelin on 28-01-2004 10:11:

Ma fseek cosa fa esattamente?

__________________
Bjarne Stroustrup: "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone."
Andrew S. Tanenbaum: "Never underestimate the bandwidth of a station wagon full of tapes hurtling down the highway."
Edsger Dijkstra: "Computer Science is no more about computers than astronomy is about telescopes."
Robert Firth: "One of the main causes of the fall of the Roman Empire was that, lacking zero, they had no way to indicate successful termination of their C programs."
Donald Knuth: "A mathematical formula should never be 'owned' by anybody! Mathematics belong to God."


Posted by Flyzone on 28-01-2004 10:46:

Originally posted by Hamelin
Ma fseek cosa fa esattamente?

se scorri uno stream, la fseek ti permette di posizionarti in una determinata posizione, solitamente viene utilizzata per "riavvolgere" lo stream :)


Posted by Hamelin on 28-01-2004 10:50:

Ma se tu facessi così, invece?: apri il file in lettura e usando fgets di leggi una dopo
l'altra tutte le parole del file (senza doverlo leggere più volte)... memorizzi la prima
parola in una struct semplicissima che presenta due attributi (un char[] per memorizzare
la stringa di lettera della parola e un int per il numero di occorrenze); dopo di che
per la parola successiva, confronti quello che ti ritorna il fgets con la stringa salvata
nella struct: se è uguale aggiugi 1 al numero di occorrenze, se è diverso costruisci una
nuova struct contenente la nuova parola; alla lettura successiva dovrai usare strcmp con
entrambe le stringhe contenute nelle due struct e così via... naturalmente non è il
massimo della velocità perché è pieno di cicli... ma è semplice e credo che funzioni.

__________________
Bjarne Stroustrup: "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone."
Andrew S. Tanenbaum: "Never underestimate the bandwidth of a station wagon full of tapes hurtling down the highway."
Edsger Dijkstra: "Computer Science is no more about computers than astronomy is about telescopes."
Robert Firth: "One of the main causes of the fall of the Roman Empire was that, lacking zero, they had no way to indicate successful termination of their C programs."
Donald Knuth: "A mathematical formula should never be 'owned' by anybody! Mathematics belong to God."


Posted by Lord_Tom on 28-01-2004 11:57:

Sono d' accordo con Hamelin.
Tuttavia non pensare troppo all' ottimizzazione, se il file che devi processare non è lungo diversi mega bytes.

Un' alternativa è usare un file che memorizza le parole e i relativi contatori.
non guardare la sintassi che è orribile e sbagliata, ma il concetto sottostante
Quindi (scrivo in un pseudo c )
while (!EOF)
{
String mystring = GiveMeNextString();
if (ThisIsNewString(mystring))
{
Myfileadd(mystring);
Myfileadd((char) 0); /* non mi ricordo molto del c come puoi notare... */
}
else {
int posizione = Myfileselect(mystring);
Myfileincrementcount (posizione);
}
/* ora leggiti il file */
}

boolean ThisIsNewString (String mystring)
{
/* scorri il file esaminando ogni stringa
e facendo una strcmp */
if... return true;
return false;
}


Posted by Flyzone on 28-01-2004 22:04:

Originally posted by Hamelin
Ma se tu facessi così, invece?: apri il file in lettura e usando fgets di leggi una dopo l'altra tutte le parole del file (senza doverlo leggere più volte)

Buona l'idea delle struct, ma la fregatura è che fgets piglia una stringa (si ferma al '\n') e non una parola, ed una riga è lunga all'incirca 5000 caratteri [...].
stavo pensando al fgetc, ma mi ritrovo in cicli e sottocicli cmq...sono a due pagine di roba ufff :sad:
Lo ammetto, in questo caso rimpiango amaramente di non poter usare il visual basic, in 10 minuti era fatto :sad:

Openoffice ha mica una funzione di conteggio delle parole? Hum e avrà mica i sorgenti? :D


Posted by Hamelin on 29-01-2004 08:31:

...sicuro che fgets si ferma a /n e non a /0? Fossi in te controllerei... bye!

__________________
Bjarne Stroustrup: "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone."
Andrew S. Tanenbaum: "Never underestimate the bandwidth of a station wagon full of tapes hurtling down the highway."
Edsger Dijkstra: "Computer Science is no more about computers than astronomy is about telescopes."
Robert Firth: "One of the main causes of the fall of the Roman Empire was that, lacking zero, they had no way to indicate successful termination of their C programs."
Donald Knuth: "A mathematical formula should never be 'owned' by anybody! Mathematics belong to God."


Posted by Ryudo on 29-01-2004 08:37:


Openoffice ha mica una funzione di conteggio delle parole? Hum e avrà mica i sorgenti? :D [/B]

fai prima a scaricarti le coreutils dal sito di gnu e guardarti i sorgenti di wc ;)


Posted by Flyzone on 29-01-2004 13:20:

Originally posted by Hamelin
...sicuro che fgets si ferma a /n e non a /0? Fossi in te controllerei... bye!

se lo dice man fgets :D
get = prendi
s = string = stringa = riga = \n ;)

e andiamo ad esaminare stè coreutils :D

Edit: miiiiiiiiiiiiiiiiiiiiiiiiiiii mi ero dimenticato di strtok(NULL," ") :D
ganzo!


Posted by DeepBlue on 29-01-2004 14:45:

Originally posted by Flyzone
Buona l'idea delle struct, ma la fregatura è che fgets piglia una stringa (si ferma al '\n') e non una parola, ed una riga è lunga all'incirca 5000 caratteri [...].
stavo pensando al fgetc, ma mi ritrovo in cicli e sottocicli cmq...sono a due pagine di roba ufff :sad:
Lo ammetto, in questo caso rimpiango amaramente di non poter usare il visual basic, in 10 minuti era fatto


VB ??? :sbocco:
Cmq con fgets e fseek, con un paio di cicli forse la cosa si risolve. Forse...
Dato che e` una funzione che mi servira` per il prossimo progettino, ora provo a buttare giu` qualcosa.
Ma perche` non vuoi usare i puntatori? Sono specifiche di progetto (naaaa) o ti inorridiscono? :rolleyes:

__________________
~ get Debian! ~ get FreeBSD! ~ get OpenBSD! ~


Posted by Gwath on 29-01-2004 16:08:

una bella funzione di hash??? così se non c'è la parola la metti nella tabella di hash, se c'è aumenti un contatore di 1... (troppo complicato???)
E poi gli stream non sono oggetti legati al C++ (iostream per l'i/o standard e fstream per l'i/o con files???)

Gw@th

__________________
L'ombra si nasconde nella notte, laddove neanche l'occhio piu' allenato riesce a scorgerla...
:teach:Homo sapiens non urinat in ventum:teach: Non c'è birra senza spina :teach: La vita e` il dono piu` prezioso che Giove ci ha fatto (Ali G) :teach:
Mastro Birromane della Falange Alcolica...
Gwath Lumbule... as darkness falls, he comes out! Dark Shadow's Blog
:roargh: Tu mi dai la forza per andare avanti... Non fermarti continua a spingere!!!:roargh:


Posted by DeepBlue on 29-01-2004 16:27:

Originally posted by Gwath
una bella funzione di hash??? così se non c'è la parola la metti nella tabella di hash, se c'è aumenti un contatore di 1... (troppo complicato???)

Deve cmq leggere il file parola per parola, o carattere per carattere e poi costruire l'hash table. Non gli conviene :)


E poi gli stream non sono oggetti legati al C++ (iostream per l'i/o standard e fstream per l'i/o con files???)

mmm generalmente in C si definisce stream una sorgente o una destinazione di dati.
In C++ nin zo

__________________
~ get Debian! ~ get FreeBSD! ~ get OpenBSD! ~


Posted by Gwath on 29-01-2004 19:20:

Originally posted by DeepBlue
Deve cmq leggere il file parola per parola, o carattere per carattere e poi costruire l'hash table. Non gli conviene :)


Beh ma nei confronti è molto più veloce e poi ha i record già salvati...


mmm generalmente in C si definisce stream una sorgente o una destinazione di dati.
In C++ nin zo


In C++ gli stream sono "classi" di i/o (molto più comode di printf e similari... )

__________________
L'ombra si nasconde nella notte, laddove neanche l'occhio piu' allenato riesce a scorgerla...
:teach:Homo sapiens non urinat in ventum:teach: Non c'è birra senza spina :teach: La vita e` il dono piu` prezioso che Giove ci ha fatto (Ali G) :teach:
Mastro Birromane della Falange Alcolica...
Gwath Lumbule... as darkness falls, he comes out! Dark Shadow's Blog
:roargh: Tu mi dai la forza per andare avanti... Non fermarti continua a spingere!!!:roargh:


Posted by Flyzone on 29-01-2004 19:21:

Originally posted by DeepBlue
Cmq con fgets e fseek, con un paio di cicli forse la cosa si risolve. Forse...

un paio? :eek: prego inizia tu!! (non credo proprio che quello che ho scritto sia un paio :D )


Ma perche` non vuoi usare i puntatori? Sono specifiche di progetto (naaaa) o ti inorridiscono? :rolleyes:

La prima che hai detto: specifiche di progetto :roll:
(Della serie: il capo - per niente programmatore - ha in mano un libro proibito :roll: )
Però se ci pensi è meglio così: faccio ovviamente più fatica, ma si impara di più, sotto sotto mi piace :)


Posted by DeepBlue on 29-01-2004 20:20:

Originally posted by Gwath
Beh ma nei confronti è molto più veloce e poi ha i record già salvati...


Su file molto grossi rende di più una hash table, ne convengo.
Il problema è che non può usare i puntatori, quindi la vedo dura

__________________
~ get Debian! ~ get FreeBSD! ~ get OpenBSD! ~


Posted by DeepBlue on 29-01-2004 20:22:

Originally posted by Flyzone
un paio? :eek: prego inizia tu!! (non credo proprio che quello che ho scritto sia un paio :D )

Ehm... :P
Dai vedo cosa riesco a scrivere e poi ti faccio sapere :P


La prima che hai detto: specifiche di progetto :roll:
(Della serie: il capo - per niente programmatore - ha in mano un libro proibito :roll: )

Argh! non invidio la tua posizione! Ma cercare di fargli capire i vantaggi anche a runtime che si possono ricavare dall'uso dei puntatori? Fiato sprecato immagino :(

__________________
~ get Debian! ~ get FreeBSD! ~ get OpenBSD! ~


Posted by Flyzone on 29-01-2004 23:18:

Originally posted by DeepBlue
Fiato sprecato immagino :(

Off-Topic:
psssssssssss se ti dico che vengo pagato a ore... e tanto, dici che conviene sprecare fiato? :D


Posted by DeepBlue on 29-01-2004 23:21:

Originally posted by Flyzone
Off-Topic:
psssssssssss se ti dico che vengo pagato a ore... e tanto, dici che conviene sprecare fiato? :D


Ti dico: dov'è che lavori? :D

__________________
~ get Debian! ~ get FreeBSD! ~ get OpenBSD! ~


Posted by DeepBlue on 30-01-2004 13:03:

Ho sfornato una prima versione del programmino.
Ho utilizzato i puntatori pero`, ma magari trai spunto o convinci il tuo capo :P
Volendo il programma si potrebbe ottimizzare ancora un o', vedi tu :)

Se non si legge qui sotto, vai qui

#include <stdio.h>

int main (int argc, char *argv[]){

FILE *fp;
int i=0, z=0, occorrenza=0;
char *stringa;
int dimensione;
char *buffer;
char *posizione;
char loc_buffer[40]={0};
char ch;

if (argc < 2) {
printf("\nParametro mancante. Usare 'cerca parola_da_cercare'\n");
exit(0);
}

stringa=argv[1]; // assegno a stringa la parola da cercare
dimensione=strlen(stringa); // dimensione della parola

if ((fp=fopen("testo.txt","r"))== NULL){
printf("\nIl file non esiste o e` gia` in uso\n");
exit(0);
}
while (fgetc(fp) != EOF) { // conto i caratteri presenti nel testo
i++;
}

printf("\nSalvataggio buffer");
buffer=(char *)malloc(sizeof(char) * (i+1)); // alloco lo spazio per il buffer
fseek(fp, 0, 0); // mi riposiziono all'inizio del file
i=0;
while ((ch = fgetc(fp)) != EOF) { // carico il buffer
buffer[i]=ch;
i++;
}
printf("\nBuffer salvato, inizio controllo");
for( ; z<=i; z++){ // leggo il contenuto del file
if(buffer[z]==stringa[0]){ // confronto il primo carattere della stringa con i char letti
posizione=&buffer[z]; // salvo la posizione del buffer
strncpy(loc_buffer,posizione,strlen(stringa));
// copio N caratteri su un buffer locale x non sporcare l'altro
if (strcmp(loc_buffer, stringa)==0){ // se trovo la stringa incremento il contatore
occorrenza++;
} // if strcmp
} // il confronto
} // ciclo for

fclose(fp);
free((void *) buffer); // libero la memoria
printf("\nSono state trovate %d occorrenze per la parola %s\n", occorrenza, stringa);

return 0;


}

__________________
~ get Debian! ~ get FreeBSD! ~ get OpenBSD! ~


All times are GMT. The time now is 19:45.
Show all 21 posts from this thread on one page

Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.