IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Le C en 20 heures


précédentsommairesuivant

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

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

 
Sélectionnez
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.
 
Sélectionnez
getchar();
 
Sélectionnez
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.

  1. lisez le programme suivant
  2. lisez les explications qui figurent en dessous du programme
  3. exécutez, testez, comprenez ce programme…
 
Sélectionnez
#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 :
 
Sélectionnez
sortie=((car=='s')||(car=='S'));
lorsque car vaudra 's' ou 'S', sortie vaudra 1 c'est‐à‐dire Vrai. Dans tous les autres cas, sortie vaudra 0, soit la valeur Faux.
Dès lors, les deux extraits de programme suivants sont équivalents :
 
Sélectionnez
sortie = ((car == 's') || (car == 'S'));
 
Sélectionnez
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 :

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

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

Par exemple :
 
Sélectionnez
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 :
 
Sélectionnez
10 modulo 2=0
10 modulo 3=1

VI-F. Nombres pseudo‐aléatoires

Image non disponible Voici un petit exemple de programme qui permet d'obtenir des nombres pseudo‐aléatoires entre 0 et 99 :

 
Sélectionnez
#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…
 
Sélectionnez
#include <stdio.h> 
#include <stdlib.h> 
int main() {
   /* Pour notre information */
   printf ("RAND_MAX : %ld\n", RAND_MAX);
   return 0;
}

Image non disponible 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.
Voici un exemple de dialogue avec l'ordinateur :
 
Sélectionnez
Entrez votre nombre: 50

C'est plus !



Entrez votre nombre: 25

C'est moins !



...



Gagné !!!

VI-G. Corrigés des exercices du chapitre

Image non disponible Corrigé de l'exercice n°5.1 — Plus grand ou plus petit que…

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

Image non disponible Corrigé de l'exercice n°5.2 — Sortir de la boucle

 
Sélectionnez
#include <stdio.h> 
#include <stdlib.h> 
int main () {
   int valeur=0;
   do {
      printf ("Votre nombre : ");
      scanf ("%d",&valeur);
   }
   while (valeur != 10);
   return 0;
}

Image non disponible Corrigé de l'exercice n°5.3 — Deviner un nombre

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

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.