Choisissez votre style : style 1,    style 2,    sans commentaire,    impression,    ancien.

Correction série 01 :
Variables et opérateurs en C

Exercice 1 Exercice 2 Exercice 3 Exercice 4

Avertissement : les solutions suivantes ne sont pas uniques. Si vous en trouvez de meilleures (ou si vous trouvez des erreurs), merci de le faire savoir.


Exercice 1 : Variables

(fichier src/age.c)

/* C89 */
#include <stdio.h>
 
int main(void)
{
  /* Déclarations + initialisations */
  int age = 0;
  int annee = 2020;
 
  printf("Entrez votre âge :\n"); /* Affichage de la question */
  scanf("%d", &age);              /* Lecture de la réponse    */
  annee -= age;                   /* Calcul                   */
 
  /* Affichage de l'année */
  printf("Vous êtes né(e) vers l'année %d\n", annee);
  return 0;
}
 

Exercice 2 : Variables 2

Programme :

(fichier src/vars.c)

/* C89 */
#include <stdio.h>
 
int main(void)
{
  int x, y;                           /* déclarations */
  double a = 0.0, b = 0.0, c = 0.0, d = 0.0;
  x=2; y=4;                           /* affectations ; puisque la donnée demande des affectations.
                                       * En toute rigueur, il aurait été préférable de faire des initialisations...
                                       */
  a=x+y; b=x-y; c=x*y; d=x/y;         /* opérations   */
                                      /* affichage des résultats */
  printf(" 2+4=%f  2-4=%f  2*4=%f  2/4=%f\n", a, b, c, d);
  return 0;
}
 

Puis même chose en remplaçant "int x, y;" par "double x, y;" puis par "int x; double y;".

Explications :

Lorsque les deux opérandes (x et y) sont de type entier, l'expression x/y est évaluée comme la division entière (ou division «euclidienne») ! Et donc, le résultat obtenu est le quotient de cette division. Dans le cas précis (x=2 et y=4), on obtient bien 0 :

x = 0 * y + 2

Par contre, dès qu'une opérande est de type double, c'est une division réelle qui est effectuée. C'est-à-dire que le résultat est la valeur (approchée à la précision des double) du nombre réel correspondant.


Exercice 3 : Expressions conditionnelles

Programme :

(fichier src/intervalle.c)

#include <stdio.h>
 
int main(void) {
  double x = 0.0;               /* déclaration et initialisation */
  printf("Entrez un réel :\n"); /* demande à l'utilisateur d'entrer un réel */
  scanf("%lf", &x);             /* enregistre la réponse dans x */
 
  if ( (x >= -1.0) && (x < 1.0) ) { 
      printf("x appartient à I\n");
  } else {
      printf("x n'appartient pas à I\n");
  }
  return 0;
}
 

Réponses du programme :

./intervalle
Entrez un nombre décimal : -2.5
x n'appartient pas à I

./intervalle
Entrez un nombre décimal : -1
x appartient à I

./intervalle
Entrez un nombre décimal : 0.5
x appartient à I

./intervalle
Entrez un nombre décimal : 1
x n'appartient pas à I

./intervalle
Entrez un nombre décimal : 1.5
x n'appartient pas à I

Exercice 4 : Expressions conditionnelles 2

Programme :

(fichier src/intervalles2.c)

#include <stdio.h>
 
int main(void) {
  double x = 0.0;               /* déclaration et initialisation */
  printf("Entrez un réel :\n"); /* demande à l'utilisateur d'entrer un réel */
  scanf("%lf", &x);             /* enregistre la réponse dans x */
 
  if (   (!(x < 2.0)                &&  (x <  3.0)                )
      || (!(x < 0.0) && !(0.0 == x) && ((x <  1.0) || ( 1.0 == x)))
      || (!(x < -10.0)              && ((x < -2.0) || (-2.0 == x)))
     ) {
      printf("x appartient à I\n");
  } else {
      printf("x n'appartient pas à I\n");
  }
  return 0;
}
 

Remarque :

Il n'est jamais bon de comparer exactement des valeurs de double, c.-à-d. d'utiliser == sur des double car, mis à part quelques cas particuliers (commme par exemple ici la lecture directe de la valeur), il est rare que la valeur d'un double soit connue avec assez de précision (accumulation d'erreurs d'arrondi). Il est conseillé de plutôt alors utiliser un test sur la valeur absolue de l'écart absolu ou relatif, comme par exemple : abs(x-y)<1e-12 ou abs(x-y)/x<1e-12 (pas au voisinage de 0 bien sûr !). Dans ce cas, le mieux est de faire une fonction... ...ce que nous verrons la semaine prochaine.

Réponses du programme :

./intervalle
Entrez un nombre décimal : -20
x n'appartient pas à I

./intervalle
Entrez un nombre décimal : -10
x appartient à I

./intervalle
Entrez un nombre décimal : -2
x appartient à I

./intervalle
Entrez un nombre décimal : -1
x n'appartient pas à I

./intervalle
Entrez un nombre décimal : 0
x n'appartient pas à I

./intervalle
Entrez un nombre décimal : 1
x appartient à I

./intervalle
Entrez un nombre décimal : 1.5
x n'appartient pas à I

./intervalle
Entrez un nombre décimal : 2
x appartient à I

./intervalle
Entrez un nombre décimal : 3
x n'appartient pas à I

./intervalle
Entrez un nombre décimal : 4
x n'appartient pas à I

Dernière mise à jour le 17 février 2020
Last modified: Mon Feb 17, 2020