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

[Sugestão] Correção para Bug

Olá! Tudo bem?

A solução proposta para o exercício "Contador de cédulas únicas" tem um problema quando são solicitados valores terminados em 6 e 8.

Isso ocorre porque os restos dessas divisões acabam sendo 1 e 3 quando são usadas notas de 5.

Acredito que essa seja uma possível forma de resolver esse problema:

def valor():
    try:
        solicitacao = int(input("Digite o calor do saque (múltiplo de 2): "))
        if solicitacao % 2 != 0:
            print("Erro: o valor precisa ser múltiplo de 2")
            return valor()
        elif solicitacao < 0:
            print("Erro: o valor precisa ser positivo")
            return valor()
        return solicitacao
    except:
        print("O Valor precisa ser inteiro")
        return valor()
    
def caixa(valor):
    cedulas = [100,50,20,10,5,2]
    print("Cédulas entregues:")
    for cedula in cedulas:
        quantidade = valor // cedula
        if quantidade > 0:
            if valor % cedula == 1 or valor % cedula == 3:
                continue
            print(f"{quantidade} cédulas de R${cedula}")
            valor = valor % cedula
            

etapa1 = valor()
caixa(etapa1)
            

Nessa sugestão, quando o programa testa que o resto da divisão inteira entre o valor e a cédula é 1 ou 3, ele ignora o uso das notas de 5 e passa para as notas de 2.

Assim, o caixa eletrônico pode entregar o dinheiro solicitado pelo usuário sem problemas!

2 respostas

Oi, Renato! Tudo bem?

Que ótimo ver você analisando o exercício de Contador de cédulas únicas em Python e identificando um problema específico nos valores terminados em 6 e 8. Esse tipo de observação faz toda a diferença no aprendizado de lógica de programação.

Sua sugestão foi muito pertinente. Você percebeu que, ao calcular a quantidade de cédulas, o uso da nota de 5 pode gerar um resto de 1 ou 3, o que inviabiliza completar o valor solicitado apenas com as notas disponíveis. A solução que você propôs no def caixa trata exatamente esse cenário: quando o resto da divisão inteira entre o valor e a cédula de 5 resulta em 1 ou 3, o programa executa um continue e passa para as cédulas de 2, garantindo que o caixa eletrônico consiga entregar o valor correto ao usuário.

Uma dica interessante para aprofundar ainda mais esse raciocínio é considerar uma abordagem de programação dinâmica, que testa combinações possíveis para encontrar a solução com a menor quantidade de cédulas. Veja um exemplo:


def calcular(valor, cedulas):
    if valor == 0:
        return []

    melhor = None

    for cedula in cedulas:
        if cedula <= valor:
            resultado = calcular(valor - cedula, cedulas)

            if resultado is not None:
                candidato = [cedula] + resultado

                if melhor is None or len(candidato) < len(melhor):
                    melhor = candidato

    return melhor

print(calcular(16, [100, 50, 20, 10, 5, 2]))

Esse código percorre as cédulas disponíveis, como 100, 50, 20, 10, 5 e 2, e testa diferentes combinações de notas para encontrar aquela que utiliza a menor quantidade de cédulas possível. Assim, o print final exibe a combinação ideal para qualquer valor válido que o usuário informar na solicitacao.

Você já pensou em como adaptar esse modelo recursivo para incluir a validação de múltiplo de 2 que você implementou na função def valor? Seria uma ótima forma de unir as duas abordagens em uma solução ainda mais robusta.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Não cheguei a pensar em soluções assim! Muito obrigado pela dica.

Ainda estou na fase de aprendizado e fico feliz que a análise que fiz tenha agradado!