Programmation d'un Distributeur de billets (sous NetBeans)
Zephyr88
Messages postés
45
Statut
Membre
-
yamdjio Messages postés 91 Statut Membre -
yamdjio Messages postés 91 Statut Membre -
Bonjour,
Je sais que ce sujet a déjà été abordé par plusieurs, mais mes recherches ne m'ont pas apportées de réponses.
Ce programme est un entraînement pour moi car je débute en Java (sous NetBeans). C'était à la base un TP dans le cadre de mes études mais j'ai voulu le reprendre chez moi pour l'optimiser à ma sauce. Bref, une fois tout cela dit, je vous présente mon souci :
Premièrement, voici comment se présente mon programme :
3 classes :
- classe TP3 (classe main)
- classe Clavier (entièrement écrite par un prof, donc je ne la gère pas, je l'utilise c'est tout)
- classe DAB (qui gère le distributeur)
Dans cette dernière classe (DAB), on y retrouve les fonctions suivantes :
distribue(int valeur) // distribue la somme souhaitée à l'utilisateur (somme entrée au clavier) et renvoie un booléen pour savoir si la distribution a pu avoir lieu
remplissage(int n10, int n20, int n50) // remplit le DAB avec le nombre de billets passés en paramètre (aucun problème ici)
vide() // renvoie un booléen pour savoir si le DAB est vide ou non (true ou false) (il est vide lorsqu'il ne reste plus aucun billet)
/!\ Je précise que pour ce programme, le constructeur du DAB est toujours initialisé avec 24 billets de 10€, 10 billets de 20€ et 5 billets de 50€ pour un total de 690€ (pour que l'on s'y retrouve tous)/!\
Voilà donc mon problème, dans la fonction distribue(int valeur) : je n'arrive pas à régler le problème des nombres de billets négatifs (quand il me dit qu'il reste -7 billets de 50€ par exemple ...)
Après plusieurs heures de test différents, j'en suis arrivés à ce code (qui ne fonctionne toujours pas) :
Tant que je retire des montants que je peux distribuer avec des billets de 50, tout va bien, si non, il commence à entrer dans des nombres négatifs ... ce qui devrait ne pas avoir lieu à cause des cast int que je fais (?!).
Merci pour votre aide, et désolé du roman !
Je sais que ce sujet a déjà été abordé par plusieurs, mais mes recherches ne m'ont pas apportées de réponses.
Ce programme est un entraînement pour moi car je débute en Java (sous NetBeans). C'était à la base un TP dans le cadre de mes études mais j'ai voulu le reprendre chez moi pour l'optimiser à ma sauce. Bref, une fois tout cela dit, je vous présente mon souci :
Premièrement, voici comment se présente mon programme :
3 classes :
- classe TP3 (classe main)
- classe Clavier (entièrement écrite par un prof, donc je ne la gère pas, je l'utilise c'est tout)
- classe DAB (qui gère le distributeur)
Dans cette dernière classe (DAB), on y retrouve les fonctions suivantes :
distribue(int valeur) // distribue la somme souhaitée à l'utilisateur (somme entrée au clavier) et renvoie un booléen pour savoir si la distribution a pu avoir lieu
remplissage(int n10, int n20, int n50) // remplit le DAB avec le nombre de billets passés en paramètre (aucun problème ici)
vide() // renvoie un booléen pour savoir si le DAB est vide ou non (true ou false) (il est vide lorsqu'il ne reste plus aucun billet)
/!\ Je précise que pour ce programme, le constructeur du DAB est toujours initialisé avec 24 billets de 10€, 10 billets de 20€ et 5 billets de 50€ pour un total de 690€ (pour que l'on s'y retrouve tous)/!\
Voilà donc mon problème, dans la fonction distribue(int valeur) : je n'arrive pas à régler le problème des nombres de billets négatifs (quand il me dit qu'il reste -7 billets de 50€ par exemple ...)
Après plusieurs heures de test différents, j'en suis arrivés à ce code (qui ne fonctionne toujours pas) :
public boolean distribue(int valeur){
boolean distrib = false;
int reste = 0;
String rep;
if (valeur < 10){
System.out.println("Veuillez entrer un montant supérieur ou égal à 10€.");
distrib = true; // pour éviter le remplissage dans la classe main
} else{
if (sommeTotale < valeur){
System.out.println("Impossble de traiter la demande, il ne reste que "+sommeTotale+"€.");
System.out.println("Souhaitez-vous quand même retirer les "+sommeTotale+"€ restants ?");
rep = Clavier.lireString();
if (rep.equalsIgnoreCase("oui")){
System.out.println("Distribution de "+sommeTotale+"€");
nbBillets50 -= (int)(sommeTotale/50);
reste = sommeTotale % 50;
nbBillets20 -= (int)(reste/20);
reste = reste % 20;
nbBillets10 -= (int)(reste/10);
sommeTotale = 0;
distrib = true;
}
}
else{
//tester si en enlevant les billets qu'il faut, il y en aura toujours > 0
if(nbBillets50 - (int)(valeur/50) >= 0){
nbBillets50 -= (int)(valeur/50);
reste = valeur % 50;
sommeTotale -= (int)(valeur/50) * 50; // j'enlève la somme retirée avec les billets de 50
} else{
if(nbBillets20 - (int)(valeur/20) >= 0){
nbBillets20 -= (int)(reste/20);
reste = reste % 20;
sommeTotale -= (int)(valeur/20) * 20; // j'enlève la somme retirée avec les billets de 20
} else{
if(nbBillets10 - (int)(valeur/10) >= 0){
nbBillets10 -= (int)(reste/10);
sommeTotale -= (int)(valeur/10) * 10; // j'enlève la somme retirée avec les billets de 10
}
}
}
//sommeTotale -= valeur;
System.out.println("Le DAB dispose de "+sommeTotale+"€ au total.");
distrib = true;
}
}
return distrib;
}
Tant que je retire des montants que je peux distribuer avec des billets de 50, tout va bien, si non, il commence à entrer dans des nombres négatifs ... ce qui devrait ne pas avoir lieu à cause des cast int que je fais (?!).
Merci pour votre aide, et désolé du roman !
A voir également:
- Programmation d'un Distributeur de billets (sous NetBeans)
- Application de programmation - Guide
- Comment mettre en veille un programme sous windows 10 - Guide
- Telecharger netbeans 8.2 - Télécharger - Édition & Programmation
- Programmer un sms - Guide
- Programmer un mail gmail - Guide
1 réponse
Bonjour
j'ai parcouru ton code et j'ai quelques petites incompréhension:
dans cette partie ci
pourquoi ne pas initialiser tous les compteurs de billets a zéro étant donné que l'utilisateur prend tout l'argent du distributeur???
jette un peu un coup dans la partie suivante:
a (2) par exemple tu utilise encore la variable valeur pourtant elle contient toute la somme a enlever au distributeur,mais la ce n'est pas le plus grave. cet a erreur que tu rend la somme totale negative et que tu obtient les nombres negatif, car tu devrais plutot utiliser la variable reste.
De plus ce n'est pas le reste=valeur%50, car le nombre de piece est limitée. (si on veut enlever 350 alors, en faisant reste=350%50=0, ce qui pose probleme) reste= valeur-(int)(valeur/50) * 50.
De plus encore tu fais la mauvais comparaison pour les diminuer les pieces c'est plutot quelque chose du genre nb_50*50<=valeur, alors on donne toutes les pieces de 50, sinon on donne (valeur/50) pieces de 50.
essaye un peu de faire ces remplacements pour voir ce que tu obtient.
j'ai parcouru ton code et j'ai quelques petites incompréhension:
dans cette partie ci
if (rep.equalsIgnoreCase("oui")){
System.out.println("Distribution de "+sommeTotale+"€");
nbBillets50 -= (int)(sommeTotale/50);
reste = sommeTotale % 50;
nbBillets20 -= (int)(reste/20);
reste = reste % 20;
nbBillets10 -= (int)(reste/10);
sommeTotale = 0;
distrib = true;
}
pourquoi ne pas initialiser tous les compteurs de billets a zéro étant donné que l'utilisateur prend tout l'argent du distributeur???
jette un peu un coup dans la partie suivante:
else{
//tester si en enlevant les billets qu'il faut, il y en aura toujours > 0
if(nbBillets50 - (int)(valeur/50) >= 0){
nbBillets50 -= (int)(valeur/50);
reste = valeur % 50;
sommeTotale -= (int)(valeur/50) * 50; // j'enlève la somme retirée avec les billets de 50
} else{
<gras> (2)</gras> if(nbBillets20 - (int)(valeur/20) >= 0){
nbBillets20 -= (int)(reste/20);
reste = reste % 20;
<gras> (erreur)</gras>sommeTotale -= (int)(valeur/20) * 20;
} else{
<gras> (3)</gras> if(nbBillets10 - (int)(valeur/10) >= 0){
nbBillets10 -= (int)(reste/10);
<gras> (erreur)</gras> sommeTotale -= (int)(valeur/10) * 10; // j'enlève la somme retirée avec les billets de 10
}
}
}
a (2) par exemple tu utilise encore la variable valeur pourtant elle contient toute la somme a enlever au distributeur,mais la ce n'est pas le plus grave. cet a erreur que tu rend la somme totale negative et que tu obtient les nombres negatif, car tu devrais plutot utiliser la variable reste.
De plus ce n'est pas le reste=valeur%50, car le nombre de piece est limitée. (si on veut enlever 350 alors, en faisant reste=350%50=0, ce qui pose probleme) reste= valeur-(int)(valeur/50) * 50.
De plus encore tu fais la mauvais comparaison pour les diminuer les pieces c'est plutot quelque chose du genre nb_50*50<=valeur, alors on donne toutes les pieces de 50, sinon on donne (valeur/50) pieces de 50.
essaye un peu de faire ces remplacements pour voir ce que tu obtient.