// attempt to remove an amount of money from the coin box public Boolean Withdraw(decimal AmountToRemove) { decimal amountRemoved = 0M; decimal amountLeftToRemove = AmountToRemove; if ((AmountToRemove % Coin.ValueOfCoin(Coin.Denomination.NICKEL)) != 0) { Console.WriteLine("non multiple of 5"); return(false); } if (!ContainsExactChangeFor(AmountToRemove)) { Console.WriteLine("Exact change requirement not met ValueOf={0:c}, AmountToRemove={1:c}", this.ValueOf, AmountToRemove); return(false); } foreach (Coin.Denomination denominationEnumeral in reversedCoinList) { decimal amountOfThisCoinRemoved = 0M; if (amountLeftToRemove >= Coin.ValueOfCoin(denominationEnumeral)) { amountOfThisCoinRemoved = removeCoinDenomiation( amountLeftToRemove, denominationEnumeral); amountLeftToRemove -= amountOfThisCoinRemoved; amountRemoved += amountOfThisCoinRemoved; } } Console.WriteLine("AmountRemoved {0}, AmountToRemove {1}", amountRemoved, AmountToRemove); return(amountRemoved == AmountToRemove); }
private bool ContainsExactChangeFor(decimal Amount) { Boolean result = false; decimal amountToCheckFor = Amount; if (amountToCheckFor < 0M) { result = false; } else if (amountToCheckFor == 0M) { result = true; } else { foreach (Coin.Denomination denominationEnumeral in reversedCoinList) { for (int i = 0; i < coinCount(denominationEnumeral); i++) { if (amountToCheckFor >= Coin.ValueOfCoin(denominationEnumeral)) { amountToCheckFor -= Coin.ValueOfCoin(denominationEnumeral); } else { break; } } result = amountToCheckFor == 0M; } } return(result); }
// remove as many of a specified coin as possible, without going over private decimal removeCoinDenomiation(decimal AmountToRemove, Coin.Denomination denominationEnumeral) { var coins = from aCoin in box where aCoin.DenominationEnumeral == denominationEnumeral select aCoin; var coinArray = coins.ToArray(); decimal amountRemoved = 0M; decimal amountLeftToRemove = AmountToRemove; foreach (Coin aCoin in coinArray) { if (amountLeftToRemove >= Coin.ValueOfCoin(denominationEnumeral)) { box.Remove(aCoin); amountRemoved += aCoin.ValueOf; amountLeftToRemove -= aCoin.ValueOf; } else { break; } } return(amountRemoved); }