Il programma mi chiede questo:
Si scriva un programma in grado di contare le occorrenze di ogni parola, appartenente a un insieme 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. 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.”, etc., come diverse).
ESEMPIO FILE1
4
edison
e’
genio
citazione
ESEMPIO FILE2
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
Questo è il codice che ho scritto:
codice:
int main ()
{
char** diz = NULL; int num, i=0; int* v;
num = Elabora_file1(&diz);
if (num == -1){
return 1;
}
v = malloc(num*sizeof(int));
for(i=0; i<num; i++)
v[i] = 0;
if (Elabora_risultati(&num, diz,v));
else return 1;
Stampa_risultati(num, diz, v);
return 0;
}
Funzione che legge il primo file. La prima riga del file contiene il numero di parole contenute nel file stesso. Utilizzo il risultato della prima fscanf per allocare la matrice.
Dopodichè memorizzo nella matrice le parole estraendole dal file attraverso un ciclo di fscanf
codice:
int Elabora_file1 (char*** diz)
{
FILE* pf1; int num, i=0;
pf1 = fopen(f1, "r");
if (pf1 == NULL){
printf ("Errore apertura del file!\n");
return -1;
}
fscanf (pf1, "%d", &num);
*diz = Alloca_diz(num);
while (fscanf(pf1, "%s", (*diz)[i]) != EOF){
i++;
}
fclose(pf1);
return num;
}
Funzione che mi alloca la matrice
codice:
char** Alloca_diz (int num)
{
char** m; int i=0;
m = malloc(num*sizeof(char*));
for (i=0; i<num; i++){
m[i] = malloc(MAXLEN*sizeof(char));
} //allocazione della matrice 1
return m;
}
Funzione che mi ricerca nel secondo file le parole memorizzate dal primo file e incrementa le caselle di un vettore v, precedentemente allocato ed inizializzato a zero, in modo da tener conto delle occorrenze.
codice:
int Elabora_risultati (int* num, char** diz, int* v)
{
FILE* pf2; char stringa[MAXLEN]; int i=0;
pf2 = fopen(f2, "r");
if (pf2 == NULL){
printf ("Errore apertura del file!\n");
return -1;
}
while (fscanf(pf2, "%s", stringa) != EOF){
for(i=0; i<num; i++){
if (strcmp(stringa,diz[i]) == 0)
v[i]++;
}
}
fclose(pf2);
return 1;
}
Funzione di stampa
codice:
void Stampa_risultati(int num, char** diz, int* v)
{
int i=0;
for(i=0; i<num; i++){
printf ("%s:\t%d volta/e\n", diz[i], v[i]);
}
return;
}
Ho omesso le parti in cui libero la memoria perchè ho scritto il codice di botto e me n'ero scordato