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 :

Cous 3 I3 pour impression
Cours 3 I3 écran

La feuille d’exercice :

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

Bluehats & UnivMobile , Présentation de la démarche design employée pour UnivMobile faite à la rencontre bluehats du 11 décembre 2019. [pdf, jpg]
Mon université en 2030, Texte d'une intervention que j'ai faite dans le cadre d'une soirée Cap 2030, organisée par le EdFab à Cap Digital le 27 février (...)
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]