Solucionado (ver solução)

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!

Solucionado
(ver solução)
3
respostas

Desafio: hora da prática - exercício 5

Eu tive uma certa dificuldade de compreender esta solução:

# Coletamos os preços dos três produtos
p1 = float(input('Digite o preço do primeiro produto: '))
p2 = float(input('Digite o preço do segundo produto: '))
p3 = float(input('Digite o preço do terceiro produto: '))

# Verificamos qual produto é o mais barato usando o operador lógico 'and'
if p1 < p2 and p1 < p3:
    print('O primeiro produto é o mais barato.')
elif p2 < p1 and p2 < p3:
    print('O segundo produto é o mais barato.')
elif p3 < p1 and p3 < p2:
    print('O terceiro produto é o mais barato.')
elif p1 == p2 == p3:
    print('Os produtos possuem o mesmo preço.')
else:
    # Identificamos quais produtos possuem o mesmo preço, se for o caso
    if p1 == p2:
        print('O primeiro e o segundo produtos são os mais baratos.')
    elif p2 == p3:
        print('O segundo e terceiro produtos são os mais baratos.')
    elif p1 == p3:
        print('O primeiro e o terceiro produtos são os mais baratos.')

Porém se desenharmos o fluxo daquele código errado como uma árvore, fica transparente o exato momento em que o galho quebra:

                [Início]
                    |
        (p1 < p2 e p1 < p3?)
                /           \
           Sim /             \ Não
              /                \
[1º é o mais barato]   (p2 < p1 e p2 < p3?)
                         /           \
                    Sim /             \ Não
                       /               \
             [2º é o mais barato]   (p3 < p1 e p3 < p2?)
                                       /           \
                                   Sim /             \ Não
                                     /                \
                           [3º é o mais barato]   (p1 == p2 == p3?)
                                                     /          \
                                                 Sim /            \ Não
                                                   /               \
                                        [Todos são iguais]     [Cai no ELSE]
                                                                    |
                                                              (p1 == p2?)
                                                                /     \
                                                            Sim /       \ Não
                                                              /          ...
                                            [1º e 2º mais baratos]  (ERRO AQUI!)
                                            


                            [Início]
                                 |
                      --- (Menor Único?) ---
                     /           |          \
                   Sim          Sim         Sim
                   /             |            \
              [p1 < ...]    [p2 < ...]    [p3 < ...]
                 /               |              \
           [1º Mais Barato] [2º Mais Barato] [3º Mais Barato]
                                 |
                                Não
                                 |
                     --- (Empate Duplo?) ---
                    /            |          \
                  Sim           Sim         Sim
                  /              |            \
          [p1==p2 e p1<p3]  [p2==p3 e p2<p1]  [p1==p3 e p1<p2]
                /                |                \
        [1º e 2º Menores]  [2º e 3º Menores]  [1º e 3º Menores]
                                 |
                                Não
                                 |
                       [Todos São Iguais]
3 respostas

Olá Esperidião, tudo bem?

Que análise detalhada! Dá pra ver que você foi fundo no raciocínio antes de perguntar, e isso faz toda a diferença no aprendizado.

Você identificou corretamente o ponto fraco do código original: o else final não garante, por si só, que estamos lidando com um empate entre dois produtos mais baratos. Ele apenas cobre "o que sobrou" depois de todas as condições anteriores. Se, por exemplo, p1 = 1, p2 = 2 e p3 = 1, o código entra no else e acaba verificando p1 == p2 (falso), depois p2 == p3 (falso) e por fim p1 == p3 (verdadeiro), o que resulta em "1º e 3º mais baratos". Isso, por sorte, está correto nesse caso. Mas a lógica não é robusta: ela não garante que o par identificado seja realmente o menor, como você percebeu.

Sua árvore revisada resolve exatamente isso, adicionando a condição extra (p1 < p3, p2 < p1, p1 < p2) para confirmar que o par empatado também é o menor dentre os três. Isso é um raciocínio de qualidade.

Uma observação adicional: em casos assim, vale pensar também no uso de min() para deixar o código mais legível. Por exemplo, verificar se p1 == p2 == min(p1, p2, p3) comunica a intenção de forma mais direta, mas a abordagem que você modelou é igualmente correta e mostra domínio real do fluxo de controle.

Conte com a Alura para evoluir seus estudos. Em caso de dúvidas, fico à disposição.

Bons estudos!

Sucesso

Imagem da comunidade

Dúvida existe um método, para quando o número de variáveis e cenários aumentam de forma quase exponencial?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

IF, ELIF e ELSE se resumiriam a prever todos os cenários possíveis?

solução!

Olá Esperidião, tudo bem?

Que pergunta ótima! E o fluxograma que você anexou ilustra bem o ponto: com duas variáveis, a árvore já tem três folhas. Com três variáveis e empates possíveis, ela explode. Você está sentindo na prática um problema real de escalabilidade de código.

Para responder diretamente: sim, if/elif/else exige prever os cenários, mas existem formas de reduzir essa explosão. A principal é mudar a abordagem, em vez de comparar cada par manualmente.

Com o min(), por exemplo, você não precisa mais enumerar quem é menor que quem:

menor = min(p1, p2, p3)

mais_baratos = []
if p1 == menor:
    mais_baratos.append("1º")
if p2 == menor:
    mais_baratos.append("2º")
if p3 == menor:
    mais_baratos.append("3º")

print(f"O(s) mais barato(s): {', '.join(mais_baratos)}")

Repare que aqui não tem elif, só if. Cada produto é verificado de forma independente. Isso cobre automaticamente o cenário de um único mais barato, dois empatados e todos iguais, sem precisar escrever um galho para cada caso.

Essa é a virada de chave: em vez de descrever todos os resultados possíveis, você descreve uma regra que se aplica a qualquer caso. Quanto mais variáveis entram, o código cresce pouco porque a lógica é genérica.

À medida que os problemas ficam mais complexos, esse raciocínio de "encontrar a regra geral" é o que separa uma solução frágil de uma robusta. Você já está pensando nisso ao questionar a explosão de galhos.

Conte com a Alura para evoluir seus estudos. Em caso de dúvidas, fico à disposição.

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