Dúvida sobre algoritmo de caixa eletronico com limite de notas em python

2,206 views
Skip to first unread message

Carlos Eduardo Castro

unread,
Mar 29, 2014, 10:46:08 AM3/29/14
to python...@googlegroups.com
Pessoal, bom dia

Estou quebrando a cabeça com um algoritmo de caixa eletronico em python.

'''***************************************************************************************************
Faça um algoritmo para ler um valor a ser sacado em um caixa eletronico, desprezando os centavos.
o caixa possui apenas notas de 50, 20,10,5

sendo

10 notas de 50
10 notas de 20
10 notas de 10
10 notas de 5

Sendo assim, se o usuário quiser sacar 550 reais, o algoritmo podera usar apenas 10 notas de 50 (disponivel no caixa) 2 notas de 20 e 1 de 10.

''*****************************************************************************************************'

Eu fiz o algoritmo, mas não estou conseguindo raciocinar como limitar para que quando sacado um quantia x de dinheiro, não ultrapasse o limite de notas.

Por exemplo: Se coloco o valor de 550 o programa me mostra 11 notas de 50 mas nao pode, tem q me mostrar 10 de 50 2 de 20  e 1 de 10.

Para descobrir a quantidade de notas sacadas usei o operador %. Alguem poderia me dar uma luz ?




Algoritmo

qtinicial50 = 10
qtinicial20 = 10
qtinicial10 = 10
qtinicial5 = 10
qt50 = 500
qt20 = 200
qt10 = 100
qt5 = 50
totalcaixa = qt50 + qt20 + qt10 + qt5

notasrestantes50 = 10
notasrestantes20 = 10
notasrestantes10 = 10
notasrestantes5 = 10

while True:
    val = input("Digite o valor para saque: ")
    if type (val) is float: #verifica se o conteudo de val é float
        print "Não aceito valores com centavos"
        continue

    if val > totalcaixa:
        print "O caixa eletronico não possui este valor"
        continue

    if val % 5 > 0 or val <= 0: # o caixa nao possui notas de 1 e 2, este if limita valores como 51 por exemplo ou 52
        print "erro"
        continue # retorna o programa para o inicio do while
   
    not50 = val / 50
    val   = val % 50
    not20 = val / 20
    val   = val % 20
    not10 = val / 10
    val   = val % 10
    not5  = val / 5
    val   = val % 5


    print "Este valor corresponde a: "
    if not50 > 0: print not50," notas de R$ 50,00"
    if not20 > 0: print not20," notas de R$ 20,00"
    if not10 > 0:print not10," notas de R$ 10,00"
    if not5 > 0:print not5," notas de R$ 5,00"

Alysson Bruno

unread,
Mar 31, 2014, 8:34:39 AM3/31/14
to python-brasil
Carlos,

Inicialmente, parabéns por tentar resolver seu problema e, quando não conseguiu, procurou ajuda.

Você usa muitas variáveis, será que não daria para reduzir o número delas? Eu não entendi, exatamente, para quê servem as variáveis qtinicialXX e notasrestantesXX, por exemplo. Você não as está utilizando no programa, então poderia retirá-las.

Quanto ao algoritmo, você já conhece o conceito de função? Se conhecer dá pra melhorar bem o algoritmo. Mas me atendo, simplesmente, ao que você já fez, vou dar uma ideia.

Quando alguém vai fazer um saque o caixa possui uma quantidade limitada de notas, então, supondo um valor qualquer de R$ 550,00 seu programa deverá saber a quantidade de notas maior que cabem neste valor dado por: QtdNotas50 * 50 e, fazer isso sucessivamente para as notas menores. Uma solução possível seria essa aqui: https://gist.github.com/alyssonbruno/9891295




paz e amor (love and peace),

Alysson Bruno
===============================================
Palmas(TO)
Brasil

Blog: http://abruno.com


=================================================================
Meu alterego Escritor:

Leia alguns contos que escrevo, não esqueça de me dar sua opinião: http://goo.gl/Wjn4p

=================================================================


--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo quot;Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Thiago Vieira

unread,
Mar 30, 2014, 9:22:00 PM3/30/14
to python...@googlegroups.com
Ao invés de fazer not50=val/50 por exemplo, você pode fazer not50=min(val//50, limiteNot50) e para atualizar val, você pode fazer val = val - 50*not50.
Isso deve funcionar


--

Renzo Nuccitelli

unread,
Mar 31, 2014, 11:33:20 AM3/31/14
to python...@googlegroups.com
Esse problema pede para ser resolvido de forma recursiva:

https://gist.github.com/renzon/9894835

Qual a lógica:

Escolha a maior nota. Retire o valor da nota do montante a ser sacado.

Se o valor remanscente for negativo, significa que essa nota não pode ser usada mais usada no saque. Ex: Saque 30 e maior nota disponivel é 50.

Caso contrário, inclua a maior nota no saque e chame a função saque recursivamente, passando como novo valor a ser sacado o remanescente.

Se o saque for 0, retorne o dicionário de saque indicando as quantidades de cada nota utilizada

Se não houver mais notas disponíveis e ainda há valor remanescente, não é possível fazer o saque por falta de notas.

Enfim, espero ter ajudado mais que atrapalhado. Sei que funções recursivas as vezes assustam.

 Abs,

--
  Renzo Nuccitelli

Carlos Eduardo Castro

unread,
Mar 31, 2014, 12:01:04 PM3/31/14
to python...@googlegroups.com
Bom dia Alysson, muito obrigado pela ajuda.

Estou quase conseguindo desenvolver a minha solução.

No seu algoritmo não entendi a seguinte linha:

saqueNota50 = if valorPretendido % 50 > qtNotas50 then qtNotas50 else valorPretendido % 50

Não compilou aqui e não entendi a função do then no código.

Muito obrigado pela ajuda.



Mário Neto

unread,
Mar 31, 2014, 12:50:22 PM3/31/14
to python...@googlegroups.com
@Renzo, dar um "rename" pra saque.py pra ficar com as cores e o código ficar mais legível, gostei da solução =)
Att. Mário Araújo Chaves Neto
Programmer, Designer and U.I. Engineer

MBA in Design Digital - 2008 - FIC
Analysis and Systems Development - 2011 - Estácio
Design and Implementation of Internet Environments - 2003 - FIC

Renzo Nuccitelli

unread,
Mar 31, 2014, 2:22:32 PM3/31/14
to python...@googlegroups.com

Em 31 de março de 2014 13:50, Mário Neto <macnd...@gmail.com> escreveu:
@Renzo, dar um "rename" pra saque.py pra ficar com as cores e o código ficar mais legível, gostei da solução =)


Alterado! Depois de ter estudado um pouco de Lisp, as vezes eu gosto de tentar resolver os problemas de forma recursiva.

Obrigado pela dica.

 Abs,


--
  Renzo Nuccitelli

Mário Neto

unread,
Mar 31, 2014, 2:39:43 PM3/31/14
to python...@googlegroups.com
Show!


--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo quot;Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Renzo Nuccitelli

unread,
Mar 31, 2014, 3:43:17 PM3/31/14
to python...@googlegroups.com

Em 31 de março de 2014 13:01, Carlos Eduardo Castro <edu.i...@gmail.com> escreveu:
saqueNota50 = if valorPretendido % 50 > qtNotas50 then qtNotas50 else valorPretendido % 50

Acho que o correto é:

saqueNota50 = qtNotas50 if valorPretendido % 50 > qtNotas50 else valorPretendido % 50
Isso em temos apenas de sintaxe.


--
  Renzo Nuccitelli

Carlos Eduardo Castro

unread,
Mar 31, 2014, 3:58:50 PM3/31/14
to python...@googlegroups.com
Nada ainda pessoal, tá dificil de raciocinar hehehe...

Alguem tem alguma maneira simples e didática para solucionar este problema ?

Estou a uns 4 dias nele já.

Linux - Junior Polegato

unread,
Mar 31, 2014, 4:03:34 PM3/31/14
to python...@googlegroups.com
Em 31-03-2014 16:58, Carlos Eduardo Castro escreveu:
> Nada ainda pessoal, tá dificil de raciocinar hehehe...
> Alguem tem alguma maneira simples e didática para solucionar este
> problema ?
> Estou a uns 4 dias nele já.

Olá!

Minha solução com algoritmo detalhado não te ajudou?

--

[]'s

Junior Polegato

Renzo Nuccitelli

unread,
Mar 31, 2014, 4:04:37 PM3/31/14
to python...@googlegroups.com
Também não entendi nada, já postaram várias soluções. Eu tinha postado essa na outra thread:


"Esse problema pede para ser resolvido de forma recursiva:

https://gist.github.com/renzon/9894835

Qual a lógica:

Escolha a maior nota. Retire o valor da nota do montante a ser sacado.

Se o valor remanscente for negativo, significa que essa nota não pode ser usada mais usada no saque. Ex: Saque 30 e maior nota disponivel é 50.

Caso contrário, inclua a maior nota no saque e chame a função saque recursivamente, passando como novo valor a ser sacado o remanescente.

Se o saque for 0, retorne o dicionário de saque indicando as quantidades de cada nota utilizada

Se não houver mais notas disponíveis e ainda há valor remanescente, não é possível fazer o saque por falta de notas.

Enfim, espero ter ajudado mais que atrapalhado. Sei que funções recursivas as vezes assustam."


--
  Renzo Nuccitelli


--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
   http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:
--- Você está recebendo esta mensagem porque se inscreveu no grupo "Python Brasil" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/d/optout.

Carlos Eduardo Castro

unread,
Mar 31, 2014, 8:17:40 PM3/31/14
to python...@googlegroups.com
Cara não entendi absolutamente nada do teu código hehehe

desculpe.

Não sou programador, e tenho serias dificuldades.

Faço tecnologo em redes de computadores e tenho uma cadeira de algoritmos.

Preciso de uma solução simples, sem uso de funções, listas ou outras coisas avançadas.

Tentei de tudo já, mas estou travado.

A Solução do Alysson Bruno me parece interessante, mas não compila, logo não estou conseguindo entender a lógica.

Hermogenes Batista

unread,
Mar 31, 2014, 10:07:46 PM3/31/14
to python...@googlegroups.com
Carlos, segue a minha sugestão, sem usar nada mais robusto, apenas 1 loop e vários "if" e "else". Criei a conta agora a noite no Github, então desculpa por fazer do jeito errado :)


Hermogenes Batista da Silva Filho




--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---

Carlos Eduardo Castro

unread,
Mar 31, 2014, 11:38:55 PM3/31/14
to python...@googlegroups.com
Pelo amor de deus. ...

Perfeito !

Consegui entender o código tranquilo.

Gostaria de agradecer a todos que não mediram esforços para ajudar.

Parabens pela dedicação de voces programadores ! Sou um mero leigo.

Muito obrigado pelo auxilio !!! Agora conseguirei montar minha própria solução.

exemogenes, muito obrigado cara !

Hermogenes Batista

unread,
Apr 1, 2014, 3:48:51 AM4/1/14
to python...@googlegroups.com

De nada cara, acho que entendi o que você queria por ser ainda um bebê, se comparado aos ninjas daqui, então reduzi ao máximo a complexidade do programa para ficar mais entendível do que eficiente. Ppr exemplo, postaram uma validação  com min de 2 argumentos que não conhecia e vi que você também não entendeu. Achismo meu, mas parece que você ta vendo Algoritmo 1 agora, certo?

Abraço!

Hermogenes Batista

Linux - Junior Polegato

unread,
Apr 1, 2014, 8:34:19 AM4/1/14
to python...@googlegroups.com
Em 31-03-2014 21:17, Carlos Eduardo Castro escreveu:
> Cara não entendi absolutamente nada do teu código hehehe

Rsrsrsrs

Sem problemas, eu e outros também que não compreendemos seu nível de
dificuldade, e fomos direto à algoritmos de alto nível, recursividade,
funções prontos, teorias numéricas, métodos numéricos, combinações,
arranjos, probabilidade, dicionários, listas, tuplas, conjuntos unários
e tudo mais que tínhamos em mente e em mãos, quando na verdade queria
transformar um algoritmo simples em código...

Então segue a dica: faça primeiro o algoritmo! Se puder fazer fluxograma
melhor ainda!

Exemplo:

quantidade de notas de 50 disponível em notas_50_disponiveis
quantidade de notas de 20 disponível em notas_20_disponiveis
quantidade de notas de 10 disponível em notas_10_disponiveis
quantidade de notas de 05 disponível em notas_05_disponiveis

pedir valor e armazenar em valor como inteiro

fazer a divisão inteira do valor por 50 para saber quantas notas de 50
pode-se usar e armazenar em notas_50_possiveis
se notas_50_possiveis maior que notas_50_disponiveis, fazer
notas_50_utilizadas igual a notas_50_disponiveis, senão igual a
notas_50_possiveis
calcular o restante do valor fazendo o valor menos notas_50_utilizadas
vezes 50 e armazenar este resultado em resto_50

fazer a divisão inteira do resto_50 por 20 para saber quantas notas de
20 pode-se usar e armazenar em notas_20_possiveis
se notas_20_possiveis maior que notas_20_disponiveis, fazer
notas_20_utilizadas igual a notas_20_disponiveis, senão igual a
notas_20_possiveis
calcular o restante do valor fazendo o resto_50 menos
notas_20_utilizadas vezes 20 e armazenar este resultado em resto_20

fazer a divisão inteira do resto_20 por 10 para saber quantas notas de
10 pode-se usar e armazenar em notas_10_possiveis
se notas_10_possiveis maior que notas_10_disponiveis, fazer
notas_10_utilizadas igual a notas_10_disponiveis, senão igual a
notas_10_possiveis
calcular o restante do valor fazendo o resto_20 menos
notas_10_utilizadas vezes 10 e armazenar este resultado em resto_10

fazer a divisão inteira do resto_10 por 5 para saber quantas notas de 5
pode-se usar e armazenar em notas_5_possiveis
se notas_5_possiveis maior que notas_5_disponiveis, então não tem caixa
suficiente, senão notas_5_utilizadas igual a notas_5_possiveis
calcular o restante do valor fazendo o resto_10 menos notas_5_utilizadas
vezes 5 e armazenar este resultado em resto_5

Se resto_5 não for zero, então o valor não é múltiplo de 5 e não pode
ser sacado

Agora exibir:
<notas_50_utilizadas> x 50 + <notas_20_utilizadas> x 20 +
<notas_10_utilizadas> x 10 + <notas_05_utilizadas> x 5

Veja agora como em 5 minutos faz-se o código:

https://gist.github.com/JuniorPolegato/9913042

--

[]'s

Junior Polegato

Alex Júnior

unread,
Mar 30, 2022, 7:05:32 PM3/30/22
to Python Brasil
O problema é que se tenho que sacar por exemplo: 13 reais e tenho notas de 5 e 2 disponíveis. Eu tenho problemas pois o algoritmo pega uma nota de 10 e retorna o 3. Logo nn consigo gerar 1 nota de 5 e 4 notas de 2 para o usuário sacar. Pensei tbm na possibilidade de sacar 10 reais. Onde tenho 1 nota de cinco e 5 notas de dois reais, tbm tenho problemas. Onde o resto da divisão de 5 me dá 5, e logo fico com 5 no valor final para sacar nas notas de 2, sendo impossível. Alguém teria alguma solução para esse problema? 

Marcelo Valle

unread,
Mar 30, 2022, 7:28:59 PM3/30/22
to Python Brasil
Peguei o bonde andando, não sei se é o problema que você está tentando resolver, mas parece associado ao link abaixo.




--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar

 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Linux - Junior Polegato

unread,
Apr 3, 2022, 4:26:17 PM4/3/22
to Python Brasil
Olá!

Pensando somente no algoritmo (de oito anos atrás), sem utilizar soluções e/ou funções prontas, se tiver resto, deve-se assumir a quantidade disponível de uma nota "grande" como sendo a quantidade utilizada menos um e tentar novamente.

Assim sucessivamente até testar todas as possibilidades.

No caso do 13, o primeiro laço chega em 2x5 + 1x2 e sobra 1, então se assumir que tem agora 1 nota de 5 disponível e refazer, vai chegar em 1x5 + 4x2.

--
[]'s

Junior Polegato 

--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar

 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Inacivera Michelle de Oliveira Moreira

unread,
Apr 3, 2022, 6:03:31 PM4/3/22
to python...@googlegroups.com
No python ficaria desse jeito:

class Cliente:
     def __init__(self, nome, contato):
        self.nome = nome
        self.contato = contato


class Conta:
    def __init__(self, cliente, numero, saldo = 0):
        self.saldo = 0
        self.cliente = cliente
        self.numero = numero
        self.operacoes = []
        self.deposito(saldo)
    def resumo(self):
        print("Saldo da conta: %10.2f" %
               (self.numero, self.saldo))
    def pode_sacar(self, valor):
        return self.saldo >= valor
    def saque(self, valor):
        if self.pode_sacar(valor):
            self.saldo -= valor
            self.operacoes.append(["SAQUE", valor])
            return True
        else:
            print("Saldo insuficiente!")
            return False
    def deposito(self, valor):
        self.saldo += valor
        self.operacoes.append(["DEPOSITO", valor])
    def extrato(self):
        print("Extrato da conta %s\n" % self.numero)
        for o in self.operacoes:
            print("%10s   %10.2f" % (o[0],o[1]))
        print("\n      Saldo: %10.2f\n" % self.saldo)


class ContaEspecial(Conta):
    def __init__(self, clientes, numero, saldo = 0, limite=0):
        Conta.__init__(self, clientes, numero, saldo)
        self.limite = limite
    def pode_sacar(self, valor):
        return self.saldo + self.limite >= valor
    def extrato(self):
        Conta.extrato(self)
        print("\n     Limite: %10.2f\n" % self.limite)
        print("\n Disponivel: %10.2f\n" % (self.limite + self.saldo))


nome_cliente = Cliente("nome cliente", "contato")

conta = ContaEspecial([nome_cliente], agencia, valor)
conta.extrato()
conta.saque(1000)
conta.extrato()

Alex Júnior

unread,
Apr 5, 2022, 8:25:06 AM4/5/22
to Python Brasil
Junior, Eu consigo criar alguma função onde não vou ter de usar vários ifs? São inúmeras possibilidades de saque. 

Alex Júnior

unread,
Apr 5, 2022, 10:33:05 AM4/5/22
to Python Brasil
Pensei em uma situação onde você quer sacar R$10 sendo que no caixa tem 1 nota de R$ 5 , e 5 notas de R$2. O Algoritmo quebra quando chega nas notas de 5, ele puxa 1 nota de 5 e sobra de resto 5, sendo impossível ficar com resto 0, onde teria de ter uma moeda de 1 real.

Marcelo Valle

unread,
Apr 5, 2022, 10:59:44 AM4/5/22
to Python Brasil
3 opções de algoritmos, o ideal depende dos requisitos:

- greedy
- greedy com back tracking
- dynamic programming

Dependendo das suas notas, o algoritmos guloso (greedy) funciona. Para outras, você vai precisar de dynamic programming, pois provavelmente terá muitos casos repetidos. 

Para o problema que você citou, de tentar uma solução com a nota de 5, e quando descobrir que não funciona tentar outra usando a nota de 2, você pode usar back tracking. 

Enxergue o problema como um problema de árvore e tudo ficará mais fácil. Desenhe em um papel a árvore de possibilidades para as notas que você tem. 



Reply all
Reply to author
Forward
0 new messages