Bonjour, pour m'exercer au condition et au boucle en c j'essaye de faire un petit exercice dans le quelle je dois rendre l'argent si le prix est plus petit mon programme fonctionne mais quand j'essais de le faire avec des décimaux pour les centimes la le programme tourne en s’arrêtant a 1 et ma tour crache ses poumon je me dis que c'est pas normal pouvez vous m'aider a savoir ou j'ai fauter merci d'avance.
#include <stdio.h>
#include <stdlib.h>
/*
EXERCICE 2 :
Écrire un programe de rendu de monnaie. En saisissant le montant total des achats puis la somme
donnée, indiquer la monnaie à rendre (en billet de 20, 10, 5 et pièces de 2 ou 1)
Indication :
-S'assurer que la somme donnée est bien supérieur à la somme des achats
-Gérer le cas ou aurait payé un montant égale au achats
-Rendre le moins de billets/pièce possible
-L'opérateur % sera utile pour cette exercice
*/
int main(void)
{
//variables
double montantAchat = 100;
double payement = 0;
double reste = 0;
//Monaiefloat
int nbBilletsVin = 0;
int nbBilletsDix = 0;
int nbBilletsCinq = 0;
int nbPieceDeux = 0;
int nbPieceUn = 0;
int nbPieceCinquanteCentime = 0;
int nbPieceVingtCentime = 0;
int nbPieceDixCentime = 0;
int nbPieceCinqCentime = 0;
printf("Prix des course : %f\n", montantAchat);
printf("Regler : ");
scanf("%le", &payement);
//Vérification si le payement est dans les régles
if(payement < montantAchat)
{
printf("Tu n' a pas donnée assez d'argent !!!\n");
exit(0);
}
//Calcule du rendue
payement -= montantAchat;
reste = payement;
if(reste)
{
printf("Reste : %f\n", reste);
while(reste > 0)
{
//Pour 20 euros
if(reste - 20 >= 0)
{
reste -= 20;
nbBilletsVin ++;
printf("Billet de vingt : %d\n", nbBilletsVin);
printf("Reste : %f\n\n", reste);
}
//Pour 10 euros
else if(reste - 20 < 0 && reste - 10 >= 0)
{
reste -= 10;
nbBilletsDix ++;
printf("Billet de dix : %d\n", nbBilletsDix);
printf("Reste : %f\n\n", reste);
}
//Pour 5 euros
else if(reste - 10 < 0 && reste -5 >= 0)
{
reste -= 5;
nbBilletsCinq ++;
printf("Billet de cinque : %d\n", nbBilletsCinq);
printf("Reste : %f\n\n", reste);
}
//Pour 2 euros
else if(reste - 5 < 0 && reste -2 >= 0)
{
reste -= 2;
nbPieceDeux ++;
printf("Pièce de deux : %d\n", nbPieceDeux);
printf("Reste : %f\n\n", reste);
}
//Pour 1 euros
else if(reste - 2 < 0 && reste -1 >= 0)
{
reste -= 1;
nbPieceUn ++;
printf("Pièce de un : %d\n", nbPieceUn);
printf("Reste : %f\n\n", reste);
}
//Pour 0.50 euros
else if(reste - 1.0 < 0 && reste -0.50 >= 0)
{
reste -= 0.50;
nbPieceCinquanteCentime ++;
printf("Pièce de un : %d\n", nbPieceCinquanteCentime);
printf("Reste : %f\n\n", reste);
}
//Pour 0;20 euros
else if(reste - 0.50 < 0 && reste -0.20 >= 0)
{
reste -= 0.20;
nbPieceVingtCentime ++;
printf("Pièce de un : %d\n", nbPieceVingtCentime);
printf("Reste : %f\n\n", reste);
}
//Pour 0.10
else if(reste - 0.20 < 0 && reste -0.10 >= 0)
{
reste -= 0.10;
nbPieceDixCentime ++;
printf("Pièce de un : %d\n", nbPieceDixCentime);
printf("Reste : %f\n\n", reste);
}
//Pour 0.5
else if(reste - 0.10 < 0 && reste -0.05 >= 0)
{
reste -= 0.05;
nbPieceCinqCentime ++;
printf("Pièce de un : %d\n", nbPieceCinqCentime);
printf("Reste : %f\n\n", reste);
}
}
printf("Reste : %f\n", reste);
}
else
{
printf("Le payement est tout pile\n");
}
return 0;
}
Pour ce genre de truc, il est plus simple de tout gérer avec des entiers en centimes, tu pourras faire du modulo et calculer ton rendu de monnaie en 2 lignes dans ta boucle. Les flottants ne servant plus qu'à la saisie et à l'affichage en multipliant ou divisant par 100.
Bonjour, pour m'exercer au condition et au boucle en c j'essaye de faire un petit exercice dans le quelle je dois rendre l'argent si le prix est plus petit mon programme fonctionne mais quand j'essais de le faire avec des décimaux pour les centimes la le programme tourne en s’arrêtant a 1 et ma tour crache ses poumon je me dis que c'est pas normal pouvez vous m'aider a savoir ou j'ai fauter merci d'avance.
Tu es tombé sur un problème très difficile en informatique, les calculs avec des nombres flottants.
En effet, la précision d'un nombre flottant est limitée (concrètement 64 bits pour un double).
Et il n'est pas possible de représenter exactement un nombre comme 100.10 avec le type double. En base 10, nous avons ce problème pour représenter un tiers (1/3 = 0.333333333...). Dans l'ordinateur c'est la base 2, et 0.1 ne peut pas être représenté exactement.
Voici un programme illustrant le problème en affichant d'abord 0.1 avec 6 décimales, puis 20, puis en hexidécimal:
On voit bien le problème avec 20 décimales. L'hexadécimal permet de retrouver les bits exacts, mais il faut d'abord maîtriser le format de stockage des nombres flottants, c'est un peu compliqué.
Puisque tu parles de 1/3, on n'a pas besoin des ordi pour s'embêter. 1/3 = 0.333... 1/3 * 3 = 1 0.333... * 3 = 0.999... Bien sûr, à la limite 0.999... = 1 mais si on s'arrête à un nombre fini de décimales, ce n'est plus vrai.
Le Tout est souvent plus grand que la somme de ses parties.
Problème de calcule de double ou float
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Bonhomme !! | Jeu de plateforme : Prototype.
Le Tout est souvent plus grand que la somme de ses parties.