PDA

Visualizza la versione completa : [C]Occorrenze di parole


Breath15
05-11-2012, 18:53
Salve a tutti,
sono alle prese con un algoritmo da questa mattina e non riesco a trovare la soluzione finale. Non capisco se è un problema di logica oppure mi manca qualche "funzione" del linguaggio C che mi possa facilitare il compito.
Vi posto il testo dell'esercizio e il codice che ho fatto io sperando che possiate darmi una dritta o qualche consiglio!

Testo:

Si scriva un programma in grado di contare le occorrenze di ogni parola, appartenente a un insie-me specificato, all’interno di un generico testo. Più in dettaglio, l’elenco delle parole da ricercare è memorizzato in un file di testo, in ragione di una parola per riga del file. La lunghezza delle singole parole è limitata a 20 caratteri, e inoltre il numero totale di tali parole è indicato sulla prima riga del file stesso. Le parole così specificate devono essere ricercate in un testo memorizzato in un secondo file. Il numero di righe di questo file è indefinito, ma si può assumere che la lunghezza di ogni riga sia al più pari a 100 caratteri. Come output, il programma deve riportare su video l’elenco delle parole contenute nel primo file, ciascuna seguita dal numero di occorrenze con cui compare nel testo contenuto nel secondo file. Si noti che i due file devono essere letti una volta sola. Si trascurino i possibili problemi derivanti dall’uso della punteggiatura (ovvero si considerino le stringhe “parola”, “parola.”, “parola!”, etc., come diverse).


#include <stdio.h>
#include <stlib.h>

#define ROW 100
#define COL 20+2 /* 20 + \n + \0 */

int load(char words[ROW][COL]); /* definizione funzione per caricare le occorrenze */
int find(char words[ROW][COL]);// definizione funzione per trovare le occorrenze nel 2file

// main con chiamata alle funzioni
int main (void)
{
char words[ROW][COL];
chiamate alle funzioni...
}
//funzione che legge dal primo file e carica le occorrenze da trovare in un vettore "words"
int load(char words[ROW][COL]
{
FILE *fp;
int n, i;

fp=fopen("occorrenze.txt", "r");
if (fp == NULL) {
printf("Error opening the occorrenze file!\n");
return 0;
}
fscanf(fp, "%d" &n);
for (i=0; i<n; i++)
fscanf (fp, "%s", words[n]);

fclose(fp);

return 1;
}

//funzione che confronta le occorrenze con il 2 file
int find(char words[ROW][COL]
{
FILE *fpr, *fpw;
char buf[ROW];
int id, k;

fpr = fopen("citazioni.txt", "r");
if (fpr == NULL) {
printf("Error opening the input text file!\n");
return 0;
}
fpw = fopen("output.txt", "w");
if (fpw == NULL) {
printf("Error opening the output text file!\n");
return 0;
}


while (fgets(buf, ROW, fpr) != NULL) {
k=0;
while (buf[k] != '\0') {
if (buf[k] != ' ') {
strcmp ???






fclose(fpr);
fclose(fpw);

return 1;
}


Dunque il mio problema è: come faccio a confrontare una parola contenuta in un array con tutte le parole della riga contenute nel 2 array?
Oppure devo ragionare in maniera diversa?

Esempio:
Sia il file con l’elenco delle parole da ricercare il seguente:
4 edison
e’
genio
citazione

e il file con il testo il seguente:
il genio non e’ altro che una grande attitudine alla pazienza, Buffon
il Genio e’ la punta estrema della saggezza, Cocteau
il GENIO e’ 10% ispirazione e 90% sudore, Edison
Io un genio? Non diciamo sciocchezze..., Anonimo
NON occorre essere un GeNiO per risolvere questo esercizio

Il programma deve dunque visualizzare il messaggio: edison – 1 occorrenza/e e’ – 3 occorrenza/e genio – 4 occorrenza/e citazione – 0 occorrenza/e

21Edoardo96
05-11-2012, 20:25
Ciao,
benvenuto nel forum. Quando lo compili ti da errori o no?

Breath15
05-11-2012, 20:36
Ciao :ciauz: , grazie!

Non l'ho ancora compilato perchè non è finito. Manca la funzione principale e le chiamate alle funzioni nel main... :dhò:

infoartenovo
06-11-2012, 15:12
In realtà, se ci rifletti bene, non hai bisogno di caricare il file da esaminare in un array. Ti basta leggere il file e per ogni parola che leggi effettuare il confronto con le tue keyword, se corrisponde ad una keyword allora incrementi il contatore ad essa relativa.
Quindi devi progettare delle strutture dati che ti aiutino a fare questa cosa.

Breath15
10-11-2012, 17:34
Dunque alla fine sono riuscita a creare qualcosa di funzionante.
Non so se è il modo migliore per risolvere il problema ma vorrei postare lo stesso il mio codice, potrebbe essere utile a qualcuno o chissà anche una buona occasione per confrontarsi.



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define ROW 100
#define COL 20+2 /* 20 + \n + \0 */

int load(char words[ROW][COL], int*occurences); /* definizione funzione per caricare le occorrenze */
int find(char words[ROW][COL], int*occurences, int numeroparole);// definizione funzione per trovare le occorrenze nel 2file

// main con chiamata alle funzioni
int main (void)
{
FILE *fpw;
char words[ROW][COL];
int numeroparole, *occurences, i;

numeroparole=load(words, occurences);

fpw = fopen("output.txt", "w");
if (fpw == NULL) {
printf("Error opening the output text file!\n");
return 0;
}

printf("numeroparole da cercare = %d\n parole:\n\t", numeroparole);
for (i=0; i<numeroparole; i++)
printf("%s\n\t", words[i]);
printf("-----------------------\n");


if (numeroparole!=0) {
occurences = (int*)malloc(numeroparole*sizeof(int));
find(words, occurences, numeroparole);
}
for (i=0; i<numeroparole; i++){
fprintf(fpw," occorrenze di %s: ", words[i]);
fprintf(fpw,"%d\n", occurences[i]);
}
system("PAUSE");
return 0;
}
//funzione che legge dal primo file e carica le occorrenze da trovare in un vettore "words"
int load(char words[ROW][COL], int*occurence)
{
FILE *fp;
int n, i, l;
char parola[20];

fp=fopen("occorrenze.txt", "r");
if (fp == NULL) {
printf("Error opening the occorrenze file!\n");
return 0;
}
fscanf(fp, "%d", &n);
for (i=0; i<n; i++){

fscanf (fp, "%s", parola);

for (l=0; l<strlen(parola); l++)
parola[l]=tolower(parola[l]);

strcpy(words[i], parola);
}


fclose(fp);

return n;
}

//funzione che confronta le occorrenze con il 2 file
int find(char words[ROW][COL], int*occurences, int numeroparole)
{
FILE *fpr, *fpw;
char riga[100];
int id, k, l;

for (k=0; k<numeroparole; k++)
occurences[k]=0;

fpr = fopen("citazioni.txt", "r");
if (fpr == NULL) {
printf("Error opening the input text file!\n");
return 0;
}
fpw = fopen("output.txt", "w");
if (fpw == NULL) {
printf("Error opening the output text file!\n");
return 0;
}

while (fscanf(fpr, "%s", riga) != EOF) {


for (l=0; l<strlen(riga); l++)
riga[l]=tolower(riga[l]);

for (k=0; k<numeroparole; k++){
if (strcmp(words[k], riga)==0){
occurences[k]++;
}
}
}

fclose(fpr);
fclose(fpw);

return 1;
}

Loading