2017-03-03 20 views
-3

私は「キャッシュアップ」プログラムを作り、金銭の合計を最高から最低まで別々の値(ノートとコイン)に分類する方法を見つけようとしています。私は本当にこれを有効な方法でどうやってやるのかと考えるのは苦労しています。私が考えたもの はこのようなものだった:お金を別々のメモに振り分ける方法は?

while (sum>=0){ 
    if(sum <0 R200&& sum % 200 !>0){ //R200 is the amount of 200 rand notes in the register 
    sum = sum - 200.00; 
    }//endif 
}//endwhile 

が、私はこれをしようとすると、私は無限ループで枯れを終わるか、それは実際にはないマイナス

+2

あなたは、これは[:C#のタグ]であることを確認していますか? '<0' and '!>'は私が認識できるコードのようには見えません。 –

+0

私は入力の最小の例と期待される出力を提供しなければならないと思います。今のように、プログラムが何をしなければならないかははっきりしていません。 – Tigran

+0

2番目の答えは基本的に何をしたいのかをまとめています –

答えて

1

は、あなたが使用する必要はありません量ループを使うと、単純にお金を分けて、残りの演算子を使って総額から引き算することができます。

コンパイル可能例:$ 255.50を入力するための

public class Program 
{ 
    static void Main(string[] args) 
    { 
     decimal money = 255.50M; 

     int hundredDollarBills = subtract(ref money, 100); 
     int fiftyDollarBills = subtract(ref money, 50); 
     int twentyDollarBills = subtract(ref money, 20); 
     int tenDollarBills = subtract(ref money, 10); 
     int singleDillarBills = subtract(ref money, 1); 
     int fiftyCentCoins = subtract(ref money, 0.50M); 
     int twentyCentCoins = subtract(ref money, 0.20M); 
     int tenCentCoins = subtract(ref money, 0.10M); 
     int fiveCentCoins = subtract(ref money, 0.05M); 
     int twoCentCoins = subtract(ref money, 0.02M); 
     int oneCentCoins = subtract(ref money, 0.01M); 
     Console.WriteLine("Total amount of change: " + hundredDollarBills + " $100,\n" + fiftyDollarBills + " $50,\n" + twentyDollarBills + " $20,\n" + tenDollarBills + " $10,\n" + singleDillarBills + " $1,\n" + fiftyCentCoins + " $0.50,\n" + twentyCentCoins + " $0.20,\n" + tenCentCoins + " $0.10,\n" + fiveCentCoins + " $0.05,\n" + twoCentCoins + " $0.02,\n" + oneCentCoins + " $0.01"); 
     Console.WriteLine("Total money left over: " + money); 
    } 

    private static int subtract(ref decimal money, decimal amount) 
    { 
     int amtOfChange = (int) Math.Floor(money/amount); 
     money %= amount; 
     return amtOfChange; 
    } 
} 

、このコードプリントこの結果:変化

総額:2 $ 100

1 $ 50

0 $ 20、

0 $ 10、

5 $ 1、

1 $ 0.50

0 $ 0.20

0 $ 0.10

0 $ 0.05

0 $ 0.02

0 $ 0.01

編集:ob大いにこのコードを改善することができます、それは計算を行う方法の例として役立ちます!

enum CashType { c1, c5, c10, c25, c50, d1, d2, d5, d10, d20, d50, d100 } 

あなたはこのような何か行うことができます:あなたはこのような列挙型を持っていると仮定

+0

'DRY'について学ぶ必要があります。繰り返さないでください。この '(int)Math.Floor(money/xxxx);'を実行し、argとして 'xxxx'を取る別個のメソッドに共通のステップを入れてください。 –

+0

私は「DRY」について知っていますが、私はここにそれを適用するのに十分な時間がありませんでした。私が編集で言ったように、これは単にOPが望む計算をどのように行うのかの例として役立つだけです。私はちょっと私の投稿を編集します。 – nbokmans

+0

私の記事をより適切な方法で更新しました。 – nbokmans

0

var denominationsToCentValue = new Dictionary<CashType, int>() 
{ 
    { CashType.d100, 10000 }, 
    { CashType.d50, 5000 }, 
    { CashType.d20, 2000 }, 
    { CashType.d10, 1000 }, 
    { CashType.d5, 500 }, 
    { CashType.d2, 200 }, 
    { CashType.d1, 100 }, 
    { CashType.c50, 50 }, 
    { CashType.c25, 25 }, 
    { CashType.c10, 10 }, 
    { CashType.c5, 5 }, 
    { CashType.c1, 1 } 
}; 


var sortedCash = new Dictionary<CashType, int>(); 
var cashInRegister = 342.11M; 
int cashInRegisterInCents = (int)(100 * cashInRegister); 

foreach (var denom in denominationsToCentValue) 
{ 
    int count = cashInRegisterInCents/denom.Value; 
    cashInRegisterInCents -= count * denom.Value; 

    sortedCash.Add(denom.Key, count); 
} 
関連する問題