//Saque de moedas
        public void Withdraw(List <CoinSet> coins)
        {
            List <CoinSet> temp = new List <CoinSet>();

            foreach (CoinSet cs in coins)
            {
                int pos = CoinsSet.BinarySearch(cs);

                try
                {
                    CoinsSet[pos].RemoveCoins(cs.Quantity);
                    NumCoins   -= cs.Quantity;
                    TotalValue -= cs.TotalValue();
                    temp.Add(cs);
                }

                catch (Exception exception)
                {
                    AddCoins(temp); //Devolve para a máquina as moedas retiradas até agora

                    if (exception is InsufficientCoinsToWithdrawException)
                    {
                        throw new InsufficientCoinsToWithdrawException(CoinsSet[pos].Quantity, cs.Quantity, cs.Value);
                    }

                    else
                    {
                        //Nesse caso, a variável "pos" é negativa, pois não há um conjunto de moedas do valor solicitado
                        //Assim, a exceção capturada foi a ArgumentOutOfRangeException
                        throw new InsufficientCoinsToWithdrawException(0, cs.Quantity, cs.Value);
                    }
                }
            }
        }
        //As moedas são inseridas em ordem crescente de valor
        public void AddCoins(List <CoinSet> coins)
        {
            foreach (CoinSet cs in coins)
            {
                int i = CoinsSet.BinarySearch(cs);

                if (i < 0)
                {
                    i = 0;

                    for (; i < CoinsSet.Count; i++)
                    {
                        if (cs.Value < CoinsSet[i].Value)
                        {
                            break;
                        }
                    }

                    CoinsSet.Insert(i, new CoinSet(cs.Value));
                }

                AddCoinsInTheSet(i, cs);
            }
        }