martes, 4 de enero de 2011

Kernighan_Ritchie_1.14 (Histograma de caracteres en un archivo)

_____________________________________________________________________________________
1.14 Escriba un programa que imprima el histograma de las frecuencias con que se presentan diferentes caracteres leídos a la entrada.
_____________________________________________________________________________________
Solución:
Éste programa presenta las frecuencias de cada uno de los caracteres leídos del teclado, siempre que se trate del código ASCII. En el programa aparece el algoritmo en seudocódigo. A pesar de que la mayoría de los 256 caracteres del código ASCII no serán usados en un texto ordinario, hay que estar conscientes de que éste programa los presenta con la función putchar y a continuación tantos asteríscos (*) como veces haya ocurrido el carácter. Por ejemplo, la frecuencia de los saltos de línea se presentan como un espacio en blanco y debajo, en la siguiente línea, los asteríscos.


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Este programa imprime el histograma de las frecuencias con que se    +
+ presentan diferentes caracteres leidos de la entrada                 +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+                                                                       +
+                              Algoritmo:                               +
+ Contar:                                                               + 
+   Recibe el primer caracter y asignalo a la variable c                +
+   Si el caracter es distinto de EOF, incrementa en 1 la frecuencia de +
+   dicho caracter                                                      +
+   Recibe el siguiente caracter y asignalo a la variable c             +
+   Si el caracter es distinto de_EOF, incrementa en 1 la frecuencia de +
+   dicho caracter                                                      +
+   Realizar los pasos anteiores hasta que el archivo leido sea EOF     +
+                                                                       +
+                                                                       +
+Imprimir:                                                              +
+   Revisa la frecuencia del caracter ASCII 0                           +
+   Si la frecuencia es distinta de 0, imprime el caracter y su         +
+   frecuencia                                                          +
+   Revisa la frecuencia de los sucesivos caracteres ASCII hasta el 255 +
+   Si la frecuencia es distinta de 0, imrpime el caracter y su         +
+   frecuencia.                                                         +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

#include <stdio.h>                 
#define Tamano 256 /* El conjunto de caracteres ASCII va de 0 - 255     */
                  
                  
int main()                 
{ /* Abre main */               
                  
/* Recibe los caracteres uno a uno */           
printf("\nIntroduzca una cadena de caracteres y le dare ");
printf("la frecuencia con la que ocurre cada uno de ellos.\n\n");
                  
int c; // La variable caracter             
int frecuencia_caracteres[Tamano + 1] = { 0, 0, 0 };         
int i = 0;               
int s = 0;               
int t = 0;               
                  
while (( c = getchar()) != EOF )          
{ /*Abre while  */                        
frecuencia_caracteres[c]++;              
} /*Cierra while  */              
                  
                  
/* Imprime el histograma de las frecuencias de los caracteres */ 
                  
for ( s = 0; s <= Tamano; s++)          
{                  
if (frecuencia_caracteres[s] != 0 )
{  /*Abre if */
putchar(s);

for ( t = 1; t <= frecuencia_caracteres[s]; t++)          
printf("*");                  

printf("\n");                  
} /*Cierra if*/
}                  
                  
return 0;                 
} /* Cierra main  */    

Una ejecución de éste programa, con la entrada siguiente:

C es un lenguaje minimalista

da como resultado esta salida:

Introduzca una cadena de caracteres y le dare la frecuencia con la que ocurre cada uno de ellos.


*
 ****
C*
a***
e***
g*
i***
j*
l**
m**
n***
s**
t*
u**

_____________________________________________________________________________________________
Esta entrada es parte de los problemas resueltos del libro El Lenguaje de Programación C, de B. Kernighan y D. Ritchie.
Entrada Anterior
Entrada Siguiente

5 comentarios:

  1. Hola, no estoy entendiendo esta linea:

    frecuencia_caracteres[c]++;

    El indice del arreglo es lo que contiene 'C', osea un caracter?

    ResponderEliminar
    Respuestas
    1. Hola. Lo que quiero hacer es llevar un registro de cuántas veces aparece cada carácter en un archivo. En el código ASCII hay 256 caracteres, por lo cual defino un arreglo de 256 localidades todos inicializados a 0.
      La variable c es el valor entero en código ASCII del carácter. En el ciclo while se reciben los caracteres. Digamos que se recibe la variable 'a', cuyo valor ASCII es 97. Entonces, la instrucción

      frecuencia_caracteres[c]++;

      incrementa en uno el número almacenado en la localidad 97 del arreglo. Si es la primera 'a', entonces pasa de 0 a 1. La próxima vez que se lea una 'a', se incrementará a 2 y así con todos.
      Al final tengo que recorrer todo el arreglo e imprimir tantos asteríscos como indique el número almacenado. Si, por ejemplo, en l a localidad 97 hay un 21 (lo cual indica que el texto introducido tenía 21 letras 'a') entonces se imprimen 21 asteríscos. Así se forma el histograma.
      Espero que te ayude mi explicación.
      Saludos y qué bueno que estás usando el libro de Kernighan y Ritchie para aprender C.

      Eliminar
  2. Haa.. no sabia que se almacenaba el valor ASCII de los caracteres, ahora que me lo decis tiene logica, ya que el arreglo es un INT..
    Gracias por la ayuda..
    El libro me lo recomendaron.. igual tambien me ayudo con tu blog :) , google y y un PDF de Nacho Cabanes.. no se si lo conoces..

    Saludos y gracias..

    ResponderEliminar
    Respuestas
    1. Sí, es cierto. Nacho Cabanes tiene un buen curso de C que es ya prácticamente un libro. Igual y si te sirve, estoy escribiendo unas entradas en la etiqueta Curso de C para iniciarse en C.

      Eliminar
  3. Todo sirve a la hora de aprender.. gracias..

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...