Problème dans une Boucle do while [Résolu]

Messages postés
8
Date d'inscription
lundi 26 octobre 2009
Dernière intervention
16 novembre 2010
- 14 nov. 2010 à 20:37 - Dernière réponse :
Messages postés
8
Date d'inscription
lundi 26 octobre 2009
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-
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
835
Date d'inscription
samedi 15 novembre 2008
Dernière intervention
14 janvier 2017
- 14 nov. 2010 à 21:18
3
Merci
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!

Merci cs_Robert33 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de cs_Robert33
Messages postés
8
Date d'inscription
lundi 26 octobre 2009
Dernière intervention
16 novembre 2010
- 14 nov. 2010 à 23:21
0
Merci
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
            }
        }
Commenter la réponse de aZerato
Messages postés
11
Date d'inscription
mardi 28 septembre 2010
Dernière intervention
30 avril 2012
- 16 nov. 2010 à 14:16
0
Merci
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.
Commenter la réponse de captainFoyd
Messages postés
8
Date d'inscription
lundi 26 octobre 2009
Dernière intervention
16 novembre 2010
- 16 nov. 2010 à 17:40
0
Merci
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-
Commenter la réponse de aZerato

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.