Problème dans une Boucle do while

Résolu
aZerato Messages postés 8 Date d'inscription lundi 26 octobre 2009 Statut Membre Dernière intervention 16 novembre 2010 - 14 nov. 2010 à 20:37
aZerato Messages postés 8 Date d'inscription lundi 26 octobre 2009 Statut Membre Dernière intervention 16 novembre 2010 - 16 nov. 2010 à 17:40
Bonjour,

je suis actuellement en train de programmer un petit programme pour un projet de cours
et je me suis heurté à un petit problème
Le principe du programme est de retranscrire un petit distributeur de friandises/boissons.
Il faut qu'il soit capable de rendre la monnaie en tenant compte des pièces déjà en stock dans
la caisse du distributeur !
Le problème ce situe dans ma boucle do while (c'est mon avis ! il n'est pas forcément bon )
public int[] F_CalculMonnaie()
        {
            versé = tRendueMonnaie[0]; //tRendueMonnaie[0] est la valeur des pièces qui furent versées en cts
            if (versé - tStock[numfriandiseselectionnee].prix == 0)//tStock est un tableau contenant toutes mes boissons (ex: tStock[0].nom = "Chips"; tStock[0].prix = 110; tStock[0].qte = 10;)
            {
                tRendueMonnaie[7] = 0;//tRendueMonnaie[7] contiendrait la monnaie
            }
            else
            {
                do
                {
                    if (tMonnaie[5] != 0 && (versé - tStock[numfriandiseselectionnee].prix) > 200)//tMonnaie[5] est le nombre de pièces de 2 contenu dans la caisse du distributeur
                    {
                        tRendueMonnaie[6] = tRendueMonnaie[6] + 1;//tRendueMonnaie[6] est le nombre de pièces de 2 qui doit être rendu
                        tRendueMonnaie[7] = tRendueMonnaie[7] + 200;//tRenduMonnaie[7] prend +200cts 
                        tMonnaie[5] = tMonnaie[5] - 1;//On enlève une pièce de 2 contenant dans la caisse
                        versé = versé - 200;//versé est décrémenté de 200
                    }
                    else if (tMonnaie[4] != 0 && (versé - tStock[numfriandiseselectionnee].prix) > 100)
                    {
                        tRendueMonnaie[5] = tRendueMonnaie[5] + 1;
                        tRendueMonnaie[7] = tRendueMonnaie[7] + 100;
                        tMonnaie[4] = tMonnaie[4] - 1;
                        versé = versé - 100;
                    }
                    else if (tMonnaie[3] != 0 && (versé - tStock[numfriandiseselectionnee].prix) > 50)
                    {
                        tRendueMonnaie[4] = tRendueMonnaie[4] + 1;
                        tRendueMonnaie[7] = tRendueMonnaie[7] + 50;
                        tMonnaie[3] = tMonnaie[3] - 1;
                        versé = versé - 50;
                    }
                    else if (tMonnaie[2] != 0 && (versé - tStock[numfriandiseselectionnee].prix) > 20)
                    {
                        tRendueMonnaie[3] = tRendueMonnaie[3] + 1;
                        tRendueMonnaie[7] = tRendueMonnaie[7] + 20;
                        tMonnaie[2] = tMonnaie[2] - 1;
                        versé = versé - 20;
                    }
                    else if (tMonnaie[1] != 0 && (versé - tStock[numfriandiseselectionnee].prix) > 10)
                    {
                        tRendueMonnaie[2] = tRendueMonnaie[2] + 1;
                        tRendueMonnaie[7] = tRendueMonnaie[7] + 10;
                        tMonnaie[1] = tMonnaie[1] - 1;
                        versé = versé - 10;
                    }
                    else if (tMonnaie[0] != 0 && (versé - tStock[numfriandiseselectionnee].prix) > 5)
                    {
                        tRendueMonnaie[1] = tRendueMonnaie[1] + 1;
                        tRendueMonnaie[7] = tRendueMonnaie[7] + 5;
                        tMonnaie[0] = tMonnaie[0] - 1;
                        versé = versé - 5;
                    }
                    else
                    {
                        tRendueMonnaie[7] = 999;//999 devient une valeur témoin comme nous sommes dans le cas d'une fonction qui doit retourner un entier
                    }

                }
                while (versé 0 || tRendueMonnaie[7] 999);//si avec ce que l'on a versé et la monnaie rendue nous arrivons à 0 ou bien que si il n'y avait pas assez de monnaie monnaie prend 999 pour valeur on sort de la boucle
            }
            return tRendueMonnaie;// on retourne la valeur de monnaie
        }

Quand je cherche à afficher mon prix et les pièces des différentes valeurs je tombe sur un mauvais résultat, du moins on a l'impression que m'a condition de mon while est sautée

Par exemple :
je sélectionne ma friandise ayant pour caractéristique :
tStock[0].nom = "Chips";
tStock[0].prix = 110;
tStock[0].qte = 10;

Soit un paquet de chips à 1,10€
si j'introduis 2€
la monnaie aura pour montant 90 cts
sachant qu'il faut que je rende la monnaie en rendant les pièces ayant la plus haute valeur,
la machine devrait rendre : 1 pièce de 50 cts et 2 pièces de 20 cts
Malheureusement, lors de l'affichage des valeurs du tableau
MessageBox.Show("Vous avez bien payé votre friandise " + tStock[numfriandiseselectionnee].nom + " ! On vous rend : " + rendu + "\n soit en cts : " + tRendueMonnaie[7] + " avec : \n - " + tRendueMonnaie[6] + " pièce(s) de 2 € \n - " + tRendueMonnaie[5] + " pièce(s) de 1 € \n -  " + tRendueMonnaie[4] + " pièce(s) de 0,50 € \n - " + tRendueMonnaie[3] + " pièce(s) de 0,20 € \n - "
                    + tRendueMonnaie[2] + " pièce(s) de 0,10 € \n - " + tRendueMonnaie[1] + " pièce(s) de 0,05 €.");//on affiche un récapitulatif avec la monnaie (rendu sert de vérif) ainsi que le nombre de pièces de chaque valeur qui doit être rendu 

j'obtiens à l'affichage :
"Vous avez bien payé votre friandise Chips ! On vous rend : 0,9
soit en cts : 50 avec
- 0 pièce(s) de 2 €
- 0 pièce(s) de 1 €
- 1 pièce(s) de 0,50 €
- 0 pièce(s) de 0,20 €
- 0 pièce(s) de 0,10 €
- 0 pièce(s) de 0,05 €"

Donc j'ai l'impression qu'il sort de la boucle bien qu'il n'est pas pris en compte les conditions
Je vous remercie par avance de l'intention que vous porterez à mon problème, en espérant avoir été assez explicite

P.S. : Vous m'excuserez par avance malgré relecture il n'est pas impossible que j'ai fait des erreurs n'étant pas expert en la langue française
P.S. : J'ai posté mon message dans ce thème mais à la vue des autres proposés je ne savais pas lequel correspondait le mieux à mon soucis !

-aZe-

4 réponses

cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
14 nov. 2010 à 21:18
Bonsoir

je pense que tu as simplement inversé ta condition de sortie
je while indique un tant-que, pas un Jusqu'à.

essaie
 while (versé != 0 && tRendueMonnaie[7] != 999);


Bon code
Bob

C# is amazing, enjoy it!
3
aZerato Messages postés 8 Date d'inscription lundi 26 octobre 2009 Statut Membre Dernière intervention 16 novembre 2010
14 nov. 2010 à 23:21
Hum d'accord !
il est vrai que je prenais le do/while comme un répéter/jusqu'à alors déjà merci infiniment !

Seulement maintenant j'ai un nouveau problème qui semble venir de mes if/else
car maintenant mon MessageBox affiche :
"Vous avez bien payé votre friandise Chips ! On vous rend : 0,9
soit en cts : 999 avec
- 0 pièce(s) de 2 €
- 0 pièce(s) de 1 €
- 1 pièce(s) de 0,50 €
- 1 pièce(s) de 0,20 €
- 1 pièce(s) de 0,10 €
- 1 pièce(s) de 0,05 €"

au lieu d'une pièce de 50 et deux de 20, ainsi que tRendueMonnaie[7] qui est égale 999
Sur ce il est tard je remercie l'attention qui a été porté à mon problème
Je vais essayer demain avec un Switch et CASE ! Mais je ne comprend pas pourquoi avoir rentré dans une des conditions
d'un if il ne remonte pas pour repasser toutes les conditions ! J'ai tenté avec un break à la fin de chaque if mais sans
succès ...
else if (tMonnaie[0] != 0 && (versé - tStock[numfriandiseselectionnee].prix) > 5)
                    {
                        tRendueMonnaie[1] = tRendueMonnaie[1] + 1;
                        tRendueMonnaie[7] = tRendueMonnaie[7] + 5;
                        tMonnaie[0] = tMonnaie[0] - 1;
                        versé = versé - 5;
                        break;
                    }
                    else
                    {
                        tRendueMonnaie[7] = 999;//999 devient une valeur témoin comme nous sommes dans le cas d'une fonction qui doit retourner un entier
                        break;
                    }

mais là je tombe sur le même résultat que précédemment

Voici ce qui se passe lors de clique sur mon bouton Acheter

 private void bnacheter_Click(object sender, EventArgs e)
        {

            F_CalculMonnaie();//on éxécute la fonction !
            //Je suis obliger de mettre mon MessageBox ici pour tester sinon il me dit directement que il n'y a pas assez de monnaie            
            if (tRendueMonnaie[7] != 999 && F_EnStock() == true)//999 étant la valeur témoin, qui montre qu'il n'y a pas assez de pièce pour rendre la monnaie
            {
                if (numfriandiseselectionnee == 0)
                {
                    tStock[0].qte = tStock[0].qte - 1;//comme nous achetons une friandise nous devons en enlever une du stock
                    lblqtechips.Text = Convert.ToString(tStock[0].qte);
                }
                else if (numfriandiseselectionnee == 1)
                    {
                        tStock[1].qte = tStock[1].qte - 1;
                        lblqtechips.Text = Convert.ToString(tStock[1].qte);
                    }
                    else if (numfriandiseselectionnee == 2)
                    {
                        tStock[2].qte = tStock[2].qte - 1;
                        lblqtechips.Text = Convert.ToString(tStock[2].qte);
                    }
                        else if (numfriandiseselectionnee == 3)
                        {
                            tStock[3].qte = tStock[3].qte - 1;
                            lblqtechips.Text = Convert.ToString(tStock[3].qte);
                        }
                        else if (numfriandiseselectionnee == 4)
                        {
                            tStock[4].qte = tStock[4].qte - 1;
                            lblqtechips.Text = Convert.ToString(tStock[4].qte);
                        }
                            else if (numfriandiseselectionnee == 5)
                            {
                                tStock[5].qte = tStock[5].qte - 1;
                                lblqtechips.Text = Convert.ToString(tStock[5].qte);
                            }
                            else if (numfriandiseselectionnee == 6)
                                {
                                    tStock[6].qte = tStock[6].qte - 1;
                                    lblqtechips.Text = Convert.ToString(tStock[6].qte);
                                }
                                else if (numfriandiseselectionnee == 7)
                                    {
                                        tStock[7].qte = tStock[7].qte - 1;
                                        lblqtechips.Text = Convert.ToString(tStock[7].qte);
                                    }
                                        else if (numfriandiseselectionnee == 8)
                                        {
                                            tStock[8].qte = tStock[8].qte - 1;
                                            lblqtechips.Text = Convert.ToString(tStock[8].qte);
                                        }
                                            else
                                            if (numfriandiseselectionnee == 9)
                                            {
                                                tStock[9].qte = tStock[9].qte - 1;
                                                lblqtechips.Text = Convert.ToString(tStock[9].qte);
                                            }

                MessageBox.Show("Vous avez bien payé votre friandise " + tStock[numfriandiseselectionnee].nom + " ! On vous rend : " + rendu + "\n soit en cts : " + tRendueMonnaie[7] + " avec : \n - " + tRendueMonnaie[6] + " pièce(s) de 2 € \n - " + tRendueMonnaie[5] + " pièce(s) de 1 € \n -  " + tRendueMonnaie[4] + " pièce(s) de 0,50 € \n - " + tRendueMonnaie[3] + " pièce(s) de 0,20 € \n - "
                    + tRendueMonnaie[2] + " pièce(s) de 0,10 € \n - " + tRendueMonnaie[1] + " pièce(s) de 0,05 €.");//on affiche un récapitulatif avec la monnaie (rendu sert de vérif) ainsi que le nombre de pièces de chaque valeur qui doit être rendu 
                
            }
            else
            {
                if (F_EnStock() == false)
                {
                    MessageBox.Show("Veuillez nous excuser mais la machine ne possède pas la friandise voulu, on vous rend ce que vous avez mis !");
                }
                else
                {
                    MessageBox.Show("Veuillez nous excuser mais la machine ne possède pas assez de monnaie, on vous rend ce que vous avez mis !");
                }

                //si il n'y a plus de friandise en stock il faut rendre la monnaie et donc ne pas compter les pièces qui furent versées
                tMonnaie[0] = tMonnaie[0] + tVerséeMonnaie[1];
                tMonnaie[1] = tMonnaie[1] + tVerséeMonnaie[2];
                tMonnaie[2] = tMonnaie[2] + tVerséeMonnaie[3];
                tMonnaie[3] = tMonnaie[3] + tVerséeMonnaie[4];
                tMonnaie[4] = tMonnaie[4] + tVerséeMonnaie[5];
                tMonnaie[5] = tMonnaie[5] + tVerséeMonnaie[6];
            }
}


Ma fonction F_EnStock() toute simple qui est appelée au dessus !
public bool F_EnStock()
        {
            if (tStock[numfriandiseselectionnee].qte == 0)
            {
                return false;//Il n'y en a plus en stock
            }
            else
            {
                return true;//Il y en a en stock
            }
        }
0
captainFoyd Messages postés 11 Date d'inscription mardi 28 septembre 2010 Statut Membre Dernière intervention 30 avril 2012
16 nov. 2010 à 14:16
Je pense que tu as du mal à comprendre ce qui se passe car ton code est compliqué à cause des suites de if/else que tu utilises. En plus, les paramètres d'entrée et de sortie de ton programme ne sont pas clairement identifiés. Le fait d'utiliser 1 seul tableau oblige à lire les commentaires à chaque ligne (et heureusement qu'il y en a).

Voici quelques conseils pour avoir un code plus lisible:

1) Le code contenu dans chaque if est le même. La seule différence est l'indice du tableau qui correspond au numéro de la friandise.
=> Gérer le stock en fonction du numéro de la friandise

2) Séparer les données d'entrées et de sorties => Création d'une variable en entrée pour la somme versée et un tableau en sortie pour la monnaie rendue. La somme rendue peut être calculée à la fin à partir de la monnaie rendue.

3) Créer un enum qui contient les types de pièces:
Code C# :
        enum Monnaie
        {
            PiècesDe5 = 0,
            PiècesDe10 = 1,
            PiècesDe20 = 2,
            PiècesDe50 = 3,
            PiècesDe100 = 4,
            PiècesDe200 = 5,
        }

Instancier le tableau RenduMonnaie avec int[] RendueMonnaie = new int[Enum.GetValues(typeof(Monnaie)).Length];
L'accès au pièces rendues => RendueMonnaie[(int)Monnaie.PiècesDe5] par exemple.
Le tableau contenant les pièces du monnayeur peut être géré de la même manière.

4) Faire un tableau de correspondance entre le type de pièce et sa valeur

5) Pour le calcul de la monnaie à rendre => Faire une boucle en utilisant les indices du tableau comme variable au lieu de tester tous les cas.
0
aZerato Messages postés 8 Date d'inscription lundi 26 octobre 2009 Statut Membre Dernière intervention 16 novembre 2010
16 nov. 2010 à 17:40
Il est vrai que je n'ai pas pensé au plus simple j'ai l'esprit un peu torturé ! n'ayant également pas beaucoup de base en C# c'était la première fois où j'usais de tableau/structure !

Mais après beaucoup de temps passé j'ai résolu mon problème et ma machine marche (enfin!!) Merci de l'intention que vous avez pu porter !

J'ai modifié ma fonction F_CalculMonnaie
        public int[] F_CalculMonnaie()
        {

            versé = tRendueMonnaie[0];//versé correspond au cumul de la valeur des pièces

            if (versé - tStock[numfriandiseselectionnee].prix == 0)
            {
                tRendueMonnaie[7] = 0;
            }
            else
            {
                do
                {
                    if (tMonnaie[5] >= 1 && (versé - tStock[numfriandiseselectionnee].prix) >= 200)
                    {
                        tRendueMonnaie[6] = tRendueMonnaie[6] + 1;
                        tRendueMonnaie[7] = tRendueMonnaie[7] + 200;
                        tMonnaie[5] = tMonnaie[5] - 1;
                        versé = versé - 200;

                    }
                    else
                    {
                        if (tMonnaie[4] >= 1 && (versé - tStock[numfriandiseselectionnee].prix) >= 100)
                        {
                            tRendueMonnaie[5] = tRendueMonnaie[5] + 1;
                            tRendueMonnaie[7] = tRendueMonnaie[7] + 100;
                            tMonnaie[4] = tMonnaie[4] - 1;
                            versé = versé - 100;
                        }
                        else
                        {
                            if (tMonnaie[3] >= 1 && (versé - tStock[numfriandiseselectionnee].prix) >= 50)
                            {
                                tRendueMonnaie[4] = tRendueMonnaie[4] + 1;
                                tRendueMonnaie[7] = tRendueMonnaie[7] + 50;
                                tMonnaie[3] = tMonnaie[3] - 1;
                                versé = versé - 50;
                            }
                            else
                            {
                                if (tMonnaie[2] >= 1 && (versé - tStock[numfriandiseselectionnee].prix) >= 20)
                                {
                                    tRendueMonnaie[3] = tRendueMonnaie[3] + 1;
                                    tRendueMonnaie[7] = tRendueMonnaie[7] + 20;
                                    tMonnaie[2] = tMonnaie[2] - 1;
                                    versé = versé - 20;
                                }
                                else
                                {
                                    if (tMonnaie[1] >= 1 && (versé - tStock[numfriandiseselectionnee].prix) >= 10)
                                    {
                                        tRendueMonnaie[2] = tRendueMonnaie[2] + 1;
                                        tRendueMonnaie[7] = tRendueMonnaie[7] + 10;
                                        tMonnaie[1] = tMonnaie[1] - 1;
                                        versé = versé - 10;
                                    }
                                    else
                                    {
                                        if (tMonnaie[0] >= 1 && (versé - tStock[numfriandiseselectionnee].prix) >= 5)
                                        {
                                            tRendueMonnaie[1] = tRendueMonnaie[1] + 1;
                                            tRendueMonnaie[7] = tRendueMonnaie[7] + 5;
                                            tMonnaie[0] = tMonnaie[0] - 1;
                                            versé = versé - 5;
                                        }
                                        else
                                        {
                                            tRendueMonnaie[7] = 999;//999 devient une valeur témoin comme nous sommes dans le cas d'une fonction qui doit retourner un entier
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                while (tRendueMonnaie[7] != 999);

                return tRendueMonnaie;// on retourne le tableau
            }
        }

Et ensuite j'ai modifié mon controle lorsque que je clique sur le bouton "Acheter"
private void bnacheter_Click(object sender, EventArgs e)
        {

            F_CalculMonnaie();//on éxécute la fonction !
            
            if (versé tStock[numfriandiseselectionnee].prix && F_EnStock() true)//vu que versé est décrémentée on arrive au prix de la friandise et bien sur on vérifie si la friandise est en stock 
            {
                if (numfriandiseselectionnee == 0)
                {
                    tStock[0].qte = tStock[0].qte - 1;//comme nous achetons une friandise nous devons en enlever une du stock
                    lblqtechips.Text = Convert.ToString(tStock[0].qte);
                }
                else if (numfriandiseselectionnee == 1)
                    {
                        tStock[1].qte = tStock[1].qte - 1;
                        lblqtechips.Text = Convert.ToString(tStock[1].qte);
                    }
                    else if (numfriandiseselectionnee == 2)
                    {
                        tStock[2].qte = tStock[2].qte - 1;
                        lblqtechips.Text = Convert.ToString(tStock[2].qte);
                    }
                        else if (numfriandiseselectionnee == 3)
                        {
                            tStock[3].qte = tStock[3].qte - 1;
                            lblqtechips.Text = Convert.ToString(tStock[3].qte);
                        }
                        else if (numfriandiseselectionnee == 4)
                        {
                            tStock[4].qte = tStock[4].qte - 1;
                            lblqtechips.Text = Convert.ToString(tStock[4].qte);
                        }
                            else if (numfriandiseselectionnee == 5)
                            {
                                tStock[5].qte = tStock[5].qte - 1;
                                lblqtechips.Text = Convert.ToString(tStock[5].qte);
                            }
                            else if (numfriandiseselectionnee == 6)
                                {
                                    tStock[6].qte = tStock[6].qte - 1;
                                    lblqtechips.Text = Convert.ToString(tStock[6].qte);
                                }
                                else if (numfriandiseselectionnee == 7)
                                    {
                                        tStock[7].qte = tStock[7].qte - 1;
                                        lblqtechips.Text = Convert.ToString(tStock[7].qte);
                                    }
                                        else if (numfriandiseselectionnee == 8)
                                        {
                                            tStock[8].qte = tStock[8].qte - 1;
                                            lblqtechips.Text = Convert.ToString(tStock[8].qte);
                                        }
                                            else
                                            if (numfriandiseselectionnee == 9)
                                            {
                                                tStock[9].qte = tStock[9].qte - 1;
                                                lblqtechips.Text = Convert.ToString(tStock[9].qte);
                                            }

                MessageBox.Show("Vous avez bien payé votre friandise " + tStock[numfriandiseselectionnee].nom + " ! On vous rend : " + rendu + " avec : \n - " + tRendueMonnaie[6] + " pièce(s) de 2 € \n - " + tRendueMonnaie[5] + " pièce(s) de 1 € \n -  " + tRendueMonnaie[4] + " pièce(s) de 0,50 € \n - " + tRendueMonnaie[3] + " pièce(s) de 0,20 € \n - "
                    + tRendueMonnaie[2] + " pièce(s) de 0,10 € \n - " + tRendueMonnaie[1] + " pièce(s) de 0,05 €.");//on affiche un récapitulatif avec la monnaie (rendu sert de vérif) ainsi que le nombre de pièces de chaque valeur qui doit être rendu 
                
            }
            else
            {
                if (F_EnStock() == false)
                {
                    MessageBox.Show("Veuillez nous excuser mais la machine ne possède pas la friandise voulu, on vous rend ce que vous avez mis !");
                }
                else
                {
                    MessageBox.Show("Veuillez nous excuser mais la machine ne possède pas assez de monnaie, on vous rend ce que vous avez mis !");
                }

                //si il n'y a plus de friandise en stock il faut rendre la monnaie et donc ne pas compter les pièces qui furent versées
                tMonnaie[0] = tMonnaie[0] - tVerséeMonnaie[0];
                tMonnaie[1] = tMonnaie[1] - tVerséeMonnaie[1];
                tMonnaie[2] = tMonnaie[2] - tVerséeMonnaie[2];
                tMonnaie[3] = tMonnaie[3] - tVerséeMonnaie[3];
                tMonnaie[4] = tMonnaie[4] - tVerséeMonnaie[4];
                tMonnaie[5] = tMonnaie[5] - tVerséeMonnaie[5];
            }
}

Merci
-aZe-
0
Rejoignez-nous