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…
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
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 :
#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
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…
#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
#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
#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;
}

