2010-04-12 8 views
3

J'essaie de faire en sorte que ce programme décompose un montant défini par l'utilisateur en un minimum de factures. Je ne pense pas que mes boucles for sont en cours d'exécution parce que si je mets une ligne d'écriture en eux, il ne s'affiche pas quand je l'exécute.Décomposition de la monnaie en C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication13 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      Console.Write("Enter the amount of money: $"); 
      int totalAmount = Convert.ToInt32(Console.ReadLine()); 
      calculateNumberOfBills(totalAmount); 
     } 

     static void calculateNumberOfBills(int totalAmount) 
     { 

      int[] denominations = { 20, 10, 5, 1 }; 
      int[] numberOfBills = new int[4]; 
      for (numberOfBills[0] = 0; totalAmount < 20; numberOfBills[0]++) 
      { 
       totalAmount = totalAmount - 20; 
      } 
      for (numberOfBills[1] = 0; totalAmount < 10; numberOfBills[1]++) 
      { 
       totalAmount = totalAmount - 10; 
      } 
      for (numberOfBills[2] = 0; totalAmount < 5; numberOfBills[2]++) 
      { 
       totalAmount = totalAmount - 5; 
      } 
      for (numberOfBills[3] = 0; totalAmount <= 0; numberOfBills[3]++) 
      { 
       totalAmount = totalAmount - 1; 
      } 
      Console.WriteLine("Number of twenties" + numberOfBills[0]); 
      Console.WriteLine("Number of tens" + numberOfBills[1]); 
      Console.WriteLine("Number of fives" + numberOfBills[2]); 
      Console.WriteLine("Number of ones" + numberOfBills[3]); 
     } 
    } 
} 
+0

Quelle est la totalAmount que vous utilisez pour vos tests? –

Répondre

2

Jetez un oeil à ceci:

for (numberOfBills[0] = 0; totalAmount >= 20; numberOfBills[0]++) 
    { 
     totalAmount = totalAmount - 20; 
    } 
    for (numberOfBills[1] = 0; totalAmount >= 10; numberOfBills[1]++) 
    { 
     totalAmount = totalAmount - 10; 
    } 
    for (numberOfBills[2] = 0; totalAmount >= 5; numberOfBills[2]++) 
    { 
     totalAmount = totalAmount - 5; 
    } 
    for (numberOfBills[3] = 0; totalAmount > 0; numberOfBills[3]++) 
    { 
     totalAmount = totalAmount - 1; 
    } 
+0

ok cela a fonctionné, mais j'ai dû changer la dernière boucle à totalAmount >= 1; merci. pouvez-vous me dire pourquoi cela n'a pas fonctionné dans l'autre sens? – Covertpyro

+0

wow, en y réfléchissant maintenant, il semble évident, devinez que c'est ce que je reçois pour la programmation quand je suis fatigué. – Covertpyro

0

dans votre "pour" boucles que vous avez la condition inverse => totalAmount < 20 signifie qu'il exécute la boucle en totalAmount est moins de 20 - que est le contraire de ce que vous voulez.

Modifier à

for(...;totalAmount > 20; ...) 
2

Ceci est une question de devoirs, non?

 for (numberOfBills[0] = 0; totalAmount < 20; numberOfBills[0]++) 

rendent

 for (numberOfBills[0] = 0; totalAmount >= 20; numberOfBills[0]++) 

et essayez à nouveau :) La pièce centrale est la condition où la boucle doit fonctionner.

1

Désolé, à ce stade, ce n'est pas une "vraie question" et devrait très probablement être étiqueté comme devoir. Vos comparaisons «plus petit que» doivent être remplacées par des comparaisons «supérieures à» et vous êtes prêt à utiliser votre solution. Qu'est-ce qui se passe maintenant est un débordement d'entier, provoquant finalement votre première boucle for, qui était en boucle infiniment jusqu'à ce moment pour casser.

Il existe des moyens plus simples pour résoudre votre problème, essayez-le avec une seule boucle et l'opérateur modulo).

+0

+1 Pour l'opérateur modulo. Il n'est pas utilisé aussi souvent qu'il le devrait. :-) – Patrick

0

Essayez ceci, un peu moins de code

int amt = 73; 

    Dictionary<int, int> dic = new Dictionary<int, int>() {{20,0},{10,0},{5,0},{1,0}}; 
    int[] keys =new int[dic.Count]; 
    dic.Keys.CopyTo(keys, 0); 

    foreach (int i in keys) 
    {    
     if (amt >= i) 
     { 
      dic[i] = amt/i; 
      amt = amt % i; 
     } 
    } 
Questions connexes