2  Estruturas de Decisão

Nesta seção, aprenderemos como fazer nossos programas tomarem decisões.


2.1 Tomando Decisões com if/else

A estrutura if/else permite que o programa execute blocos de código diferentes com base em uma condição ser Verdadeira ou Falsa.

Sintaxe:

if condicao:
    # Código a ser executado se a condição for Verdadeira
else:
    # Código a ser executado se a condição for Falsa

Atenção: A indentação (o espaço no início da linha) é como o Python sabe qual código pertence ao if e qual pertence ao else.

Exemplos Práticos:

Portão (portao.py): Crie um programa que funcione como um portão eletrônico com senha. O programa pede ao usuário uma senha, e a senha correta é "python". Se o usuário digitar a senha correta, o programa exibe “Acesso Permitido.”; para qualquer outro texto, exibe “Acesso Negado.”.

senha = input("Digite a senha: ")
if senha == "python":
    print("Acesso Permitido.")
else:
    print("Acesso Negado.")

Execução com a senha correta:

Digite a senha: python
Acesso Permitido.

Execução com uma senha errada:

Digite a senha: Python
Acesso Negado.

O programa lê a senha e escolhe entre duas mensagens com base em uma condição. O operador == compara os dois lados e resulta em True (verdadeiro) quando eles são exatamente iguais, inclusive em maiúsculas e minúsculas, ou em False (falso) em qualquer outro caso. Não confunda ==, que compara, com =, que guarda um valor em uma variável.

Quando a condição é verdadeira, o Python executa o bloco indentado abaixo do if (linha 3) e ignora o else. Quando é falsa, ele pula esse bloco e executa o do else (linha 5). Por isso, quem digita Python, com P maiúsculo, tem o acesso negado.

Positivo ou negativo (positivo.py): Crie um programa que peça um número inteiro e informe se ele é positivo ou negativo. Se o número for maior ou igual a zero, o programa exibe “Número positivo.”; se for menor que zero, exibe “Número negativo.”.

num = int(input("Digite um número: "))
if num >= 0:
    print("Número positivo.")
else:
    print("Número negativo.")

Execução com um número positivo:

Digite um número: 7
Número positivo.

Execução com um número negativo:

Digite um número: -3
Número negativo.

A conversão com int() transforma o texto digitado em número, o que permite comparar o valor com o zero. O operador >= significa “maior ou igual a”, então a condição é verdadeira para 0, 1, 2 e assim por diante, e falsa para qualquer número negativo. Pela regra do programa, o zero é tratado como positivo.


2.2 Múltiplas Condições com if/elif/else

Quando temos mais de duas possibilidades, usamos o elif (uma contração de “else if”) para testar várias condições em sequência.

Exemplos Práticos:

Corretor (corretor.py): Crie um programa que converta uma nota de 0 a 100 em um conceito, de acordo com a tabela abaixo, e exiba o conceito obtido.

  • Nota maior ou igual a 90: conceito A.
  • Nota maior ou igual a 75: conceito B.
  • Nota maior ou igual a 50: conceito C.
  • Nota menor que 50: conceito F.
nota = int(input("Digite a nota (0-100): "))
if nota >= 90:
    print("Conceito: A")
elif nota >= 75:
    print("Conceito: B")
elif nota >= 50:
    print("Conceito: C")
else:
    print("Conceito: F")

Exemplo de execução:

Digite a nota (0-100): 80
Conceito: B

Com if/elif/else, o Python testa as condições de cima para baixo e executa apenas o bloco da primeira que for verdadeira, ignorando todas as outras. Com a nota 80, por exemplo, o teste nota >= 90 falha, o teste nota >= 75 é verdadeiro, e o programa exibe Conceito: B sem chegar aos testes seguintes.

Essa ordem dispensa limites superiores nas condições. O elif nota >= 75 não precisa verificar se a nota é menor que 90, porque o programa só chega a esse teste quando o anterior já falhou. O else final não tem condição: ele recebe todas as notas que falharam nos testes anteriores, ou seja, as menores que 50.

Semáforo (semaforo.py): Crie um programa que simule um semáforo. O programa pede ao usuário uma cor (“vermelho”, “amarelo” ou “verde”) e exibe a ação correspondente: “Pare.”, “Atenção.” ou “Siga.”. Para qualquer outra cor, exibe “Cor inválida.”.

cor = input("Digite a cor (vermelho/amarelo/verde): ")
if cor == "vermelho":
    print("Pare.")
elif cor == "amarelo":
    print("Atenção.")
elif cor == "verde":
    print("Siga.")
else:
    print("Cor inválida.")

Execução com uma cor válida:

Digite a cor (vermelho/amarelo/verde): vermelho
Pare.

Execução com uma cor inválida:

Digite a cor (vermelho/amarelo/verde): azul
Cor inválida.

O mesmo padrão do exemplo anterior funciona com textos: cada if ou elif compara a cor digitada com uma das opções válidas, na ordem em que aparecem. O else final funciona como rota de escape e captura qualquer entrada que não corresponda a nenhuma opção, como azul ou Verde, com V maiúsculo.

Menu (menu.py): Crie um programa que simule o menu de um jogo. O programa exibe as opções “1. Iniciar Jogo”, “2. Carregar Jogo” e “3. Sair” e pede ao usuário a escolha, um número inteiro. Para a escolha 1, exibe “Iniciando…”; para 2, “Carregando…”; para 3, “Saindo…”; e para qualquer outro número, “Seleção desconhecida.”.

print("1. Iniciar Jogo")
print("2. Carregar Jogo")
print("3. Sair")
escolha = int(input("Digite a escolha (1/2/3): "))
if escolha == 1:
    print("Iniciando...")
elif escolha == 2:
    print("Carregando...")
elif escolha == 3:
    print("Saindo...")
else:
    print("Seleção desconhecida.")

Exemplo de execução:

1. Iniciar Jogo
2. Carregar Jogo
3. Sair
Digite a escolha (1/2/3): 2
Carregando...

As três primeiras linhas exibem o menu, e a linha 4 lê a escolha e a converte com int(). Por isso, as comparações usam números sem aspas, como escolha == 1. Sem a conversão, a variável guardaria o texto "1", e a comparação com o número 1 seria sempre falsa, já que um texto nunca é igual a um número.


2.3 Combinando Condições: Operadores Booleanos

Podemos criar condições mais complexas usando os operadores and, or e not.

  • and: Ambas as condições precisam ser Verdadeiras.
  • or: Pelo menos uma das condições precisa ser Verdadeira.
  • not: Inverte o resultado da condição (Verdadeiro vira Falso e vice-versa).

Exemplos Práticos:

and (montanha_russa.py): Crie um programa que verifique se uma pessoa pode andar em uma montanha-russa. O programa pede a altura em centímetros e a idade, ambas números inteiros. A pessoa pode andar no brinquedo se a altura for superior a 120 cm e a idade for de 12 anos ou mais. O programa exibe “Você pode andar no brinquedo.” quando as duas condições são atendidas e “Você não pode andar.” nos demais casos.

altura = int(input("Digite altura em cm: "))
idade = int(input("Digite idade: "))
if altura > 120 and idade >= 12:
    print("Você pode andar no brinquedo.")
else:
    print("Você não pode andar.")

Execução em que as duas condições são atendidas:

Digite altura em cm: 130
Digite idade: 14
Você pode andar no brinquedo.

Execução em que a idade não é suficiente:

Digite altura em cm: 130
Digite idade: 10
Você não pode andar.

O operador and junta duas condições, e o resultado só é verdadeiro quando as duas são verdadeiras. Uma pessoa com 130 cm e 14 anos pode andar no brinquedo; uma pessoa com 130 cm e 10 anos não pode, porque falha no teste da idade. Basta uma condição falsa para o and resultar em falso.

Repare também nos limites. A altura precisa ser maior que 120 (>), então 120 cm não basta, enquanto a idade precisa ser maior ou igual a 12 (>=), então 12 anos já é suficiente.

or (desconto.py): Crie um programa que determine se um cliente tem direito a desconto. O programa pergunta se o cliente é estudante (“sim” ou “nao”) e qual é a idade dele. O cliente tem desconto se for estudante ou tiver mais de 60 anos. O programa exibe “Desconto aplicado!” ou “Preço normal.”.

status = input("Você é estudante (sim/nao)? ")
idade = int(input("Digite sua idade: "))
if status == "sim" or idade > 60:
    print("Desconto aplicado!")
else:
    print("Preço normal.")

Exemplo de execução:

Você é estudante (sim/nao)? nao
Digite sua idade: 65
Desconto aplicado!

Com o operador or, basta uma das condições ser verdadeira para o resultado ser verdadeiro. Um estudante de 20 anos ganha desconto pela primeira condição, e uma pessoa de 65 anos que não estuda ganha pela segunda. O else só executa quando as duas condições são falsas, isto é, para quem não é estudante e tem 60 anos ou menos.

not (game_over.py): Crie um programa que use uma variável booleana game_over. Se game_over for False, o programa exibe “Continue jogando!”; se for True, exibe “Fim de Jogo.”. Use o operador not na condição do if.

game_over = False
if not game_over:
    print("Continue jogando!")
else:
    print("Fim de Jogo.")

Exemplo de execução:

Continue jogando!

A variável game_over é booleana, ou seja, só pode valer True ou False. O operador not inverte esse valor: como game_over vale False, a expressão not game_over vale True, e o programa exibe Continue jogando!. A condição da linha 2 pode ser lida como “se não é fim de jogo”. Experimente trocar o valor da linha 1 para True e observe que o programa passa a executar o else.


2.4 Decisões Aninhadas

Podemos colocar uma estrutura if/else dentro de outra. Isso é útil para fazer verificações sequenciais.

Exemplos Práticos:

Login (login.py): Crie um programa que simule um login simples. O programa pede o nome de usuário. Se o usuário for “admin”, o programa pede a senha e exibe “Bem-vindo, Administrador.” quando a senha for “1234” ou “Senha errada.” em caso contrário. Para qualquer outro usuário, o programa exibe “Usuário desconhecido.” sem pedir a senha.

usuario = input("Usuário: ")
if usuario == "admin":
    senha = input("Senha: ")
    if senha == "1234":
        print("Bem-vindo, Administrador.")
    else:
        print("Senha errada.")
else:
    print("Usuário desconhecido.")

Execução com usuário e senha corretos:

Usuário: admin
Senha: 1234
Bem-vindo, Administrador.

Execução com a senha errada:

Usuário: admin
Senha: 0000
Senha errada.

Execução com outro usuário:

Usuário: joao
Usuário desconhecido.

Este é o primeiro exemplo de decisão aninhada, isto é, de um if dentro do bloco de outro. O if externo verifica o usuário. Somente quando ele é admin o programa pede a senha e chega ao if interno, que verifica a senha. Qualquer outro usuário vai direto para o else externo, e a senha nem chega a ser pedida.

A indentação mostra a que if cada else pertence. O else da linha 6 está alinhado com o if da senha, na linha 4, e o else da linha 8 está alinhado com o if do usuário, na linha 2.

Loja (loja.py): Crie um programa que simule a verificação de estoque de uma loja. O programa pergunta a quantidade de itens no estoque. Se não houver itens (0 ou menos), exibe “Fora de estoque.”. Se houver, pergunta o tamanho desejado e exibe “Aqui está o tamanho Pequeno.” para “P”, “Aqui está o tamanho Médio.” para “M”, “Aqui está o tamanho Grande.” para “G” e “Não temos o tamanho” seguido do tamanho digitado para qualquer outra opção.

estoque = int(input("Quantos itens no estoque? "))
if estoque > 0:
    tamanho = input("Tamanho (P/M/G)? ")
    if tamanho == "P":
        print("Aqui está o tamanho Pequeno.")
    elif tamanho == "M":
        print("Aqui está o tamanho Médio.")
    elif tamanho == "G":
        print("Aqui está o tamanho Grande.")
    else:
        print(f"Não temos o tamanho {tamanho}")
else:
    print("Fora de estoque.")

Execução com estoque:

Quantos itens no estoque? 5
Tamanho (P/M/G)? M
Aqui está o tamanho Médio.

Execução sem estoque:

Quantos itens no estoque? 0
Fora de estoque.

O estoque funciona como uma condição de entrada. Quando há itens, o programa pergunta o tamanho e testa as opções com um if/elif/else aninhado; quando não há, vai direto para Fora de estoque. sem fazer a pergunta. Para um tamanho desconhecido, o else interno usa uma f-string para repetir o que o usuário digitou, como em Não temos o tamanho GG.

Qualificação (qualificacao.py): Crie um programa que simule a seleção de um candidato a uma vaga. O programa pergunta se o candidato tem diploma (“sim” ou “nao”). Sem diploma, exibe “Diploma é obrigatório.”. Com diploma, pergunta os anos de experiência e exibe “Você foi contratado!” se a experiência for maior que 3 anos ou “Experiência insuficiente.” em caso contrário.

diploma = input("Você tem diploma (sim/nao)? ")
if diploma == "sim":
    experiencia = int(input("Anos de experiência: "))
    if experiencia > 3:
        print("Você foi contratado!")
    else:
        print("Experiência insuficiente.")
else:
    print("Diploma é obrigatório.")

Execução de um candidato com diploma:

Você tem diploma (sim/nao)? sim
Anos de experiência: 5
Você foi contratado!

Execução de um candidato sem diploma:

Você tem diploma (sim/nao)? nao
Diploma é obrigatório.

O diploma é um pré-requisito: a pergunta sobre experiência fica dentro do bloco if diploma == "sim", de modo que um candidato sem diploma é rejeitado imediatamente, sem precisar informar a experiência. Repare que a regra exige mais de 3 anos (> 3), então um candidato com exatamente 3 anos recebe Experiência insuficiente.


2.5 Mais Exemplos com Aninhamento

Vamos combinar o que aprendemos para resolver problemas com múltiplos níveis de decisão.

Exemplos Práticos:

Classificação de produto (classificacao_produto.py): Crie um programa que classifique um produto a partir de três informações digitadas pelo usuário: a categoria (“eletrônicos”, “roupas” ou “alimentos”), o preço (número decimal) e a avaliação (número de 0 a 5). As regras dependem da categoria.

  1. Eletrônicos:
    • Preço acima de 5000: “Produto de alto valor.”, com a recomendação “Compra premium, excelente avaliação.” se a avaliação for pelo menos 4.5 ou “Considere outras opções devido à avaliação.” em caso contrário.
    • Preço entre 1000 e 5000: “Produto de médio valor.”, com a recomendação “Bom custo-benefício.” se a avaliação for pelo menos 4.0 ou “Pesquise por promoções.” em caso contrário.
    • Preço abaixo de 1000: “Produto de baixo valor e acessível.”.
  2. Roupas:
    • Avaliação de pelo menos 4.5: “Peça de alta qualidade e bem avaliada.”, com a recomendação “Item de grife/especial.” se o preço passar de 200 ou “Ótima compra!” em caso contrário.
    • Avaliação abaixo de 4.5: “Peça comum.”, com a recomendação “Bom para o dia a dia.” se o preço for menor que 50 ou “Verifique a qualidade do tecido.” em caso contrário.
  3. Alimentos: o programa exibe a categoria e, em seguida, “Produto gourmet.” se o preço passar de 50 ou “Produto de consumo regular.” em caso contrário. Além disso, se a avaliação for menor que 3.0, exibe um aviso de baixa avaliação.

Para qualquer outra categoria, o programa informa que a categoria não foi reconhecida.

categoria = input("Digite a categoria do produto (eletrônicos, roupas, alimentos): ")
preco = float(input("Digite o preço do produto: R$ "))
avaliacao = float(input("Digite a avaliação do produto (0 a 5): "))
print()
print("--- Classificação do Produto ---")
if categoria == "eletrônicos":
    if preco > 5000:
        print("Produto de alto valor.")
        if avaliacao >= 4.5:
            print("Recomendação: Compra premium, excelente avaliação.")
        else:
            print("Recomendação: Considere outras opções devido à avaliação.")
    elif 1000 <= preco <= 5000:
        print("Produto de médio valor.")
        if avaliacao >= 4.0:
            print("Recomendação: Bom custo-benefício.")
        else:
            print("Recomendação: Pesquise por promoções.")
    else:
        print("Produto de baixo valor e acessível.")
elif categoria == "roupas":
    if avaliacao >= 4.5:
        print("Peça de alta qualidade e bem avaliada.")
        if preco > 200:
            print("Recomendação: Item de grife/especial.")
        else:
            print("Recomendação: Ótima compra!")
    else:
        print("Peça comum.")
        if preco < 50:
            print("Recomendação: Bom para o dia a dia.")
        else:
            print("Recomendação: Verifique a qualidade do tecido.")
elif categoria == "alimentos":
    print("Categoria: Alimentos.")
    if preco > 50:
        print("Produto gourmet.")
    else:
        print("Produto de consumo regular.")
    if avaliacao < 3.0:
        print("Atenção: Produto com baixa avaliação de consumidores.")
else:
    print("Categoria não reconhecida. Não é possível fazer uma recomendação.")

Execução com um eletrônico:

Digite a categoria do produto (eletrônicos, roupas, alimentos): eletrônicos
Digite o preço do produto: R$ 3500
Digite a avaliação do produto (0 a 5): 3.8

--- Classificação do Produto ---
Produto de médio valor.
Recomendação: Pesquise por promoções.

Execução com um alimento:

Digite a categoria do produto (eletrônicos, roupas, alimentos): alimentos
Digite o preço do produto: R$ 80
Digite a avaliação do produto (0 a 5): 2.5

--- Classificação do Produto ---
Categoria: Alimentos.
Produto gourmet.
Atenção: Produto com baixa avaliação de consumidores.

O if/elif/else externo separa o programa por categoria, e cada categoria tem as próprias decisões aninhadas. Nos eletrônicos, o programa testa primeiro o preço e, dentro de cada faixa, a avaliação. A condição 1000 <= preco <= 5000, na linha 13, verifica se o preço está entre os dois limites, incluindo ambos. Nas roupas, a ordem é a inversa: primeiro a avaliação, depois o preço.

Nos alimentos, há dois if independentes. O primeiro classifica pelo preço, e o segundo, sem else, executa sempre em seguida e só exibe o aviso quando a avaliação é baixa. Assim, um mesmo alimento pode receber as duas mensagens. O else final trata as categorias desconhecidas. Para acompanhar o programa, use a indentação como guia: cada nível de recuo corresponde a um nível de decisão.

Diagnóstico (diagnostico.py): Crie um programa que simule uma triagem médica simples por meio de perguntas de “sim” ou “não”, seguindo a árvore abaixo, e exiba o diagnóstico final.

  1. O paciente tem febre?
    • Se sim, o paciente tem tosse?
      • Se sim, o paciente tem dificuldade para respirar? Em caso afirmativo, o diagnóstico é “Alerta! Risco de condição respiratória grave.”; em caso negativo, “Pode ser uma gripe ou resfriado forte.”.
      • Se não, o paciente tem dor de cabeça forte? Em caso afirmativo, o diagnóstico é “Pode ser uma virose ou dengue.”; em caso negativo, “Febre sem outros sintomas claros.”.
    • Se não, o paciente tem dor no corpo? Em caso afirmativo, o diagnóstico é “Pode ser fadiga muscular ou estresse.”; em caso negativo, “Sintomas não indicam uma condição clara.”.
print("--- Sistema de Triagem Médica Simples ---")
print("Responda às perguntas com 'sim' ou 'não'.")
sintoma_febre = input("O paciente tem febre? ")
if sintoma_febre == "sim":
    sintoma_tosse = input("O paciente tem tosse? ")
    if sintoma_tosse == "sim":
        sintoma_dificuldade_respirar = input("O paciente tem dificuldade para respirar? ")
        if sintoma_dificuldade_respirar == "sim":
            print("Diagnóstico: Alerta! Risco de condição respiratória grave.")
            print("Procurar um médico imediatamente.")
        else:
            print("Diagnóstico: Pode ser uma gripe ou resfriado forte.")
            print("Recomenda-se observação e consulta médica se os sintomas piorarem.")
    else:
        sintoma_dor_cabeca = input("O paciente tem dor de cabeça forte? ")
        if sintoma_dor_cabeca == "sim":
            print("Diagnóstico: Pode ser uma virose ou dengue.")
            print("Monitorar e procurar um médico.")
        else:
            print("Diagnóstico: Febre sem outros sintomas claros.")
            print("Manter observação e hidratação.")
else:
    sintoma_dor_corpo = input("O paciente tem dor no corpo? ")
    if sintoma_dor_corpo == "sim":
        print("Diagnóstico: Pode ser fadiga muscular ou estresse.")
        print("Repouso é recomendado.")
    else:
        print("Diagnóstico: Sintomas não indicam uma condição clara.")
        print("Se o mal-estar persistir, consulte um médico.")

Exemplo de execução:

--- Sistema de Triagem Médica Simples ---
Responda às perguntas com 'sim' ou 'não'.
O paciente tem febre? sim
O paciente tem tosse? sim
O paciente tem dificuldade para respirar? nao
Diagnóstico: Pode ser uma gripe ou resfriado forte.
Recomenda-se observação e consulta médica se os sintomas piorarem.

O programa funciona como uma árvore de decisão. A primeira pergunta divide o atendimento em dois ramos, com febre e sem febre, e cada resposta seguinte escolhe um ramo menor, até chegar a um diagnóstico. Cada pergunta só é feita dentro do ramo correspondente: um paciente sem febre, por exemplo, responde apenas à primeira pergunta e à pergunta sobre dor no corpo.

Com tantos níveis, a indentação é o que mostra a que if cada else pertence. Procure o if alinhado na mesma coluna: o else da linha 22 pertence ao if da febre, na linha 4, e o else da linha 14 pertence ao if da tosse, na linha 6.


2.6 Alguns exemplos práticos

Aqui estão mais alguns exemplos que combinam as ideias anteriores para resolver problemas do mundo real e um desafio de engenharia.

Exemplos Práticos:

Aventura em texto (aventura_texto.py): Crie um mini jogo de aventura em texto em que as escolhas do jogador determinam o resultado.

  1. O jogador começa em uma bifurcação e escolhe “esquerda” ou “direita”.
    • Na esquerda, encontra uma cabana abandonada e escolhe “entrar” (fim de jogo, fantasma) ou “continuar” (fim de jogo, rio). Qualquer outra resposta também encerra o jogo (lobos).
    • Na direita, encontra uma fonte mágica e escolhe “beber” (vitória) ou “ignorar” (fim de jogo, escuridão). Qualquer outra resposta encerra o jogo (fonte seca).
  2. Se a primeira escolha for inválida, o jogo termina por indecisão.
print("--- Aventura na Floresta Sombria ---")
print("Você está em uma bifurcação na floresta. O caminho da esquerda parece mais escuro,")
print("enquanto o da direita tem um brilho fraco.")
escolha1 = input("Qual caminho você escolhe? (esquerda/direita): ")
if escolha1 == "esquerda":
    print("Você segue pelo caminho escuro. Após alguns minutos, encontra uma cabana abandonada.")
    escolha2 = input("Você decide entrar na cabana ou continuar pelo caminho? (entrar/continuar): ")
    if escolha2 == "entrar":
        print()
        print("Dentro da cabana, você encontra um baú. Ao abri-lo, um fantasma aparece!")
        print("FIM DE JOGO: Você foi assombrado.")
    elif escolha2 == "continuar":
        print()
        print("Você ignora a cabana e continua.")
        print("Mais à frente, o caminho termina em um rio largo e de correnteza forte.")
        print("FIM DE JOGO: Você não consegue atravessar.")
    else:
        print()
        print("Decisão inválida. A hesitação atraiu os lobos.")
        print("FIM DE JOGO: Você foi cercado.")
elif escolha1 == "direita":
    print()
    print("Você segue em direção ao brilho. Você encontra uma fonte mágica que emana a luz.")
    escolha3 = input("Você bebe da fonte ou a ignora? (beber/ignorar): ")
    if escolha3 == "beber":
        print()
        print("Ao beber a água, você se sente revigorado e ganha a habilidade de ver no escuro.")
        print("VITÓRIA: Você agora pode explorar a floresta com segurança!")
    elif escolha3 == "ignorar":
        print()
        print("Você decide não arriscar.")
        print("A fonte para de brilhar e a floresta fica completamente escura.")
        print("FIM DE JOGO: Você está perdido na escuridão.")
    else:
        print()
        print("Decisão inválida. A fonte interpreta sua indecisão como uma ofensa e seca.")
        print("FIM DE JOGO: Você perdeu sua chance.")
else:
    print()
    print("Você não conseguiu decidir. Ficou parado no mesmo lugar até a noite cair.")
    print("FIM DE JOGO: A floresta não perdoa a indecisão.")

Exemplo de execução:

--- Aventura na Floresta Sombria ---
Você está em uma bifurcação na floresta. O caminho da esquerda parece mais escuro,
enquanto o da direita tem um brilho fraco.
Qual caminho você escolhe? (esquerda/direita): direita

Você segue em direção ao brilho. Você encontra uma fonte mágica que emana a luz.
Você bebe da fonte ou a ignora? (beber/ignorar): beber

Ao beber a água, você se sente revigorado e ganha a habilidade de ver no escuro.
VITÓRIA: Você agora pode explorar a floresta com segurança!

A primeira escolha divide o jogo em dois caminhos, e cada caminho repete o mesmo padrão: descreve um cenário, faz uma nova pergunta e decide o final com um if/elif/else aninhado. Em todos os níveis, o else dá um desfecho para as respostas inválidas, de modo que o jogo sempre termina com uma mensagem, qualquer que seja a resposta. As chamadas print() sem argumentos exibem linhas em branco para separar os trechos da história.

Custo do frete (custo_frete.py): Crie um programa que peça o peso do pacote em kg (número decimal), a distância da entrega em km (número inteiro) e o método de envio (“normal”, “expresso” ou “prioritario”) e calcule o custo do frete em três etapas.

  1. Custo base por peso:
    • Até 1 kg: R$ 10,00.
    • De 1 a 5 kg: R$ 10,00 mais R$ 2,50 por kg acima de 1 kg.
    • Acima de 5 kg: R$ 20,00 mais R$ 3,75 (2,50 × 1,5) por kg acima de 5 kg.
  2. Adicional por distância:
    • Até 100 km: R$ 5,00.
    • De 101 a 500 km: R$ 20,00.
    • Acima de 500 km: R$ 50,00.
  3. Multiplicador por método de envio:
    • “normal”: sem acréscimo.
    • “expresso”: custo multiplicado por 1.5.
    • “prioritario”: custo multiplicado por 2.0.

Qualquer outro método é tratado como “normal”. O programa exibe o método de envio aplicado e, em seguida, um resumo com o peso, a distância e o custo final.

peso_kg = float(input("Digite o peso do pacote (kg): "))
distancia_km = int(input("Digite a distância da entrega (km): "))
metodo_envio = input("Digite o método de envio (normal, expresso, prioritario): ")
taxa_base_por_kg = 2.50
custo_frete = 0.0
if peso_kg <= 1:
    custo_frete = 10.0
elif 1 < peso_kg <= 5:
    custo_frete = 10.0 + (peso_kg - 1) * taxa_base_por_kg
else:
    custo_frete = 20.0 + (peso_kg - 5) * (taxa_base_por_kg * 1.5)
if distancia_km > 500:
    custo_frete = custo_frete + 50.0
elif 100 < distancia_km <= 500:
    custo_frete = custo_frete + 20.0
else:
    custo_frete = custo_frete + 5.0
if metodo_envio.lower() == "expresso":
    custo_frete = custo_frete * 1.5
    print("Método de Envio: Expresso (taxa de 50%)")
elif metodo_envio.lower() == "prioritario":
    custo_frete = custo_frete * 2.0
    print("Método de Envio: Prioritário (taxa de 100%)")
else:
    print("Método de Envio: Normal (sem taxa adicional)")
print()
print("Resumo do Custo:")
print(f"Peso: {peso_kg} kg")
print(f"Distância: {distancia_km} km")
print(f"Custo final do frete: R$ {custo_frete}")

Exemplo de execução:

Digite o peso do pacote (kg): 3
Digite a distância da entrega (km): 200
Digite o método de envio (normal, expresso, prioritario): expresso
Método de Envio: Expresso (taxa de 50%)

Resumo do Custo:
Peso: 3.0 kg
Distância: 200 km
Custo final do frete: R$ 52.5

O programa calcula o frete em três etapas, cada uma com um if/elif/else que atualiza a mesma variável custo_frete. A primeira etapa define o custo inicial pelo peso. Na linha 9, (peso_kg - 1) calcula quantos quilos passam de 1, e esse excesso é multiplicado pela taxa. A segunda etapa soma o adicional da distância com custo_frete = custo_frete + ..., que pega o valor atual, soma o adicional e guarda o resultado na mesma variável.

A terceira etapa aplica o multiplicador e informa o método de envio. O .lower() converte o texto digitado para minúsculas, de modo que Expresso e expresso são tratados da mesma forma, e o else trata qualquer outro texto como envio normal, sem alterar o custo. Com 3 kg, 200 km e envio expresso, o custo é (15.0 + 20.0) × 1.5 = 52.5.