a)
#include <stdio.h> main() { int PNET, TVA; double PBRUT; printf("Entrez le prix net de l'article : "); scanf("%d", &PNET); printf("Entrez le taux de la TVA (en %) : "); scanf("%d", &TVA); PBRUT = PNET+(double)PNET*TVA/100; printf("Le prix brut est %.2lf Francs\n",PBRUT); return 0; }
Remarque: Conversion des types et priorités
Lors du calcul de PBRUT (type double), nous divisons le produit du PNET (type int) et de la TVA (type int) par 100. Pour ne pas perdre de la précision lors de la division et pour éviter un dépassage du domaine lors du calcul du produit, il faut forcer l'utilisation du type double.
En utilisant l'opérateur de la conversion forcée, il faut respecter la suite de l'évaluation de l'expression. Il ne suffirait donc pas d'écrire:
PBRUT = (double)PNET+PNET*TVA/100;
Parce que la multiplication et la division ont la priorité sur l'addition; la conversion se ferait trop tard, c.-à-d.: à la fin du calcul.
Il existe plusieurs possibilités de résoudre ce problème:
- utiliser la conversion (double) lors des premières opérations effectuées:
PBRUT = PNET+(double)PNET*TVA/100;
- utiliser une constante du type double lors de la division:
PBRUT = PNET+PNET*TVA/100.0;
- déclarer PNET et/ou TVA comme double :
double PNET, TVA, PBRUT;
suite . . .
b)
#include <stdio.h> main() { int TVA; double PNET, PBRUT; /* donnée et résultat du type double */ printf("Entrez le prix brut de l'article : "); scanf("%lf", &PBRUT); printf("Entrez le taux de la TVA (en %) : "); scanf("%d", &TVA); /* Calcul: Ici, pas de forçage de type nécessaire */ PNET = PBRUT*100/(100+TVA); printf("Le prix net est %.2lf Francs\n", PNET); return 0; }
Remarque: Conversion de types et priorités
Ici, PNET et PBRUT sont du type double. Comme l'évaluation des opérateurs binaires * et / se fait en passant de gauche à droite, la valeur 100 est d'abord convertie en double (valeur 100.0) pour être multipliée avec PBRUT. La première opérande de la division est donc du type double et le résultat de l'addition est automatiquement converti en double avant la division.
Un simple remède aux confusions serait ici l'utilisation de la constante 100.0 à la place de 100 :
PNET = PBRUT*100.0/(100.0+TVA));