Suite de petits calcul (rendue de monaie)

Résolu
nem02004 Messages postés 47 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 23 avril 2007 - 11 nov. 2006 à 06:27
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 - 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;
}

2 réponses

Pole4 Messages postés 20 Date d'inscription mardi 11 octobre 2005 Statut Membre Dernière intervention 13 mars 2007
11 nov. 2006 à 08:57
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.
3
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
11 nov. 2006 à 13:21
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
0
Rejoignez-nous