Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

2
respostas

RESOLUÇÃO - Contador de cédulas únicas

Observei que em alguns números o script priorizava a nota maior em alguns casos, resultando em valor faltante de R$1 e R$3, contornei com um if a mais bypassando restos 1 e 3

cedulas_disponiveis = [100, 50, 20, 10, 5, 2]

def exibir_cedulas_disponiveis(cedulas):
    print("Cedulas disponiveis para saque:")
    print(*(f"R$ {cedula}" for cedula in cedulas), sep= ", ")

def sacar_valor(saque, cedulas):
    for cedula in cedulas:
        quantidade = saque // cedula
        if quantidade > 0:
            if saque % cedula == 1 or saque % cedula == 3:
                continue
            saque = saque % cedula
            print(f"{quantidade} cédulas de R$ {cedula}.")

def main():
    exibir_cedulas_disponiveis(cedulas_disponiveis)

    try:
        valor_saque = int(input("Digite o valor a ser sacado: "))

        if valor_saque <= 0:
            print("Erro: O valor deve ser positivo.")
        elif valor_saque % 2 != 0:
            print("Erro: O valor deve ser múltiplo de 2.")
        else:
            print("Cédulas entregues:")
            sacar_valor(valor_saque, cedulas_disponiveis)
    except ValueError:
        print("Erro: Digite apenas um valor numerico válido.")

if __name__ == "__main__":
    main()
2 respostas

Bom dia!

O código está bem estruturado e usa recursos úteis da linguagem, mas, ao meu ver, possui uma falha lógica na função sacar_valor: a lógica de atualização da variável saque descarta o resto da divisão sem abater corretamente o valor já calculado das cédulas maiores, gerando contagens e trocos errados.

No meu entendimento, o correto seria:

def sacar_valor(saque, cedulas):
  for cedula in cedulas:
    quantidade = saque // cedula
    if quantidade > 0:
      print(f"{quantidade} cédulas de R$ {cedula}.")
      saque %= cedula

Espero ter ajudado. Se sua dúvida foi sanada, marque este tópico como solucionado.

Bons estudos!

Opa Thiago, tudo bem?

verificando a sua sugestão, que por sinal foi o primeiro caminho que tomei, ela traz o problema de se eu colocar para sacar 226 ela retorna 2x100, 1x20 e 1x5, ou seja devolve o saque faltando, veja a saída com este código:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Agora utilizando a verificação de restos 1 e 3 que fiz, resolvemos este problema e recebemos o saque correto, veja na imagem:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade