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=1
VI-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 (
"
\n
Mon nombre est plus petit
\n
"
);
else
{
if
(
nb_hasard >
votre_nb)
printf (
"
\n
Votre nombre est plus grand
\n
"
);
}
}
while
(
votre_nb !=
nb_hasard);
printf (
"
Trouvé
\n
"
);
return
0
;
}