Suite de petits calcul (rendue de monaie) [Résolu]

nem02004 47 Messages postés vendredi 21 mai 2004Date d'inscription 23 avril 2007 Dernière intervention - 11 nov. 2006 à 06:27 - Dernière réponse : Arnaud16022 1329 Messages postés vendredi 15 août 2003Date d'inscription 16 juin 2010 Dernière intervention
- 11 nov. 2006 à 13:21
Alors voila, je désire faire un petit programme qui m'indique la monaie à rendre aux clients,
pour cela j'entre lr prix de l'article, j'entre le montant que le client me donne.
Le programme doit m'indiquer la monaie que je puisse rendre au client ( le plus de grosse somme possible ).
Exemple:
le prix: 5
le montant donné: 20
je doit rendre: 1 billet de 10, et 1 billet de 5

Alors les calculs ont l'air de bien marché, cependant, si je met par exemple:
prix: 5.24
montant: 5008.68

Il m'affiche:
Le prix de l'article: 5.240000 euros (comment ne pas avoir tout les 0 inutiles ?)
Le montant donné: 5008.680176(d'ou sort ce 0176 ?? )

M'erci d'avance pour la réponse à ces 2 questions, et aux bon conseils que vous me donnerez pour améliorer/optimiser le programme.

Voila le programme que j'ai fait:

#include <stdio.h>
#include <stdlib.h>



int main()
{
    float prix,donne,rendre;
    printf("Quel est le prix de la marchandise ? "); scanf("%f", &prix); //L'utilisateur entre le prix de la marchandise
    printf("\nCombien donne l'acheteur ? "); scanf("%f", &donne); //Il entre la somme que le client lui donne
   
    rendre=donne-prix; //On stock dans la variable 'rendre' la somme à rendre (somme donnée - prix)
    printf("\n\nLa marchandise coute %f euros",prix);
    printf("\nIl nous donne %f euros",donne);
    printf("\n\nOn doit lui rendre %f euros",rendre);
   
   
    /* On déclare les variables qui correspondent au nombre de billet/pieces de X somme que loin doit rendre */
    int billet500=0; int billet200=0; int billet100=0; int billet50=0; int billet20=0; int billet10=0; int billet5=0;
    int piece2=0; int piece1=0; int piece050=0; int piece020=0; int piece010=0; int piece005=0; int piece002=0; int piece001=0;
   
    /* on calcul le nombre maximum de billets de 500 euros que l'on peut rendre en ne rendant pas plus que prévu */
    while (billet500 * 500 <= rendre) { billet500++; }
    billet500--;
    rendre = rendre - billet500 * 500; //On met a jour la variable 'rendre' avec la nouvelle somme à rendre.
   
   
    /* On fait pareil pour tout les autre billets/pieces */    while (billet200 * 200 <rendre) { billet200++; } billet200--; rendre rendre - billet200 * 200;    while (billet100 * 100 <rendre) { billet100++; } billet100--; rendre rendre - billet100 * 100;    while (billet50 * 50 <rendre) { billet50++; } billet50--; rendre rendre - billet50 * 50;    while (billet20 * 20 <rendre) { billet20++; } billet20--; rendre rendre - billet20 * 20;    while (billet10 * 10 <rendre) { billet10++; } billet10--; rendre rendre - billet10 * 10;    while (billet5 * 5 <rendre) { billet5++; } billet5--; rendre rendre - billet5 * 5;    while (piece2 * 2 <rendre) { piece2++; } piece2--; rendre rendre - piece2 * 2;    while (piece1 * 1 <rendre) { piece1++; } piece1--; rendre rendre - piece1 * 1;    while (piece050 * 0.50 <rendre) { piece050++; } piece050--; rendre rendre - piece050 * 0.50;    while (piece020 * 0.20 <rendre) { piece020++; } piece020--; rendre rendre - piece020 * 0.20;    while (piece010 * 0.10 <rendre) { piece010++; } piece010--; rendre rendre - piece010 * 0.10;    while (piece005 * 0.05 <rendre) { piece005++; } piece005--; rendre rendre - piece005 * 0.05;    while (piece002 * 0.02 <rendre) { piece002++; } piece002--; rendre rendre - piece002 * 0.02;    while (piece001 * 0.01 <rendre) { piece001++; } piece001--; rendre rendre - piece001 * 0.01;



    /* Si le nombre de billets de 500 à distribué n'est pas nulle, on affiche le nombre de billets à rendre */
    if (billet500 >= 1) { printf("\n\nOn donne au client %d billets de 500 euros. (soit: %d euros)",billet500,billet500 * 500); }
   
    /* On fait pareil pour tout les autre billets/pieces */
    if (billet200 >= 1) { printf("\nOn donne au client %d billets de 200 euros. (soit: %d euros)",billet200,billet200 * 200); }
    if (billet100 >= 1) { printf("\nOn donne au client %d billets de 100 euros. (soit: %d euros)",billet100,billet100 * 100); }
    if (billet50 >= 1) { printf("\nOn donne au client %d billets de 50 euros. (soit: %d euros)",billet50,billet50 * 50); }
    if (billet20 >= 1) { printf("\nOn donne au client %d billets de 20 euros. (soit: %d euros)",billet20,billet20 * 20); }
    if (billet10 >= 1) { printf("\nOn donne au client %d billets de 10 euros. (soit: %d euros)",billet10,billet10 * 10); }
    if (billet5 >= 1) { printf("\nOn donne au client %d billets de 5 euros. (soit: %d euros)",billet5,billet5 * 5); }
    if (piece2 >= 1) { printf("\nOn donne au client %d pieces de 2 euros. (soit: %d euros)",piece2,piece2 * 2); }
    if (piece1 >= 1) { printf("\nOn donne au client %d pieces de 1 euro. (soit: %d euros)",piece1,piece1 * 1); }
    if (piece050 >= 1) { printf("\nOn donne au client %d pieces de 50 centimes. (soit: %f euros)",piece050,piece050 * 0.50); }
    if (piece020 >= 1) { printf("\nOn donne au client %d pieces de 20 centimes. (soit: %f euros)",piece020,piece020 * 0.20); }
    if (piece010 >= 1) { printf("\nOn donne au client %d pieces de 10 centimes. (soit: %f euros)",piece010,piece010 * 0.10); }
    if (piece005 >= 1) { printf("\nOn donne au client %d pieces de 5 centimes. (soit: %f euros)",piece005,piece005 * 0.05); }
    if (piece002 >= 1) { printf("\nOn donne au client %d pieces de 2 centimes. (soit: %f euros)",piece002,piece002 * 0.02); }
    if (piece001 >= 1) { printf("\nOn donne au client %d pieces de 1 centime. (soit: %f euros)",piece001,piece001 * 0.01); }
    printf("\n\n\n");
   
    system("PAUSE"); 
    return 0;
}
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Pole4 20 Messages postés mardi 11 octobre 2005Date d'inscription 13 mars 2007 Dernière intervention - 11 nov. 2006 à 08:57
3
Merci
Si tu veux que 2 décimales, il faut mettre %.2f dans le printf.
Pour ce débarraser du 0176,il faut passer en double. L'ordinateur ne calcule pas en base 10 mais en base 2 et comme 5008.68 ne s'écrit pas exactment en base 2, il y a des erreurs de conversion. Il faut donc augmenter la précision pour diminuer ces erreurs.

Pole.

Merci Pole4 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de Pole4
Arnaud16022 1329 Messages postés vendredi 15 août 2003Date d'inscription 16 juin 2010 Dernière intervention - 11 nov. 2006 à 13:21
0
Merci
lâche ces float.

Multiplie toutes tes sommes par 100 et compte en centimes ( càd des int -> pas de perte de précision )

Utilise des tableau plutôt que des if / if / if


Ton prog sera plus stable, plus rapide, plus facile à maintenir.

_______________________

Omnia vincit labor improbus
Commenter la réponse de Arnaud16022

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.