Solution K & R pour l’exercice 1-14

Je travaillais sur cet exercice et je voulais savoir si ma réponse était correcte;

Ecrivez un programme pour imprimer un histogramme des fréquences de différents caractères dans l’entrée.

J’ai vu quelques autres réponses en ligne, mais elles diffèrent beaucoup des miennes. Aussi, s’il y a des problèmes dans le format de mon code ou des améliorations à apporter. Toutes les suggestions sont les bienvenues. Je comprends que la question nécessite un histogramme, mais il est assez facile d’en créer un une fois que je dispose des données requirejses.

#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]); } } 

Les améliorations que je ferais:

  • Déclarer et initialiser int arrayStuff[92] = { 0 }; en une fois et débarrassez-vous de la boucle. Ceci est garanti pour définir tous les éléments sur 0.
  • N’utilisez pas le nombre magique 92 à différents endroits, utilisez (sizeof arrayStuff/sizeof arrayStuff[0]) pour calculer le nombre d’éléments dans arrayStuff.
  • Les parenthèses dans (i + 30) sont redondantes
  • Que se passe-t-il si l’utilisateur tape le caractère EOF ? On dirait que ça boucle pour toujours.
  • “Occidences” n’est pas dans mon dictionnaire, mais occurrence est. Peut-être que la fréquence des caractères est un meilleur terme?
  • arrayStuff? Je ne saurais trop insister sur l’importance d’une dénomination claire et concise des identifiants. La fréquence vient à l’esprit.
  • Il doit être int main (void) avec un return 0; . Ce n’est pas C ++, où une liste de parameters vide est équivalente à void. Ceci est C, où une liste de parameters vide signifie “Je suis une liste de parameters K & R de style ancien pour un nombre inconnu mais fixe d’arguments”.

Jens mentionne le “nombre magique” de 92. Un nombre magique est un nombre littéral dans votre code. Il est recommandé de les éviter car il peut être plus facile de comprendre l’objective ou la signification de la valeur si elle est remplacée par un nom de variable constant, un nom MACRO ou un calcul. Je pense que 30 et 122 seraient aussi considérés comme des “nombres magiques”. Ce code se termine lors de la saisie de tout caractère non graphique. Ce qui signifie que cela s’arrêtera si une tabulation est entrée et ne comptera pas les caractères de tabulation, ce qui peut ne pas être correct.

 #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 ssortingng 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; }