Rendre la monnaie

Fermé
ismail - 17 mai 2014 à 22:07
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 18 mai 2014 à 12:48
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 :
	  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:

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
18 mai 2014 à 05:06
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.

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
1
Bonjour,
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
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
18 mai 2014 à 12:48
"quand j'ai mis ton code ça m'affiche des erreurs"
Tu as tout le code, il n'y a rien de plus. La seule chose qui manque c'est :

public class LeNomDeTaClasse
{
    // Tout le code que je t'ai donné
}

"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.
0
Utilisateur anonyme
17 mai 2014 à 23:16
j'aurais plutot fait un boucle dans ce genre (bon c'est tout moche , flemme de le mettre en forme)

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 ^^
0
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
0
ç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;
}
0
Utilisateur anonyme
18 mai 2014 à 11:19
enfait , tu as ton reste dans une variable , et tu la décrémente des qu'il rend une pièce :

exemple avec 3.20
1er passage dans la boucle : il rend 2 , le reste passe a 1.20
2) il rend 1 , tu passe a 0.20
3) il rend 0.2 , tu passe a 0.0

et fini
0