Le C en 20 heures


précédentsommairesuivant

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 :

 
Sélectionnez
do {...} while(condition);

il est possible d'utiliser :

 
Sélectionnez
while(condition) {...}
 
Sélectionnez
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).

Image non disponible Exercice n°6.1 — Touche-touche

Traduisez en langage C, complétez avec les variables nécessaires, compilez, exécutez, comprenez :

 
Sélectionnez
Faire
   Saisir une touche
Tant Que (touche != S) et (touche != s)

Image non disponible Exercice n°6.2 — Saisir un nombre

Traduisez en langage C, complétez avec les variables nécessaires, compilez, exécutez, comprenez :

 
Sélectionnez
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 :

 
Sélectionnez
#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

Image non disponible 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.

Image non disponible 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.

Par exemple :
 
Sélectionnez
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.

 
Sélectionnez
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.

Image non disponible 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.

Image non disponible 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

Image non disponible 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.

Image non disponible 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 :

 
Sélectionnez
i++;
i=i+1;

Il y a cependant une nuance subtile.

Pour bien comprendre, étudions le programme suivant :

 
Sélectionnez
#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 :

 
Sélectionnez
x: 5 n: 6

Analysons ce qui se passe lors de l'application de la ligne (x=n++) :

  1. on affecte n à x, donc x va contenir la valeur 5
  2. on augmente n de 1, donc n vaudra 6

On parlera dans ce cas d'incrémentation post‐fixée…

Voici un autre exemple :

 
Sélectionnez
#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 :

 
Sélectionnez
x: 6 n: 6

Analysons ce qui se passe lors de l'application de la ligne(x=++n) :

  1. on augmente n de 1, donc n vaudra 6
  2. on affecte n à x, donc x va contenir la valeur 6

On parlera dans ce cas d'incrémentation pré‐fixée… 

Table 6.1 - Incrémentation / Décrémentation
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

Image non disponible Corrigé de l'exercice n°6.1 — Touche-touche

 
Sélectionnez
#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;
}

Image non disponible Corrigé de l'exercice n°6.2 — Saisir un nombre

 
Sélectionnez
#include <stdio.h> 
int main () {
   int nbre = 0;
   printf("Tapez 10 pour arrêter ...\n");
   do {
      scanf ("%d", &nbre);
   }while (nbre != 10);
   return 0;
}

Image non disponible Corrigé de l'exercice n°6.3 — Recommencez ! (a)

 
Sélectionnez
#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 :

 
Sélectionnez
#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;
}

Image non disponible Corrigé de l'exercice n°6.4 — Recommencez ! (b)

 
Sélectionnez
#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;
}

Image non disponible 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.]

 
Sélectionnez
#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;
}

Image non disponible Corrigé de l'exercice n°6.6 — Recommencez ! (d)

Prenez soin de lire l'exemple d'exécution et son explication :

 
Sélectionnez
#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 :

 
Sélectionnez
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…

Image non disponible Corrigé de l'exercice n°6.7 — Recommencez ! (e)

 
Sélectionnez
#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;
}

Image non disponible Corrigé de l'exercice n°6.8 — Recommencez ! (f)

 
Sélectionnez
#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 :

 
Sélectionnez
#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) :

 
Sélectionnez
#include <stdio.h> 
int main () {
   int i = 0;
   while (i!=100) {
      printf("%d ",i);
      i+=2;
   }
   return 0;
}

Enfin, n'oubliez pas le tableau : 

Table 6.2 - Incrémentation / Décrémentation (bis)
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

précédentsommairesuivant

  

Licence Creative Commons
Le contenu de cet article est rédigé par Eric Berthomier et Daniel Schang et est mis à disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.