Ver Mensaje Individual
  #16 (permalink)  
Antiguo 06/06/2014, 21:26
Avatar de guzzano
guzzano
 
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 4 meses
Puntos: 13
Respuesta: Contar repeticiones de letra?

Cita:
Iniciado por Alexis88 Ver Mensaje
Una solución que puede mejorarse: http://ideone.com/OyNvLA

Disculpen la poca eficiencia en el código, hace mucho que no toco C++.

Saludos
Aquí mi solución a tu código mucho más optimizada

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <stdlib.h>
  4.  
  5. #define MAX_CHARS 33 /* Letras en el diccionario. */
  6.  
  7. int main (void)
  8. {
  9.     const char *str = "I have only right. - Tolkien.";
  10.  
  11.     unsigned char dchar[MAX_CHARS] = {0};
  12.     size_t schars[MAX_CHARS] = {0};
  13.  
  14.     int i, j = 0;
  15.  
  16.     while ( *str != '\0')
  17.     {
  18.         if ((size_t) *str < 0x41 || (size_t) *str > 0x7A) {
  19.             str++;
  20.             continue;
  21.         }
  22.  
  23.         unsigned char charlw = tolower(*str);
  24.  
  25.         for (i = 0; i < MAX_CHARS; i++) {
  26.             if (dchar[i] == charlw)
  27.                 schars[i] += 1;
  28.             else if (dchar[i] == 0) {
  29.                 dchar[i] = charlw;
  30.                 schars[i] += 1;
  31.  
  32.                 break;
  33.             }
  34.         }
  35.  
  36.         str++;
  37.     }
  38.  
  39.     for (; j < MAX_CHARS; j++)
  40.         if (dchar[j] != 0)
  41.             printf("Hay %i letra/as %c\n", schars[j], dchar[j]);
  42.  
  43.     return EXIT_SUCCESS;
  44. }

Un problema fundamental eran las mayúsculas y minúsculas, como podrás ver lo que hice con tolower, pero está otro problema, que no esta incluido en el código pero su solución es fácil, que trata de ASCII extendido, a lo que me refiero, si un usuario tecleó una cadena con algunas letras con tilde, no lo identificará por que aquí los estoy filtrando

Código C:
Ver original
  1. if ((size_t) *str < 0x41 || (size_t) *str > 0x7A)

Solo quedaría ver un poco la tabla de ASCII extendido y modificar esto.


Un saludos.
__________________
Si me equivoco, corríjanme sin piedad.