2011-02-13 4 views
0

Étant donné une quantité en ml et 3 tailles de paquet (20ml, 200ml et 1000ml), je voudrais calculer combien de chaque pack sont nécessaires pour remplir le montant total.Bonne mise en œuvre d'un calculateur de changement en C#

E.g.

Amount =ml 
1000ml = 3 packs 
200ml = 1 pack 
20ml = 1 pack (always round up to nearest quantity) 

C'est à peu près comme une calculatrice de changement, et je suis à la recherche de la bonne façon de le faire.

Voilà ma tentative

public class PackSizeCalculator 
{ 
    private const int LargePackSize = 1000; 
    private const int MediumPackSize = 200; 
    private const int SmallPackSize = 20; 

    public int LargePacks {get; set;} 
    public int MediumPacks {get; set;} 
    public int SmallPacks {get; set;} 

    public PackSizeCalculator(int amount) 
    { 
     int remainder = amount; 

     while(remainder > 0) { 
      if(remainder >= LargePackSize) 
      { 
       LargePacks = remainder/LargePackSize; 
       remainder = remainder % LargePackSize; 
      } 
      else if(remainder >= MediumPackSize) 
      { 
       MediumPacks = remainder/MediumPackSize; 
       remainder = remainder % MediumPackSize; 
      } 
      else if(remainder > SmallPackSize) 
      { 
       if(remainder % SmallPackSize == 0) 
       { 
        SmallPacks = (remainder/SmallPackSize); 
       } 
       else { 
        SmallPacks = (remainder/SmallPackSize) + 1; 
       } 
       remainder = 0; 
      } 
      else { 
       SmallPacks = 1; 
       remainder = 0; 
      } 
     } 
    } 
} 

Est-ce une bonne façon de s'y prendre ou recommanderiez-vous quelque chose de différent?

+0

Veuillez poster le code que vous avez écrit jusqu'ici. –

+1

Il n'y a pas de bonne façon de le faire. Votre "question" ressemble plus à "S'il vous plaît faites-le pour moi". C'est l'externalisation du cerveau ... Vous cherchez un algorithme, pas vraiment un problème de programmation/code technique. C'est peut-être peut-être un signe de paresse boiteuse comme vous devriez au moins présenter vos alternatives pré-réflexion/algo que vous pensiez. –

+0

Très bien, je pensais utiliser des instructions if et utiliser le reste de chaque division, donc je vais poster ça maintenant. Donne moi 5 minutes. – Marko

Répondre

1

Quelque chose comme ceci:

const int LARGE_PACK = 1000; 
const int MEDIUM_PACK = 200; 
const int SMALL_PACK = 20; 

int largePacks = (int)(Amount/LARGE_PACK); 
int mediumPacks = (int)((Amount % LARGE_PACK)/MEDIUM_PACK); 
int smallPacks = (int)ceil(((float)((Amount % LARGE_PACK) % MEDIUM_PACK)/SMALL_PACK)); 
+0

Vous faites une division entière de sorte que vous n'avez pas besoin de convertir en int (à moins que vous ne présumiez que le montant n'est pas un int). En outre, smallPacks n'est pas arrondi selon la question. –

+0

J'aime faire des lancements explicites pour un code plus facile à comprendre. Et vous avez raison sur le deuxième point, je vais le mettre à jour. –

0

Vous pouvez créer une fonction comme ceci:

struct Change 
{ 
    public int Large; 
    public int Medium; 
    public int Small; 
} 
private Change CalculateChange(int TotalAmount) 
{ 
    Change result; 
    result.Large = TotalAmount >= 1000 ? TotalAmount/1000 : 0; 
    result.Medium = TotalAmount % 1000 >= 200 ? (TotalAmount % 1000)/200 : 0; 
    result.Small = (TotalAmount % 1000) % 200 >= 20 ? ((TotalAmount % 1000) % 200)/20 : 0; 
    return result; 
} 

A la fin, vous aurez le résultat du changement de type struct.