Solución K&R Ejercicio 1-14

Estaba trabajando en este ejercicio y quería saber si mi respuesta es correcta;

Escriba un progtwig para imprimir un histogtwig de las frecuencias de diferentes caracteres en la entrada.

He visto un par de otras respuestas en línea pero difieren bastante de las mías. Además, si hay algún problema en el formato de mi código o alguna mejora que deba realizarse. Cualquier sugerencia es bienvenida. Entiendo que la pregunta requiere un histogtwig, pero es bastante fácil crear uno una vez que tengo los datos requeridos.

#include  int main(){ int userInput; int arrayStuff[92]; int i, j; for(i = 0; i = 30 && userInput <= 122){ if(userInput != '\n'){ ++arrayStuff[(userInput-30)]; } if(userInput == '\n'){ break; } } } printf("Case\t|\tOccurances\n"); for(i = 0; i < 92; ++i){ printf("%c\t|\t%d\n", (i+30), arrayStuff[i]); } } 

Mejoras que haría:

  • Declare e inicialice int arrayStuff[92] = { 0 }; De una sola vez y deshacerse del bucle for. Esto está garantizado para establecer todos los elementos a 0.
  • No use el número mágico 92 en varios lugares, use (sizeof arrayStuff/sizeof arrayStuff[0]) para calcular el número de elementos en arrayStuff.
  • Los paréntesis en (i + 30) son redundantes
  • ¿Qué pasa si el usuario escribe el carácter EOF ? Parece que se vuelve para siempre.
  • “Ocurrencias” no está en mi diccionario, pero sí está. Tal vez la frecuencia de caracteres es un término mejor?
  • arrayStuff? No puedo dejar de enfatizar la importancia de nombrar identificadores claros y concisos. La frecuencia viene a la mente.
  • Debe ser int main (void) con una return 0; . Esto no es C ++, donde una lista de parámetros vacía es equivalente a nula. Esto es C, donde una lista de parámetros vacía significa “Soy una lista de parámetros K&R de estilo antiguo para un número desconocido pero fijo de argumentos”.

Jens menciona el “número mágico” de 92. Un número mágico es un número literal en su código. Se recomienda que se eviten, ya que puede ser más fácil comprender el propósito o el significado del valor si se reemplaza con un nombre de variable constante, o un nombre o cálculo de MACRO. Creo que 30 y 122 también serían considerados “números mágicos”. Este código termina en la entrada de cualquier carácter no gráfico. Lo que significa que se detendrá si se ingresa una pestaña y no contará los caracteres de las tabs, lo que puede no ser correcto

 #include  #include  #define FIRST_GRAPHIC_CHAR 32 #define LAST_GRAPHIC_CHAR 126 #define NUM_GRAPHIC_CHARS (LAST_GRAPHIC_CHAR - FIRST_GRAPHIC_CHAR + 1) int main(void) { int userInput; int arrayStuff[NUM_GRAPHIC_CHARS] = {0}; int i; printf("enter a string of characters followed by \n"); userInput = getchar(); while( userInput >= FIRST_GRAPHIC_CHAR && userInput <= LAST_GRAPHIC_CHAR ) { ++arrayStuff[(userInput - FIRST_GRAPHIC_CHAR)]; userInput = getchar(); } printf("Case\t|\tOccurances\n"); for(i = 0; i < NUM_GRAPHIC_CHARS; ++i) { if ( i + FIRST_GRAPHIC_CHAR == ' ' ) printf("\t|\t%d\n", arrayStuff[i]); else printf("%c\t|\t%d\n", (i + FIRST_GRAPHIC_CHAR), arrayStuff[i]); } return EXIT_SUCCESS; }