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.
(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; }
(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;".
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.
(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; }
./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
(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; }
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.
./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