Rendre la monnaie
ismail
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Je dois rendre un projet demain et je tombe sur un problème depuis 2 jours et j'arrive pas à le résoudre. J'explique:
un automate de billet de transport qui doit rendre la monnaies et distribuer le billet à la fin de paiement et qui diminue le nbr de pièces (soit 5chf , 2 ,1 ,0.50,0.10,0.20) à chaque moment ou on a rendu une pièce précis .
pour le moment j'ai réussi à rendre des pièces de 5 (puisque il diminue le nbr de pièce de 5chf)
le problème j'arrive pas à faire la suite, exemple:
si la monnais A RENDRE est 6.50 on doit rendre 5chf et 1 chf et 0.50
8,20 chf on doit rendre 5 chf et 2chf et 1 chf et 0.20
voilà mon code :
mon code marche comme il faut pour rendre 6,50 (il diminue le nbr de pièce de 5 et le nbr de pièce de 1 et le nbr de pièce de 0.50)
comment je doit faire dans les autres cas ? est ce que je doit refaire ça dans chaque cas (parceque ça c'est juste lorsque la monnaie est supérieur de 5chf!) il me semble que je complique la vie! peut être quelqu'un il a une idée mieux que ça surement !
merci beaucoup pour vos réponses !
Je dois rendre un projet demain et je tombe sur un problème depuis 2 jours et j'arrive pas à le résoudre. J'explique:
un automate de billet de transport qui doit rendre la monnaies et distribuer le billet à la fin de paiement et qui diminue le nbr de pièces (soit 5chf , 2 ,1 ,0.50,0.10,0.20) à chaque moment ou on a rendu une pièce précis .
pour le moment j'ai réussi à rendre des pièces de 5 (puisque il diminue le nbr de pièce de 5chf)
le problème j'arrive pas à faire la suite, exemple:
si la monnais A RENDRE est 6.50 on doit rendre 5chf et 1 chf et 0.50
8,20 chf on doit rendre 5 chf et 2chf et 1 chf et 0.20
voilà mon code :
int res=0; double rest=0; int rest1=0; int rest2=0; double rest3=0; int rest4=0; int rest5=0; int rest6=0; // price=0.0; if(getMonnaiesArendre()>=5){ res= (int) (getMonnaiesArendre() / 5); if (tarifChoisis.nbrDePiecesDe5 >= res){ tarifChoisis.nbrDePiecesDe5=tarifChoisis.nbrDePiecesDe5-res; rest= getMonnaiesArendre() - (res*5); System.out.println(rest); if((int) (rest / 2)>0){ rest1= (int) (rest / 2); if(tarifChoisis.nbrDePiecesDe2>=rest1){ tarifChoisis.nbrDePiecesDe2=tarifChoisis.nbrDePiecesDe2-rest1; rest2=(int) (rest - (rest1*2)); System.out.println(rest1+"nbr de pieces de 2"+tarifChoisis.nbrDePiecesDe2); } } else if((int) (rest / 1)>0 ){ rest1= (int) (rest / 1); if(tarifChoisis.nbrDePiecesDe1>=rest1){ tarifChoisis.nbrDePiecesDe1=tarifChoisis.nbrDePiecesDe1-rest1; System.out.println("nbr de pieces de 1"+tarifChoisis.nbrDePiecesDe1); rest3= (rest - (rest1*1)); System.out.println(rest3); if(rest3>=0.5){ rest1= (int) (rest3 / 0.5); if(tarifChoisis.nbrDePiecesDeCinquante>=rest1){ rest4=(int) (rest3 - (rest1*0.5)); tarifChoisis.nbrDePiecesDeCinquante=tarifChoisis.nbrDePiecesDeCinquante-rest1; System.out.println("nbr de pieces de 0.5"+tarifChoisis.nbrDePiecesDeCinquante); } } } } else if((int) (rest / 0.5)>0 ){ rest1= (int) (rest / 0.5); if(tarifChoisis.nbrDePiecesDeCinquante>=rest1){ rest4=(int) (rest - (rest1*0.5)); tarifChoisis.nbrDePiecesDeCinquante=tarifChoisis.nbrDePiecesDeCinquante-rest1; System.out.println("nbr de pieces de 0.5"+tarifChoisis.nbrDePiecesDeCinquante); } } else if((int) (rest / 0.2)>0 ){ rest1= (int) (rest / 0.2); if(tarifChoisis.nbrDePiecesDeVingteCentime>=rest1){ rest5=(int) (rest - (rest1*0.2)); tarifChoisis.nbrDePiecesDeVingteCentime=tarifChoisis.nbrDePiecesDeVingteCentime-rest1; System.out.println("nbr de pieces de 0.2"+tarifChoisis.nbrDePiecesDeVingteCentime); } } else if((int) (rest / 0.1)>0 ){ rest1= (int) (rest / 0.1); if(tarifChoisis.nbrDePiecesDeDixCentime>=rest1){ rest6=(int) (rest - (rest1*0.1)); tarifChoisis.nbrDePiecesDeDixCentime=tarifChoisis.nbrDePiecesDeDixCentime-rest1; System.out.println("nbr de pieces de 0.1"+tarifChoisis.nbrDePiecesDeDixCentime); } } } monnaiesArendre=0.0; piecesChargees.total=0; }
mon code marche comme il faut pour rendre 6,50 (il diminue le nbr de pièce de 5 et le nbr de pièce de 1 et le nbr de pièce de 0.50)
comment je doit faire dans les autres cas ? est ce que je doit refaire ça dans chaque cas (parceque ça c'est juste lorsque la monnaie est supérieur de 5chf!) il me semble que je complique la vie! peut être quelqu'un il a une idée mieux que ça surement !
merci beaucoup pour vos réponses !
A voir également:
- Pour enregistrer ce texte au format txt sans perdre d’informations, quel codage utiliser ? l’€ est la monnaie officielle de la grèce, même sur l'île de μύκονος, à l’est d’athènes.
- Format epub c'est quoi - Guide
- Format factory - Télécharger - Conversion & Codecs
- Audacity enregistrer son pc - Guide
- Comment utiliser chromecast sur tv - Guide
- Hp usb disk storage format tool - Télécharger - Stockage
2 réponses
Bonjour,
Une manière très simple de s'en sortir c'est de compter en centimes, cela permet de n'avoir que des nombres entiers, on évite ainsi les valeurs flottantes qui sont imprécises et plus difficiles à manipuler.
Ensuite, plutôt que de faire un gros if/else de 60 lignes pas du tout maintenables, tu peux prendre un tableau qui contient les différentes valeurs des pièces qui existent (en centimes toujours), le code devient alors très simple à écrire.
Ce qui affiche :
Une manière très simple de s'en sortir c'est de compter en centimes, cela permet de n'avoir que des nombres entiers, on évite ainsi les valeurs flottantes qui sont imprécises et plus difficiles à manipuler.
Ensuite, plutôt que de faire un gros if/else de 60 lignes pas du tout maintenables, tu peux prendre un tableau qui contient les différentes valeurs des pièces qui existent (en centimes toujours), le code devient alors très simple à écrire.
public static final int[] CENTIMES = {500, 200, 100, 50, 20, 10, 5, 2, 1}; public static int[] monnaie(int centimes) { int[] rendu = new int[CENTIMES.length]; for (int i = 0; i < CENTIMES.length; i++ ) { rendu[i] = centimes / CENTIMES[i]; centimes %= CENTIMES[i]; } return rendu; } public static void afficher(int[] rendu) { for (int i = 0; i < CENTIMES.length; i++ ) if (rendu[i] != 0) System.out.printf("%d pièces de %d centimes\n", rendu[i], CENTIMES[i]); } public static void main(String[] args) { int centimes = 4789; System.out.printf("Monnaie sur %d centimes :\n", centimes); afficher(monnaie(centimes)); }
Ce qui affiche :
Monnaie sur 4789 centimes :
9 pièces de 500 centimes
1 pièces de 200 centimes
1 pièces de 50 centimes
1 pièces de 20 centimes
1 pièces de 10 centimes
1 pièces de 5 centimes
2 pièces de 2 centimes
j'aurais plutot fait un boucle dans ce genre (bon c'est tout moche , flemme de le mettre en forme)
a chaque parcours de la boucle tu donne une pièce , jusqu'a ce que la monnaie restante a donner soit égale a 0
ca simplifie beaucoup ^^
while (monnaie restante a donner(apppelé reste plus loin) >0) loop
if reste>=5 => donner une pièce de 5
else if reste>=2 => donen une pièce de 2
... pour les autres pièces
end if
end loop
a chaque parcours de la boucle tu donne une pièce , jusqu'a ce que la monnaie restante a donner soit égale a 0
ca simplifie beaucoup ^^
Merci beaucoup pour la réponse, oui je savais que c'était moche :) et en plus ça me casse la tete ! mais le problème maintenant que le reste il change a chaque fois , comment ton code va récupérer ça.
par exemple : 6,60
il rend 5chf il reste 1.60 il faut que le reste soit 1.60 et non 5chf(d'après ton exemple) et il continue dans ce cas .
est que t'arrive à m'écrire un bout de code pour ça par exemple ?
Merci infiniment
par exemple : 6,60
il rend 5chf il reste 1.60 il faut que le reste soit 1.60 et non 5chf(d'après ton exemple) et il continue dans ce cas .
est que t'arrive à m'écrire un bout de code pour ça par exemple ?
Merci infiniment
ça marche pas apparemment comme j'ai dis il fait juste la première condition pour 5 mais il continue pas en plus si je vais rendre 11chf par ex je dois rendre 2fois la pièce de 5 qui n'étais pas le cas avec ça :
while (getMonnaiesArendre()>0){
if (getMonnaiesArendre()>=5){
tarifChoisis.nbrDePiecesDe5=tarifChoisis.nbrDePiecesDe5-1;
System.out.println("nbr de pieces de 5"+tarifChoisis.nbrDePiecesDe5);
}
else if (getMonnaiesArendre()>=2){
tarifChoisis.nbrDePiecesDe2=tarifChoisis.nbrDePiecesDe2-1;
System.out.println("nbr de pieces de 2"+tarifChoisis.nbrDePiecesDe2);
}
monnaiesArendre=0.0;
piecesChargees.total=0;
}
merci pour ton aide, il me semble que ton idée est plus logique mais ché pas si ça va marcher avec mon programme maintenant ! car ce traitement on va le faire que lorsque le client il appui sur imprimer le billet et le montant inséré est supérieur au prix.
quand j'ai mis ton code ça m'affiche des erreurs , est ce que t'arrive à m'expliquer ce code , que ce qu'il fait concrètement, c koi monnaie et comment il va appeler ces méthode sachant que mon monnaie a rendre change a chaque moment ou le client insère des pièces.
Merci infiniment
Tu as tout le code, il n'y a rien de plus. La seule chose qui manque c'est :
"que ce qu'il fait concrètement"
J'ai mis une méthode main avec un exemple, j'ai même fait un copier-coller du résultat de l'exemple, je ne vois vraiment pas ce qu'il te faut de plus pour comprendre ce que ça fait !
"est ce que t'arrive à m'expliquer ce code"
Si on enlève la partie d'affichage et le main, qui ne servent qu'à tester, tu as 10 lignes de codes.
Tu ne peux pas comprendre par toi même 10 lignes de codes ?
"appeler ces méthode sachant que mon monnaie a rendre change a chaque moment"
Il n'y a qu'une seule méthode à appeler : monnaie. La méthode afficher et le main c'était pour tester. Tu peux appeler la méthode monnaie autant que fois que tu veux, elle indépendante de tout contexte, le résultat est uniquement lié à la valeur de son paramètre.