VII. Et les Shadoks pompaient : je pompe donc je suis▲
« Les Shadoks » est une série télévisée d'animation française en 208 épisodes de 2 à 3 minutes, créée par Jacques Rouxel, produite par la société AAA (Animation Art‐graphique Audiovisuel) et diffusée entre le 29 avril 1968 et 1973 (trois premières saisons) et à partir de janvier 2000 (quatrième saison) sur Canal+ et rediffusée sur Cartoon Network…
VII-A. Objectifs▲
Vous trouverez beaucoup d'exercices dans ce chapitre où plusieurs petites aides de programmation seront données notamment en ce qui concerne l'incrémentation et la décrémentation d'une variable.
VII-B. Boucle While▲
De la même façon que :
do
{
...}
while
(
condition);
il est possible d'utiliser :
while
(
condition) {
...}
char
car =
'
'
;
while
((
car !=
'
s
'
) &&
(
car !=
'
S
'
)) {
car =
getchar (
);
}
Donnée seule, la ligne : while(condition); signifie que tant que condition est vraie, on revient à la même ligne.
Si la condition est toujours vraie, on tombe alors dans un puits (le programme reste bloqué). Sinon, on passe immédiatement à la ligne/instruction suivante.
VII-C. Et les Shadoks apprenaient que reprendre équivaut à apprendre▲
Ce n'est qu'en essayant continuellement que l'on finit par réussir… En d'autres termes… Plus ça rate et plus on a de chances que ça marche… (http://www.lesshadoks.com).
Exercice n°6.1 — Touche-touche
Traduisez en langage C, complétez avec les variables nécessaires, compilez, exécutez, comprenez :
Faire
Saisir une touche
Tant Que (touche != S) et (touche != s)
Exercice n°6.2 — Saisir un nombre
Traduisez en langage C, complétez avec les variables nécessaires, compilez, exécutez, comprenez :
Faire
Saisir un nombre
Tant Que (nombre != 10)
Notez que la saisie d'un nombre ne se fait pas par la fonction getchar()mais par la fonction scanf (reportez‐vous à la section IV.DSaisie des variables pour plus de précisions).
VII-D. Fonction toupper()▲
Le problème de la comparaison de la minuscule et de la majuscule de l'exercice 1 peut être contourné par l'utilisation de la fonction toupper qui transforme un caractère minuscule en majuscule. Pour l'utiliser, il faut inclure le fichier d'en‐tête ctype.h par : #include <ctype.h>.
La fonction toupper s'utilise de la façon suivante :
#include <stdio.h>
#include <ctype.h>
int
main (
) {
char
car;
char
car_min;
car_min =
'
a
'
;
car =
toupper (
car_min);
printf (
"
%c
"
,car);
return
0
;
}
Ce programme affichera : A
VII-E. Ô tant qu'en emporte le Shadok▲
Exercice n°6.3 — Recommencez ! (a)
Écrivez le programme : Tant que je ne tape pas un nombre impair compris entre 1 et 10 je recommence la saisie d'un nombre.
Exercice n°6.4 — Recommencez ! (b)
Écrivez le programme : Tant que je ne tape pas une voyelle je recommence la saisie d'une touche.
VII-F. Et les Shadoks continuaient à pomper pour obtenir le résultat▲
Dans les exercices qui suivent, la notion de compteur intervient. Un compteur est une variable numérique que l'on décrémente (‐1) ou incrémente (+1) suivant nos besoins.
int
i;
i=
1
;
i=
i+
1
;
printf
(
"
i vaut: %d
"
,i); // affichera 2
En effet, lorsque nous écrivons i=1, l'ordinateur range la valeur 1 dans la case mémoire désignée par i. Lorsque nous demandons : i=i+1, l'ordinateur commence par prendre connaissance de la valeur de i en mémoire (ici 1) et lui ajoute 1. Le résultat est stocké dans la case mémoire associée ài. Finalement, i vaudra 2.
Pour gagner du temps, le langage C nous permet de remplacer une expression comme : i=i+1 par l'expression suivante : i++ qui fera exactement la même chose.
int
i;
i++
; /* Incrémente le compteur i */
i--
; /* Décrémente le compteur i */
Dans les exemples précédents, le nombre de caractères entrés peut donc être comptabilisé en ajoutant 1 à une variable à chaque fois qu'une touche est frappée.
Exercice n°6.5 — Recommencez ! (c)
Écrivez le programme : Tant que je n'ai pas saisi 10 nombres, je recommence la saisie d'un nombre.
Exercice n°6.6 — Recommencez ! (d)
Écrivez le programme : Tant que je n'ai pas saisi 10 caractères, je recommence la saisie d'un caractère.
Dans les exercices qui précèdent, de petites difficultés peuvent surgir… Nous vous invitons donc à vous pencher plus rapidement sur la solution.
VII-G. Dans le clan des Shadoks, on trie, voyelles, chiffres premiers▲
Exercice n°6.7 — Recommencez ! (e)
Écrivez le programme : Tant que je n'ai pas saisi 10 voyelles, je recommence la saisie d'une touche. Vous prendrez soin d'indiquer à l'utilisateur combien de voyelles il lui reste à entrer.
Exercice n°6.8 — Recommencez ! (f)
Écrivez le programme : Tant que je n'ai pas saisi 10 chiffres premiers (2,3,5 ou 7), je recommence la saisie d'un chiffre. Vous prendrez soin d'indiquer à l'utilisateur combien de chiffres premiers il lui reste à entrer.
VII-H. Incrémentations, pré‐incrémentations…▲
Nous avons vu qu'incrémenter désignait la même chose qu'augmenter la valeur d'une variable de 1 :
i++
;
i=
i+
1
;
Il y a cependant une nuance subtile.
Pour bien comprendre, étudions le programme suivant :
#include <stdio.h>
int
main (
) {
int
n=
5
;
int
x;
x=
n++
;
printf (
"
x: %d n: %d
\n
"
,x,n);
return
0
;
}
Celui‐ci retourne le résultat suivant :
x: 5 n: 6
Analysons ce qui se passe lors de l'application de la ligne (x=n++) :
- on affecte n à x, donc x va contenir la valeur 5
- on augmente n de 1, donc n vaudra 6
On parlera dans ce cas d'incrémentation post‐fixée…
Voici un autre exemple :
#include <stdio.h>
int
main (
) {
int
n=
5
;
int
x=
0
;
x=++
n;
printf (
"
x: %d n: %d
\n
"
,x,n);
return
0
;
}
Celui-ci retourne le résultat suivant :
x: 6 n: 6
Analysons ce qui se passe lors de l'application de la ligne(x=++n) :
- on augmente n de 1, donc n vaudra 6
- on affecte n à x, donc x va contenir la valeur 6
On parlera dans ce cas d'incrémentation pré‐fixée…
x=i++ | Copie d'abord la valeur de i dans x et incrémente i après |
x=i-- | Copie d'abord la valeur de i dans x et décrémente i après |
x=++i | Incrémente i d'abord puis copie le contenu de i dans x |
x=--i | Décrémente i d'abord puis copie le contenu de i dans x |
VII-I. Corrigés des exercices du chapitre▲
Corrigé de l'exercice n°6.1 — Touche-touche
#include <stdio.h>
int
main (
) {
char
car =
'
\0
'
;
printf
(
"
Tapez 's' ou 'S' pour arrêter ...
\n
"
);
do
{
car =
getchar (
);
}
while
((
car !=
'
s
'
) &&
(
car !=
'
S
'
));
return
0
;
}
Corrigé de l'exercice n°6.2 — Saisir un nombre
#include <stdio.h>
int
main (
) {
int
nbre =
0
;
printf
(
"
Tapez 10 pour arrêter ...
\n
"
);
do
{
scanf (
"
%d
"
, &
nbre);
}
while
(
nbre !=
10
);
return
0
;
}
Corrigé de l'exercice n°6.3 — Recommencez ! (a)
#include <stdio.h>
int
main (
) {
int
nbre =
0
;
printf
(
"
Tapez un chiffre impair pour arrêter ...
\n
"
);
while
((
nbre!=
1
) &&
(
nbre!=
3
) &&
(
nbre!=
5
) &&
(
nbre!=
7
) &&
(
nbre!=
9
))
scanf
(
"
%d
"
, &
nbre);
return
0
;
}
ou bien :
#include <stdio.h>
int
main (
) {
int
nbre =
0
;
printf
(
"
Tapez un chiffre impair pour arrêter ...
\n
"
);
while
((
nbre <
0
) ||
(
nbre >=
10
) ||
(
nbre%
2
==
0
))
scanf
(
"
%d
"
, &
nbre);
return
0
;
}
Corrigé de l'exercice n°6.4 — Recommencez ! (b)
#include <stdio.h>
#include <ctype.h>
int
main (
) {
char
car =
'
\0
'
;
printf
(
"
Tapez une voyelle pour arrêter ...
\n
"
);
while
((
car !=
'
A
'
) &&
(
car !=
'
E
'
) &&
(
car !=
'
I
'
) &&
(
car !=
'
O
'
) &&
(
car !=
'
U
'
) &&
(
car !=
'
Y
'
)){
car =
getchar (
);
car =
toupper (
car);
}
return
0
;
}
Corrigé de l'exercice n°6.5 — Recommencez ! (c) [Il conviendrait dans cet exercice de vérifier que l'utilisateur a bien entré uniquement des nombres et pas aussi des caractères. Le lecteur intéressé pourra consulter la documentation de scanf et essayer d'utiliser la valeur que renvoie cette fonction pour régler ce problème.]
#include <stdio.h>
int
main (
) {
int
nbre =
0
;
int
nb_nbre =
0
;
printf
(
"
Tapez 10 nombres pour arrêter ...
"
);
do
{
scanf
(
"
%d
"
,&
nbre);
nb_nbre ++
;
}
while
(
nb_nbre !=
10
);
return
0
;
}
Corrigé de l'exercice n°6.6 — Recommencez ! (d)
Prenez soin de lire l'exemple d'exécution et son explication :
#include <stdio.h>
int
main (
) {
char
car =
'
\0
'
;
int
nbre =
0
;
printf
(
"
Tapez 10 caractères pour arrêter ...
"
);
do
{
car =
getchar (
);
nbre ++
;
printf
(
"
j'ai lu (%c) nbre=%d
\n
"
,car,nbre);
}
while
(
nbre !=
10
);
return
0
;
}
Voici un exemple d'exécution :
Tapez 10 caractères pour arrêter ... 123456789
j'ai lu (1) nbre=1
j'ai lu (2) nbre=2
j'ai lu (3) nbre=3
j'ai lu (4) nbre=4
j'ai lu (5) nbre=5
j'ai lu (6) nbre=6
j'ai lu (7) nbre=7
j'ai lu (8) nbre=8
j'ai lu (9) nbre=9
j'ai lu (
) nbre=10
L'utilisateur a donc tapé 123456789 suivi de la touche entrée, il a donc bien tapé 10 caractères. Ce que montre l'affichage de la dernière ligne avec la parenthèse ouvrante sur une ligne et la parenthèse fermante sur la ligne suivante.
Vous pouvez faire d'autres essais…
Corrigé de l'exercice n°6.7 — Recommencez ! (e)
#include <stdio.h>
#include <ctype.h>
int
main (
) {
char
car;
int
nb_nbre =
10
;
printf
(
"
Tapez encore %d voyelles pour arrêter...
\n
"
,nb_nbre);
do
{
car=
getchar
(
);
car=
toupper
(
car);
if
(
car==
'
A
'
||
car==
'
E
'
||
car==
'
I
'
||
car==
'
O
'
||
car==
'
U
'
) {
nb_nbre--
;
printf
(
"
Tapez encore %d voyelles pour arrêter...
\n
"
,nb_nbre);
}
}
while
(
nb_nbre !=
0
);
return
0
;
}
Corrigé de l'exercice n°6.8 — Recommencez ! (f)
#include <stdio.h>
#include <ctype.h>
int
main (
) {
int
nb_nbre =
10
;
int
nbre;
printf
(
"
Tapez encore %d chiffres premiers...
\n
"
,nb_nbre);
do
{
scanf
(
"
%d
"
,&
nbre);
if
(
nbre==
2
||
nbre==
3
||
nbre==
5
||
nbre==
7
) {
nb_nbre--
;
printf
(
"
Tapez encore %d chiffre(s) premier(s) pour arrêter...
\n
"
,nb_nbre);
}
}
while
(
nb_nbre !=
0
);
return
0
;
}
VII-J. À retenir▲
Voici un exemple de programme qui résume ce qui a été vu dans ce chapitre. Ce programme doit afficher à l'écran tous les nombres pairs inférieurs à 100 :
#include <stdio.h>
int
main (
) {
int
i =
0
;
while
(
i!=
100
) {
if
(
i%
2
==
0
) /* reste de la division de i par 2 */
printf
(
"
%d
"
,i);
/* pas de else ni de {} ici, c'est inutile...*/
i++
;
}
return
0
;
}
Voici une autre version (meilleure) :
#include <stdio.h>
int
main (
) {
int
i =
0
;
while
(
i!=
100
) {
printf
(
"
%d
"
,i);
i+=
2
;
}
return
0
;
}
Enfin, n'oubliez pas le tableau :
x=i++ | Copie d'abord la valeur de i dans x et incrémente i après |
x=i-- | Copie d'abord la valeur de i dans x et décrémente i après |
x=++i | Incrémente i d'abord puis copie le contenu de i dans x |
x=--i | Décrémente i d'abord puis copie le contenu de i dans x |