Je suis débutant en programmation C, et j'aurais besoin d'un petit coup de pouce si possible. Je dois faire fonctionner une machine à café, et en fonction du prix de la boisson, rendre la monnaie du client. La machine à café peut prendre jusqu'à maximum 10 euros. Mon problème réside dans le fait qu'ayant des nombres décimaux, il m'est impossible d'utiliser un modulo pour récupérer mon reste... Je ne vois pas d'autres alternative possible, et c'est pour cela que je solicite votre aide. Mon code à pas mal de défauts (je suis vraiment novice ^^'), donc s'il y a quelque chose qui ne se fait pas, ou qui est simplifiable, je suis preneur !!
Voici les parties de mon code qui posent problème :
// on a la division : B Q R A
double calcul_monnaie (double n, double quotient, double reste, double rendu)
{
quotient = rendu / n;
reste = rendu - n*quotient;
rendu = reste;
printf("%.2f x %f\n", quotient, n);
return rendu;
}
rendu = somme - prix;
printf("La monnaie à rendre est : %.2f\n", rendu);
if (rendu < 10 && rendu > 5)
{
n = 5;
calcul_monnaie (n, quotient, reste, rendu);
if (rendu < 5 && rendu > 2)
{
n = 2;
calcul_monnaie (n, quotient, reste, rendu);
if (rendu < 2 && rendu > 1)
{
n = 1;
calcul_monnaie (n, quotient, reste, rendu);
if (rendu < 1 && rendu > 0.5)
{
n = 0.5;
calcul_monnaie (n, quotient, reste, rendu);
if (rendu < 0.5 && rendu > 0.2)
{
n = 0.2;
calcul_monnaie (n, quotient, reste, rendu);
if (rendu < 0.2 && rendu > 0.1)
{
n = 0.1;
calcul_monnaie (n, quotient, reste, rendu);
if (rendu < 0.1 && rendu > 0.05)
{
n = 0.05;
calcul_monnaie (n, quotient, reste, rendu);
if (rendu < 0.05 && rendu > 0.02)
{
n = 0.02;
calcul_monnaie (n, quotient, reste, rendu);
if(rendu < 0.02 && rendu > 0.01)
{
n = 0.01;
calcul_monnaie (n, quotient, reste, rendu);
}
}
}
}
}
}
}
}
}
}
}
Il y a toujours un bon réflexe à avoir quand on manipule des sommes d'argent : utiliser la plus petite valeur possible comme unité pour n'avoir à travailler qu'avec des entiers …
En l'occurrence, on peut actuellement utiliser le centime d'euro comme unité de base. Ça simplifie énormément la vie. Autant refactorer car ton code est tout petit.
J'ai bien fait comme tu me l'as conseillé, seuleument ça ne compile pas car j'utilise double. Et je ne peux pas passer en int car mon exercice m'oblige à utiliser les double pour cette programmation...
Et je ne peux pas passer en int car mon exercice m'oblige à utiliser les double pour cette programmation...
A mon avis, seul le résultat doit être présenté au format double. Rien ne t'empêche dans ton programme d'utilser des entiers, surtout que des comparaisons entre flottants, c'est plutôt galère.
- Edité par edgarjacobs 11 avril 2021 à 16:49:20
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Oui tu as raison et c'est ce que j'aurais probablement fait si mon exercice ne m'obligeait pas à respecter le prototype de la fonction avec pour paramètres uniquement des variables de type double. Mais merci, j'ignorais que l'on pouvait directement diviser, faire un modulo etc dans un printf ^^.
Je ferais un tableau des monnaies à rendre en centimes et une boucle pour le parcourir, une machine ne rend que des pièces, ça ne va pas chercher loin. Il faut toujours penser tableaux, imagine la tête de ton code s'il y avait 5000 pièces différentes...
La question à se poser est : "Comment mon code gère 2 ou 100000000 éléments sans avoir à le modifier".
Un modulo sur des réels, ça se fait, il faut juste le faire soi-même. Mais c'est inutile ici, il faut penser entier dès que c'est possible.
J'ai essayé de modifier mon code en prenant compte de vos avis, seuleument dans le else après la condition switch, ça ne m'affiche pas la monnaie rendue. Par exemple, j'aimerais pouvoir afficher en sortie, (mais j'ignore comment m'y prendre) :
1 x 5 euro
2 x 2 euro
1 x 0.2 euro
Désolé j'ai un peu de mal ^^', merci encore !
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <math.h>
// partie A *******************************************************************************
void affichage_boisson ()
{
printf("╔════════════════════════╦═══════╦═══════╗\n");
printf("║ BOISSONS ║ PRIX ║ CHOIX ║\n");
printf("╠════════════════════════╬═══════╬═══════╣\n");
printf("║ Café court ----------- ║ 0.70 ║ 0 ║\n");
printf("║ Café long ------------ ║ 0.80 ║ 1 ║\n");
printf("║ Café au lait --------- ║ 0.60 ║ 2 ║\n");
printf("║ Chocolat ------------- ║ 0.50 ║ 3 ║\n");
printf("║ Lait ----------------- ║ 0.50 ║ 4 ║\n");
printf("║ Thé au citron -------- ║ 0.60 ║ 5 ║\n");
printf("║ Thé à la menthe ------ ║ 0.90 ║ 6 ║\n");
printf("║ Thé au gingembre ----- ║ 1.20 ║ 7 ║\n");
printf("║ Thé au miel ---------- ║ 1.40 ║ 8 ║\n");
printf("║ Zlatan tea ----------- ║ 8.75 ║ 9 ║\n");
printf("╚════════════════════════╩═══════╩═══════╝\n");
}
void achat_boisson (double monnaie_dispo [], double prix_boisson[], int choix, double somme)
{
double prix, rendu, quotient, reste, n;
double tab_monnaie [10];
int i;
// initialisation du tableau des différentes monnaies de la machine
monnaie_dispo [0] = 0.01;
monnaie_dispo [1] = 0.02;
monnaie_dispo [2] = 0.05;
monnaie_dispo [3] = 0.10;
monnaie_dispo [4] = 0.20;
monnaie_dispo [5] = 0.50;
monnaie_dispo [6] = 1;
monnaie_dispo [7] = 2;
monnaie_dispo [8] = 5;
monnaie_dispo [9] = 10;
// initialisation des prix des différentes boissons
prix_boisson [0] = 0.70;
prix_boisson [1] = 0.80;
prix_boisson [2] = 0.60;
prix_boisson [3] = 0.50;
prix_boisson [4] = 0.50;
prix_boisson [5] = 0.60;
prix_boisson [6] = 0.90;
prix_boisson [7] = 1.20;
prix_boisson [8] = 1.40;
prix_boisson [9] = 8.75;
printf("Quel est votre choix ? - tapez '10' pour quitter -\n");
scanf ("%d", &choix);
if (choix >= 10)
{
printf("Veuillez saisir une boisson comprise dans le choix...\n");
scanf ("%d", &choix);
}
printf("Donnez votre montant : ");
scanf("%lf", &somme);
// en fonction du choix de l'utilisateur, donne le prix à payer
switch (choix)
{
case 0 :
prix = prix_boisson [0];
break;
case 1 :
prix = prix_boisson [1];
break;
case 2 :
prix = prix_boisson [2];
break;
case 3 :
prix = prix_boisson [3];
break;
case 4 :
prix = prix_boisson [4];
break;
case 5 :
prix = prix_boisson [5];
break;
case 6 :
prix = prix_boisson [6];
break;
case 7 :
prix = prix_boisson [7];
break;
case 8 :
prix = prix_boisson [8];
break;
case 9 :
prix = prix_boisson [9];
break;
default :
exit(-1);
break;
}
if (somme < prix)
{
printf("Vous n'avez pas assez de monnaie...");
printf("\n");
sleep (3);
system ("clear");
affichage_boisson ();
achat_boisson (monnaie_dispo, prix_boisson, choix, somme);
}
else
{
rendu = somme - prix;
printf("La monnaie à rendre est : %.2f\n", rendu);
while (rendu > 0)
{
for (i = 0; i <= 9; i++)
{
if (rendu >= monnaie_dispo [i])
{
rendu = rendu - monnaie_dispo [i];
tab_monnaie [i] = rendu;
}
}
}
for (i = 0; i <= 9; i++)
{
printf("La monnaie : %.2f", tab_monnaie[i]);
}
}
}
int main ()
{
int choix;
double monnaie_dispo [10], prix_boisson[10], somme;
affichage_boisson ();
achat_boisson (monnaie_dispo, prix_boisson, choix, somme);
}
Il y a une fonction 'fmod' dans <math.h> qui fait ça, je crois.
Mmm, effectivement, comme quoi les choses sont parfois plus simples qu'elles n'y paraissent. Par contre fmod, je pense tout de suite à autre chose, il y en a qui n'ont pas bien choisi le nom de leur lib...
Tu peux avantageusement remplacer toutes ces lignes
switch (choix)
{
case 0 :
prix = prix_boisson [0];
break;
case 1 :
prix = prix_boisson [1];
break;
case 2 :
prix = prix_boisson [2];
break;
case 3 :
prix = prix_boisson [3];
break;
case 4 :
prix = prix_boisson [4];
break;
case 5 :
prix = prix_boisson [5];
break;
case 6 :
prix = prix_boisson [6];
break;
case 7 :
prix = prix_boisson [7];
break;
case 8 :
prix = prix_boisson [8];
break;
case 9 :
prix = prix_boisson [9];
break;
default :
exit(-1);
break;
}
par
if ((choix < 0) || (choix > 9)
exit (-1);
else
prix = prix_boisson[choix];
Si on t'oblige à donner le montant en double, on peut faire: donneEntier = (int) donneDouble * 100; Voici un petit bout de code qui dit comment retourner la monnaie. À toi de l'adapter pour afficher des "soi-disant" doubles ... - #include <stdio.h> int main() { int donne; printf("Montant donné: "); scanf("%d", &donne); int machine[] = {100, 50, 20, 10, 5, 2, 1}; int l = sizeof machine / sizeof(int); // dimension du tableau for(int i=0; i < l; i++) { int pieces = donne / machine[i]; donne = donne % machine[i]; if(pieces != 0) printf("%d pièces de %d centimes\n", pieces, machine[i]); } // for } // main
Le Tout est souvent plus grand que la somme de ses parties.
Merci Zoup, c'est vrai que c'est largement plus efficace ^^' !
PierrotLeFou a écrit:
Si on t'oblige à donner le montant en double, on peut faire: donneEntier = (int) donneDouble * 100; Voici un petit bout de code qui dit comment retourner la monnaie. À toi de l'adapter pour afficher des "soi-disant" doubles ... - #include <stdio.h> int main() { int donne; printf("Montant donné: "); scanf("%d", &donne); int machine[] = {100, 50, 20, 10, 5, 2, 1}; int l = sizeof machine / sizeof(int); // dimension du tableau for(int i=0; i < l; i++) { int pieces = donne / machine[i]; donne = donne % machine[i]; if(pieces != 0) printf("%d pièces de %d centimes\n", pieces, machine[i]); } // for } // main
Je vais voir ce que ça donne, il ne m'est pas venu à l'esprit que j'aurais pu utiliser des sizeof. Je vais essayer et l'adapter, merci beaucoup !!!!
Comme je n'ai pas accès au bouton code avec ma synthèse vocale, j'ai précédé chaque ligne par un point pour préserver l'indentation. Le code suivant affiche en "pseudo" double et s'occupe des pluriels. Tu verras qu'on peut mettre une fonction comme paramètre d'une autre fonction. - .#include <stdio.h> .char *euros(int c) { . static char str[20]; // devrait suffire pour une machine à café . char *s = ""; . if(c/100 > 1) s = "s"; . sprintf(str, "%d.%02d euro%s", c/100, c%100, s); . return(str); .} .int main() { . int donne; . printf("Montant donné: "); . scanf("%d", &donne); . int machine[] = {100, 50, 20, 10, 5, 2, 1}; . int l = sizeof machine / sizeof(int); // dimension du tableau . for(int i = 0; i < l; i++) { . int pieces = donne / machine[i]; . donne = donne % machine[i]; . char *s = ""; . if(pieces > 1)s = "s"; . if(pieces != 0) printf("%d pièce%s de %s\n", pieces, s, euros(machine[i])); . } // for .} // main
Le Tout est souvent plus grand que la somme de ses parties.
Machine à café qui rend la monnaie
× 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.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
Bonhomme !! | Jeu de plateforme : Prototype.
Bonhomme !! | Jeu de plateforme : Prototype.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.