Enrere Mòdul 6
Fonaments de Programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 
Càlcul del nombre de línies, paraules i caràcters

En aquesta pràctica aprendrem més sobre la manipulació de cadenes de caràcters. Veurem també com introduir una cadena de més d'una línia.

 

Desenvolupament de la pràctica

El programa que farem calcula el nombre de línies, paraules i caràcters que s'introdueixen per l'entrada estàndard i imprimeix els resultats per la sortida estàndard. Per detectar línies busca el caràcter fi de línia '\n'. Per detectar paraules es defineix una variable estat que recorda si estava llegint una paraula quan troba un espai en blanc, un fi de línia o un tabulador ('\t'):

Creeu un nou arxiu del tipus C anomenat m6p04.c i escriviu el següent codi:

// m6p04.c - Compta línies, paraules i caràcters -

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


#define DINTRE 1 // dintre d'una paraula
#define FORA 0 // fora d'una paraula

int main(){
   int c, nl, np, nc, estat;

   estat = FORA;
   np = nc = 0;
   nl=1;

   printf("Introduïu un text,si es vol,de més d'una línia\n");
   printf("premeu CTRL+D per finalitzar\n\n");


   while ((c = getchar()) != EOF) {
      ++nc;
      if (c == '\n') ++nl;
      if (isspace(c)) estat = FORA;
      else if (estat == FORA) { estat = DINTRE;
                                ++np;
                              }

}

   printf("\n\nlínies:%d\nparaules:%d\ncaràcters:%d\n",--nl,np,nc);
   return 0;

}

Captura de l'execució del programa.

 


 

Explicació del programa

Les variables nl, np i nc s'encarregaran respectivament d'emmagatzemar el nombre de línies, de paraules i de caràcters. La primera de les variables és inicialitzada a 1 i la resta a 0.

La lectura del text es fa amb la sentència:

 
while ((c = getchar()) != EOF){

que llegeix caràcters fins trobar un caràcter EOF, que es crea amb les tecles CTRL+D.

El cos de la sentència while es pot dividir en tres parts. Cadascuna d'aquestes parts s'encarrega de comptar els caràcters, les línies i les paraules:

 

      ++nc;        

      if (c == '\n') ++nl;

      if (isspace(c)) estat = FORA;
      else if (estat == FORA) { estat = DINTRE;
                                     ++np;
                               }

Cada vegada que es llegeix un caràcter s'incrementa la variable nc en 1. Si el caràcter és el caràcter de nova línia: ('\n'), s'incrementa la variable nl en 1.

La part que compta paraules és una mica més sofisticada. Inicialment, la variable estat està inicialitzada a FORA (macro definida al començament). Si el caràcter llegit és un caràcter de separació de paraules (espai en blanc, tabulador o retorn de línia) s'assigna el valor FORA a la variable estat, en cas contrari, s'assigna DINTRE. Aquesta comprovació es fa amb la funció isspace(). La variable np s'incrementa quan la variable estat passa de FORA a DINTRE.