Cours 3 : la boucle while

Photo en CC-By-Nc-Sa lecasio

, par Pierre

Algorithmique et programmation : supports, exemples et exercices du troisième cours, où il est beaucoup question de la boucle while.

Les supports du cours :

PDF - 331.8 ko
Cous 3 I3 pour impression
PDF - 500.3 ko
Cours 3 I3 écran

La feuille d’exercice :

PDF - 272 ko
TDTP3 I3

Les programmes donnés dans le cours en exemple :

Tester si un nombre est premier. Dans ce programme l’utilisateur saisit des nombres et le programme dit s’ils sont premiers. Pour tester la primalité de n on itère sur les diviseurs potentiels de n parmi 2 , ..., n - 1 et on stop si un diviseur est trouvé. L’itération est réalisée à l’aide d’un while qui simule exactement un for (d = 2 ; d < n ; d = d + 1) mais en ajoutant une condition de sortie prématurée (valeur du booléen premier).

  1. /* Declaration de fonctionnalites supplementaires */
  2. #include <stdlib.h> /* pour EXIT_SUCCESS */
  3. #include <stdio.h> /* pour printf() */
  4.  
  5. /* Declaration des constantes et types utilisateur */
  6. #define TRUE 1
  7. #define FALSE 0
  8.  
  9. /* Declaration des fonctions utilisateur */
  10.  
  11. /* Fonction principale */
  12. int main()
  13. {
  14. /* Declaration et initialisation des variables */
  15. int n = 1;
  16. int d;
  17. int premier = TRUE;
  18. int continuer = TRUE;
  19.  
  20.  
  21. while (continuer)
  22. {
  23. printf("Donner un entier positif (0 pour terminer)\n");
  24. scanf("%d", &n);
  25. printf("Vous avez saisi %d\n", n);
  26.  
  27. if (n == 0)
  28. {
  29. continuer = FALSE;
  30. }
  31. else
  32. {
  33. /* test de primalite */
  34. d = 2;
  35. while ( premier && (d < n) ) /* sans diviseur < d */
  36. {
  37. if (n % d == 0) /* d divise n */
  38. {
  39. printf("%d est divisible par %d\n", n, d);
  40. premier = FALSE;
  41. }
  42. d = d + 1; /* candidat diviseur suivant */
  43. }
  44.  
  45. if (premier)
  46. {
  47. printf("%d est premier\n", n);
  48. }
  49. else
  50. {
  51. printf("%d n'est pas premier\n", n);
  52. }
  53. }
  54. }
  55. /* Valeur fonction */
  56. return EXIT_SUCCESS;
  57. }
  58.  
  59. /* Definition des fonctions utilisateur */

Télécharger

Jouer à effectuer des additions. On tire au hasard des nombres et l’utilisateur doit effectuer les additions.

  1. #include <stdlib.h> /* EXIT_SUCCESS */
  2. #include <stdio.h> /* printf, scanf */
  3. #include <time.h> /* time */
  4.  
  5. /* declaration de constantes et types utilisateurs */
  6. #define TRUE 1
  7. #define FALSE 0
  8. #define NBMAX 100
  9. /* declaration de fonctions utilisateurs */
  10.  
  11. int main()
  12. {
  13. int x; /* nombre au hasard */
  14. int y; /* autre nombre au hasard */
  15. int choix; /* choix de l'utilisateur */
  16. int continuer = TRUE; /* TRUE s'il faut continuer a jouer */
  17. int essais = 0; /* nombre d'essais */
  18. int succes = 0; /* nombre de reponses justes */
  19. int debut; /* debut en temps standard */
  20. int duree; /* duree en secondes */
  21.  
  22. /* initialisation du generateur de nombres pseudo-aleatoires */
  23. srand(time(NULL)); /* a ne faire qu'une fois */
  24.  
  25. /* bienvenue */
  26. printf("Teste ton aptitude au calcul mental en faisant des additions !\n");
  27.  
  28. /* partie */
  29. debut = time(NULL);
  30.  
  31. while(continuer) /* le joueur veut faire un nouvel essai */
  32. {
  33. essais = essais + 1;
  34. /* tirage de x */
  35. x = rand() % NBMAX + 1; /* entre 1 et NBMAX inclus */
  36. /* tirage de y */
  37. y = rand() % NBMAX + 1; /* entre 1 et NBMAX inclus */
  38.  
  39. /* question */
  40. printf("%d + %d = ", x, y);
  41. scanf("%d",&choix);
  42.  
  43. if(x + y == choix) /* trouve */
  44. {
  45. printf("Bravo c'est bien %d\n", choix);
  46. succes = succes + 1;
  47. }
  48. else /* pas trouve */
  49. {
  50. printf("Faux, %d + %d = %d (pas %d)\n", x, y, x + y, choix);
  51. }
  52. /* fin d'essai */
  53. printf("Continuer (1) ou arreter (0) ?\n");
  54. scanf("%d", &choix);
  55. if (choix == 0)
  56. {
  57. continuer = FALSE;
  58. }
  59. }
  60. /* fin */
  61.  
  62. /* affichage du score */
  63. duree = time(NULL) - debut;
  64. printf("Votre score : %d justes sur %d essais en %d secondes\n", succes, essais, duree);
  65. printf("Sayonara\n");
  66.  
  67. return EXIT_SUCCESS;
  68. }
  69.  
  70. /* Definition des fonctions utilisateurs */

Télécharger

Tic Tac ... BOUM !

  1. #include <stdlib.h> /* EXIT_SUCCESS, rand, srand */
  2. #include <stdio.h> /* printf, scanf */
  3. #include <time.h> /* time */
  4.  
  5. /* declaration de constantes et types utilisateurs */
  6. #define TRUE 1
  7. #define FALSE 0
  8. #define TIC 1
  9. #define TAC 2
  10.  
  11. /* declaration de fonctions utilisateurs */
  12.  
  13. int main()
  14. {
  15. int debut; /* debut en temps standard */
  16. int duree = 0; /* duree en secondes, attention les artificiers
  17. * amateurs noteront qu'il est nécessaire
  18. * d'initialiser sa valur à 0. Ne pas tester sans
  19. * initialisation ! */
  20. int tictac = TAC;
  21.  
  22. printf("Auto-destruction en cours, ctrl-C pour desamorcer !\n");
  23. debut = time(NULL); /* date de debut (secondes depuis 1/1/1970) */
  24. while(duree < 10) /* pas encore 10 secondes */
  25. {
  26. duree = time(NULL) - debut; /* duree depuis debut (secondes) */
  27. if (duree % 2 == 0) /* duree paire: faire un tic */
  28. {
  29. if (tictac == TAC) /* le precedent tictac est un tac */
  30. {
  31. /* faisons tic */
  32. printf("tic...\n");
  33. tictac = TIC;
  34. }
  35. }
  36. else /* duree impaire : faire un tac */
  37. {
  38. if (tictac == TIC) /* le precedent tictac est un tic */
  39. {
  40. /* faisons tac */
  41. printf("tac...\n");
  42. tictac = TAC;
  43. }
  44. }
  45. } /* fin des 10 secondes */
  46. printf("** BOUM ! **\n");
  47.  
  48. return EXIT_SUCCESS;
  49. }
  50.  
  51. /* Definition des fonctions utilisateurs */

Télécharger

Les programmes de la feuille d’exercice :

  1. #include <stdlib.h> /* EXIT_SUCCESS, rand, srand */
  2. #include <stdio.h> /* printf */
  3. #include <time.h> /* time */
  4.  
  5. #define NB_MAX 15 /* nombre secret entre 0 et NB_MAX inclus */
  6.  
  7. int main()
  8. {
  9. int nombre_secret; /* nombre secret à deviner */
  10.  
  11. /* initialisation du générateur de nombres pseudo-aléatoires */
  12. srand(time(NULL)); /* à ne faire qu'une fois */
  13.  
  14. /* tirage du nombre secret */
  15. nombre_secret = rand() % (NB_MAX + 1); /* entre 0 et NB_MAX inclus */
  16.  
  17. /* exploitation du secret */
  18. printf("Tu ne devineras jamais que mon secret est %d\n", nombre_secret);
  19.  
  20. return EXIT_SUCCESS;
  21. }

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]