EI : correction du TP 4 figures d’étoiles

, par Pierre

èléments d’informatique, correction des exercices du quatrième TP où il était question de créer des motifs à base d’étoiles (le jeudi 4 octobre 2012 pour le groupe 3).

Pour le premier programme, on doit afficher largeur lignes de chacune longueur etoiles. On applique donc un algorithme dépendant de deux quantités largeur et longueur (qui seront deux variables) et qui fera :

- répéter largeur fois

  • afficher une ligne de longueur étoiles puis un saut de ligne de la façon suivante :
    • répeter longueur fois afficher une étoile
    • afficher un saut de ligne

Cela donne le code suivant :

  1. #include <stdlib.h> /* EXIT_SUCCESS*/
  2. #include <stdio.h> /* printf */
  3.  
  4.  
  5. /* declaration de fonctions utilisateurs */
  6. int main()
  7. {
  8. int largeur = 5;
  9. int longueur = 10;
  10. int i; /* var de boucle pour la répétition */
  11. int j; /* idem */
  12.  
  13. /* repeter cote fois le bloc suivant */
  14. for( i = 1; i <= largeur; i = i + 1) /* i numero de la ligne */
  15. { /* ne pas modifier la var de boucle i à l'intérieur du bloc */
  16. /* afficher longueur etoiles suivies d'un saut de ligne */
  17. /* 1) repeter longueur fois afficher une etoile */
  18. for (j = 1; j <= longueur; j = j + 1)
  19. {
  20. printf("*");
  21. }
  22. /* 2) afficher un saut de ligne */
  23. printf("\n");
  24. }
  25.  
  26. /* valeur fonction */
  27. return EXIT_SUCCESS;
  28. }

Télécharger

Dans cette répétition i est un numéro de ligne (les lignes sont numérotées de haut en bas). Sachant cela il est très simple de modifier l’algorithme précédent pour obtenir le demi-carré d’étoiles. En effet, à la première ligne on affiche une étoile, à la seconde ligne deux étoiles, à la troisième ligne trois étoiles, etc. À la dernière ligne, numérotée coté, il y a coté étoiles.

L’algorithme devient donc :
- répéter coté fois

  • afficher une ligne de i étoiles, où i est le numéro de ligne, puis un saut de ligne de la façon suivante :
    • répeter i fois afficher une étoile
    • afficher un saut de ligne

Cela donne le code suivant :

  1. #include <stdlib.h> /* EXIT_SUCCESS*/
  2. #include <stdio.h> /* printf */
  3.  
  4.  
  5. /* declaration de fonctions utilisateurs */
  6. int main()
  7. {
  8. int cote = 10;
  9. int i; /* var de boucle pour la répétition */
  10. int j; /* idem */
  11.  
  12. /* repeter cote fois le bloc suivant */
  13. for( i = 1; i <= cote; i = i + 1) /* i numero de la ligne */
  14. { /* ne pas modifier la var de boucle i à l'intérieur du bloc */
  15. /* afficher i etoiles suivies d'un saut de ligne */
  16. /* 1) repeter i fois afficher une etoile */
  17. for (j = 1; j <= i; j = j + 1)
  18. {
  19. printf("*");
  20. }
  21. /* 2) afficher un saut de ligne */
  22. printf("\n");
  23. }
  24.  
  25. /* valeur fonction */
  26. return EXIT_SUCCESS;
  27. }

Télécharger

Pour le deuxième demi-carré il faut remarquer que chaque ligne doit commencer par des espaces. On peut alors soit compter le bon nombre d’espaces à afficher en début de ligne et ajouter ces espaces à l’aide d’un for supplémentaire soit décider à l’aide des valeurs de i, j et de coté si on affiche une étoile ou un espace (cette solution sera plus facile à adapter à d’autres problèmes).
Compter le nombre d’espaces sur une ligne n’est pas compliqué : le nombre d’étoiles reste le même que précédemment, c’est i, et le nombre total de caractère (espaces plus étoiles) est nécessairement coté. Il y a donc coté - i espaces sur la ligne de numéro i.

L’algorithme devient :
- répéter coté fois

  • afficher une ligne de cote - i espaces et i étoiles, où i est le numéro de ligne, puis un saut de ligne de la façon suivante :
    • répeter cote - i fois afficher un espace
    • répeter i fois afficher une étoile
    • afficher un saut de ligne

Cela donne le code suivant :

  1. #include <stdlib.h> /* EXIT_SUCCESS*/
  2. #include <stdio.h> /* printf */
  3.  
  4.  
  5. /* declaration de fonctions utilisateurs */
  6. int main()
  7. {
  8. int cote = 10;
  9. int i; /* var de boucle pour la répétition */
  10. int j; /* idem */
  11.  
  12. /* repeter cote fois le bloc suivant */
  13. for( i = 1; i <= cote; i = i + 1) /* i numero de la ligne */
  14. { /* ne pas modifier la var de boucle i à l'intérieur du bloc */
  15. /* 1) afficher cote - i espaces */
  16. for (j = 1; j <= cote - i; j = j + 1)
  17. {
  18. printf(" ");
  19. }
  20. /* 2) afficher i etoiles */
  21. for (j = 1; j <= i; j = j + 1)
  22. {
  23. printf("*");
  24. }
  25. /* 2) afficher un saut de ligne */
  26. printf("\n");
  27. }
  28.  
  29. /* valeur fonction */
  30. return EXIT_SUCCESS;
  31. }

Télécharger

L’autre solution est de remarquer que i et j dans le premier programme sont un système de coordonnées pour l’affichage. Il suffit donc de décider en fonction de i et j (et coté) ce qui doit être affiché.
L’algorithme devient :
- répéter coté fois (selon i)

  • afficher une ligne de cote caractères puis un saut de ligne de la façon suivante :
    • répeter coté fois (selon j)
      • si (j <= cote - i) afficher un espace sinon afficher une étoile
    • afficher un saut de ligne

Cela donne le code suivant :

  1. #include <stdlib.h> /* EXIT_SUCCESS*/
  2. #include <stdio.h> /* printf */
  3.  
  4.  
  5. /* declaration de fonctions utilisateurs */
  6. int main()
  7. {
  8. int cote = 10;
  9. int i; /* var de boucle pour la répétition */
  10. int j; /* idem */
  11.  
  12. /* repeter cote fois le bloc suivant */
  13. for( i = 1; i <= cote; i = i + 1) /* i numero de la ligne */
  14. { /* ne pas modifier la var de boucle i à l'intérieur du bloc */
  15. /* afficher cote étoiles ou espaces suivies d'un saut de ligne */
  16. for (j = 1; j <= cote; j = j + 1)
  17. {
  18. if (j <= cote - i)
  19. {
  20. printf(" ");
  21. }
  22. else
  23. {
  24. printf("*");
  25. }
  26. }
  27. /* 2) afficher un saut de ligne */
  28. printf("\n");
  29. }
  30.  
  31. /* valeur fonction */
  32. return EXIT_SUCCESS;
  33. }

Télécharger

Revenu et logement, Je livre ici quelques éléments de comparaison concernant mon niveau de vie, pour couper court à quelques idées reçues, et un condensé de nombreuses (...)
Revenu et travail d’un enseignant-chercheur, Cet article complète l'article Revenu et logement, en détaillant un peu le budget de mon ménage, mon parcours d'enseignant-chercheur en terme de (...)
Cybersyn (el systemo synco), Au café, mardi 5 avril 2011, j'ai bien vu que, mis à part Antoine Allombert, personne ne connaissait l'histoire de l'extraordinaire projet chilien (...) [jpg, jpg, png]