VI. Mise au point▲
VI-A. Objectif▲
L'objet de ce chapitre est de réaliser une pause dans l'apprentissage du C et de s'attacher à ce que l'on est capable de réaliser avec le peu de moyens que l'on a.
Ce chapitre est constitué de trois exercices de difficulté croissante. Ils nous permettront d'apprendre à utiliser une nouvelle fonction et de réaliser un exercice complet de programmation.
VI-B. Plus petit ou plus grand▲
 Exercice n°5.1 — Plus grand ou plus petit que…
 Exercice n°5.1 — Plus grand ou plus petit que…
Réalisez un programme qui saisit un nombre puis indique à l'utilisateur si ce nombre est plus grand ou plus petit qu'un autre nombre défini à l'avance dans le programme.
Par exemple :
si (nbre_saisi < 10)
   alors écrire "plus petit"Vous pouvez reprendre l'exercice du chapitre sur les conditions qui indiquait si un nombre est strictement positif, strictement négatif ou nul.
VI-C. Retour sur getchar()▲
La fonction getchar() permet d'attendre la frappe d'un caractère au clavier, de le lire et de le renvoyer. Deux utilisations peuvent donc être faites de getchar(),
- la première est celle permettant d'attendre la frappe d'une touche sans se soucier de sa valeur, simplement pour marquer une pause.
- la seconde est celle permettant de lire un caractère au clavier.
getchar();char car;
car = getchar();À chaque fois, getchar() effectue le même traitement :
- attendre la frappe d'une touche au clavier suivie de la touche ENTREE
- renvoyer le caractère frappé.
Dans le premier exemple, ce caractère est simplement ignoré.
VI-D. Boucle : Faire… Tant que (condition)▲
do… while (traduisez par Faire… Tant que) permet de réaliser une suite d'instructions tant qu'une ou plusieurs conditions sont remplies.
- lisez le programme suivant
- lisez les explications qui figurent en dessous du programme
- exécutez, testez, comprenez ce programme…
#include <stdio.h> 
int main () {
   char car=' ';
   int sortie=0;
   do {
      printf ("Appuyez sur S pour sortir !\n");
      car = getchar ();
      /* On le compare pour savoir si l'on peut sortir: */
      sortie = ((car == 's') || (car == 'S'));
   }
   while (sortie==0);
   return 0;
}Notez que la touche ENTREE utilisée pour la saisie du caractère est elle‐même traitée comme un caractère entré et provoque donc aussi l'affichage de la phrase « Appuyez sur S pour sortir… » qui s'affiche donc deux fois.
- un nombre entier vaut la valeur logique vraie si ce nombre est différent de 0.
- un nombre entier vaut la valeur logique faux si ce nombre est égal à 0.
- || est un « 'ou' logique », donc au niveau de la ligne :
sortie=((car=='s')||(car=='S'));Dès lors, les deux extraits de programme suivants sont équivalents :
sortie = ((car == 's') || (car == 'S'));if ((car == 's') || (car == 'S'))
   sortie=1;
else
   sortie=0;Pour stopper un programme qui boucle, il faut presser simultanément sur les touches CTRL+C (break).
Vous pouvez tester cette possibilité en exécutant le programme suivant :
#include <stdio.h>
int main () {
   int i=1;
   do {
      printf(" i=%d \n",i);
      i=i+1;
   }
   while (i>0); /* Test toujours vrai ! */
   return 0;
} Exercice n°5.2 — Sortir de la boucle
  Exercice n°5.2 — Sortir de la boucle
Transformez l'exemple précédent afin que l'on sorte de la boucle uniquement quand l'utilisateur a saisi le nombre 10.
La saisie d'un nombre ne se fait pas par getchar mais par scanf.
VI-E. Opérateur modulo▲
L'opérateur qui donne le reste de la division entière (opérateur modulo) est noté % en C. Ainsi, 10%2vaut 0 car la division entière de 10 par 2 donne 5 et il n'y a pas de reste. En revanche, 10%3 vaut 1 car la division entière de 10 par 3 donne 3et il reste 1.
int z;
z=10%2;
printf("10 modulo 2=%d\n",z);
z=10%3;
printf("10 modulo 3=%d\n",z);…va nous afficher :
10 modulo 2=0
10 modulo 3=1VI-F. Nombres pseudo‐aléatoires▲
 Voici un petit exemple de programme qui permet d'obtenir des nombres pseudo‐aléatoires entre 0 et 99 :
 Voici un petit exemple de programme qui permet d'obtenir des nombres pseudo‐aléatoires entre 0 et 99 :
#include <stdio.h> 
#include <stdlib.h>   // sert pour les fonctions srand et rand
#include <time.h> 
int main() {
   int nb_alea=0;
   /* Initialisation du générateur de nombres
      basée sur la date et l'heure */
   srand (time (NULL));
   nb_alea = rand() % 100;
   printf ("Nombre aléatoire : %d\n",nb_alea);
   return 0;
}- srand (time (NULL)) permet d'initialiser le générateur de nombres pseudo‐aléatoire. Nous reviendrons sur ce point par la suite.
- rand() renvoie un nombre entier compris entre 0 et RAND_MAX.
- rand()%100 est donc le reste de la division entière d'un nombre pseudo‐aléatoire (éventuellement très grand) par 100, c'est-à-dire un nombre compris entre 0 et 99…
#include <stdio.h> 
#include <stdlib.h> 
int main() {
   /* Pour notre information */
   printf ("RAND_MAX : %ld\n", RAND_MAX);
   return 0;
} Exercice n°5.3 — Deviner un nombre
 Exercice n°5.3 — Deviner un nombre
En vous aidant de ce qui a été fait précédemment, réalisez un petit jeu qui :
- Initialise un nombre entre 0 et 99.
- Tente de faire deviner ce nombre à l'utilisateur en lui indiquant si le nombre à trouver est plus petit ou plus grand que sa proposition.
Entrez votre nombre: 50
C'est plus !
Entrez votre nombre: 25
C'est moins !
...
Gagné !!!VI-G. Corrigés des exercices du chapitre▲
 Corrigé de l'exercice n°5.1 — Plus grand ou plus petit que…
 Corrigé de l'exercice n°5.1 — Plus grand ou plus petit que…
#include <stdio.h> 
int main () {
   int nb_choisi = 33;
   int nb_saisi = 0;
   printf ("Votre nombre : ");
   scanf ("%d",&nb_saisi);
   if (nb_choisi  < nb_saisi)
      printf ("Mon nombre est plus petit.\n");
   else {
      if (nb_choisi == nb_saisi)
         printf ("C'est exactement mon nombre.\n");
      else
         printf ("Mon nombre est plus grand.\n");
   }
   return 0;
} Corrigé de l'exercice n°5.2 — Sortir de la boucle
 Corrigé de l'exercice n°5.2 — Sortir de la boucle
#include <stdio.h> 
#include <stdlib.h> 
int main () {
   int valeur=0;
   do {
      printf ("Votre nombre : ");
      scanf ("%d",&valeur);
   }
   while (valeur != 10);
   return 0;
} Corrigé de l'exercice n°5.3 — Deviner un nombre
 Corrigé de l'exercice n°5.3 — Deviner un nombre
#include <stdio.h> 
#include <stdlib.h>  /* pour les valeurs aléatoires */
#include <time.h> 
int main () {
   int nb_hasard = 0;
   int votre_nb = 0;
   srand (time (NULL));
   nb_hasard = rand () % 100;/* Nombre entre 0 et 100 */
   do {
      printf("Votre nombre : ");
      scanf("%d",&votre_nb);
      if (nb_hasard  < votre_nb)
         printf ("\nMon nombre est plus petit\n");
      else {
         if (nb_hasard  > votre_nb)
            printf ("\nVotre nombre est plus grand\n");
      }
   }
   while (votre_nb != nb_hasard);
   printf ("Trouvé\n");
   return 0;
}



