LabASD - Conta il numero di parole uniche in un file

Moreno Marzolla moreno.marzolla@unibo.it

Ultimo aggiornamento: 2021-05-01

Scrivere un programma che legga un documento di testo da standard input o da file, e determini il numero di parole distinte in esso contenuto; ogni parola deve essere contata una sola volta, e non si fa distinzione fra lettere maiuscole e minuscole. Per la lettura del file e la conversione dei caratteri in minuscoli può essere utile fare uso delle funzioni fgetc() (dichiarata in <stdio.h>) e tolower() (dichiarata in <ctype.h>).

Per "parola" si intende una sequenza contigua di caratteri per i quali la funzione isalpha() restituisce un valore diverso da zero. Ad esempio, la stringa i diritti inviolabili dell'uomo è composta da cinque parole: i, diritti, inviolabili, dell e uomo. Per semplicità, si assuma che tutte le parole abbiano lunghezza strettamente minore a WORDLEN.

Si presti attenzione ad una particolarità del linguaggio C. Il tipo char (senza ulteriori specificazioni) potrebbe essere signed o unsigned. In molti sistemi (tra cui il mio) è signed; questo significa che in questo frammento di codice:

char c;
...
c = fgetc(stdin);
if (isspace(c)) { ... }

se alla variabile c viene assegnato il codice ASCII del carattere è (195), in realtà c contiene -61, perché la rappresentazione binaria di 195 interpretata in complemento a due con 8 bit è quella del valore -61. Di conseguenza la funzione isspace(c) riceve un valore negativo e potrebbe sollevare una eccezione o restituire un valore non valido.

Il modo corretto è di dichiarare c di tipo int:

int c;
...
c = fgetc(stdin);
if (isspace(c)) { ... }

Si noti che non sarebbe corretto definire c di tipo unsigned char, perché in caso di fine file, la funzione fetc() restituisce il valore EOF che normalmente è codificato con -1.

In ogni caso, nei file di testo forniti non ci sono caratteri ASCII estesi, per cui i problemi di cui sopra non dovrebbero manifestarsi.

Come esempio di funzionamento, nel testo:

La Repubblica riconosce e garantisce i diritti inviolabili
dell'uomo, sia come singolo, sia nelle formazioni sociali ove si
svolge la sua personalita', e richiede l'adempimento dei doveri
inderogabili di solidarieta' politica, economica e sociale.

sono presenti 36 parole:

la
repubblica
riconosce
e
garantisce
i
diritti
inviolabili
dell
uomo
sia
come
singolo
sia
nelle
formazioni
sociali
ove
si
svolge
la
sua
personalita
e
richiede
l
adempimento
dei
doveri
inderogabili
di
solidarieta
politica
economica
e
sociale

di cui 32 distinte.

File