Ultimo aggiornamento: 2021-04-22
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 MAXLEN
.
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 consguenza 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()
resituisce 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.