aZerato
Messages postés8Date d'inscriptionlundi 26 octobre 2009StatutMembreDernière intervention16 novembre 2010
-
14 nov. 2010 à 20:37
aZerato
Messages postés8Date d'inscriptionlundi 26 octobre 2009StatutMembreDernière intervention16 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 !
aZerato
Messages postés8Date d'inscriptionlundi 26 octobre 2009StatutMembreDernière intervention16 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
}
}
captainFoyd
Messages postés11Date d'inscriptionmardi 28 septembre 2010StatutMembreDernière intervention30 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# :
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.
aZerato
Messages postés8Date d'inscriptionlundi 26 octobre 2009StatutMembreDernière intervention16 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];
}
}