Programmation d'un Distributeur de billets (sous NetBeans)

Fermé
Zephyr88 Messages postés 42 Date d'inscription jeudi 19 août 2010 Statut Membre Dernière intervention 26 février 2015 - 26 févr. 2015 à 15:58
yamdjio Messages postés 88 Date d'inscription lundi 18 août 2014 Statut Membre Dernière intervention 21 mai 2015 - 14 mars 2015 à 16:28
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) :

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:

1 réponse

yamdjio Messages postés 88 Date d'inscription lundi 18 août 2014 Statut Membre Dernière intervention 21 mai 2015 5
14 mars 2015 à 16:28
Bonjour
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.
0