Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Faça como eu fiz: calculando a idade

Resolvendo o exercício proposto:

#Questão 1: Julia é professora e precisa de um programa para ajudar seus alunos a calcularem suas idades

ano_nascimento = int(input("Digite o ano em que você nasceu: "))

from datetime import date
def ano_atual():
  return date.today().year

ano_atual = ano_atual()
idade = ano_atual - ano_nascimento
print (f"Você tem {idade} anos de idade!")

Mas assim ficaria mais interessante:

#Questão 1: Julia é professora e precisa de um programa para ajudar seus alunos a calcularem suas idades

from datetime import date, datetime

data_nascimento_texto = input("Digite sua data de nascimento no formato DD/MM/AAAA: ")

data_nascimento = datetime.strptime(data_nascimento_texto, "%d/%m/%Y").date()

hoje = date.today()

idade = hoje.year - data_nascimento.year

if (hoje.month, hoje.day) < (data_nascimento.month, data_nascimento.day):
    idade -= 1

print(f"Você tem {idade} anos de idade!")
2 respostas

Olá, Estudante. Como vai?

A sua evolução de código ficou simplesmente espetacular! Você tocou no ponto exato que diferencia um script simples de um sistema real e maduro.

No primeiro código, subtrair apenas os anos ($2026 - 2000$, por exemplo) gera uma "idade aproximada". Se a pessoa nasceu em dezembro e estamos em maio, o cálculo simples diria que ela já fez aniversário, o que é um erro clássico de lógica em sistemas de cadastro.

No seu segundo código, você resolveu isso com maestria utilizando a biblioteca datetime e o método strptime para converter o texto em uma data real. A grande sacada do seu projeto foi esta linha:

if (hoje.month, hoje.day) < (data_nascimento.month, data_nascimento.day):
    idade -= 1

No Python, quando comparamos duas tuplas, ele compara o primeiro elemento (month). Se forem iguais, ele compara o segundo (day). Isso significa que a sua condição verifica com precisão milimétrica se o mês e o dia atuais ainda não alcançaram o mês e o dia do nascimento. Se não alcançaram, o sistema subtrai 1 ano corretamente. Perfeito!

Para agregar ainda mais valor ao seu exercício e alinhar o seu projeto com o tema central deste capítulo (que é o uso de funções), o ideal agora seria encapsular toda essa lógica inteligente dentro de uma função reaproveitável. Dessa forma, se a professora Julia precisar calcular a idade de 30 alunos de uma vez, ela não precisa repetir o código; basta chamar a função dentro de um laço.

Veja esta sugestão de como estruturar o seu código em formato de função, adicionando também um tratamento de erro (try/except) caso o aluno digite a data em um formato incorreto:

from datetime import date, datetime

def calcular_idade_exata(data_nascimento_str):
    try:
        # Converte a string digitada para o formato de data
        data_nascimento = datetime.strptime(data_nascimento_str, "%d/%m/%Y").date()
        hoje = date.today()
        
        # Cálculo inicial baseado no ano
        idade = hoje.year - data_nascimento.year
        
        # Ajuste preciso caso ainda não tenha feito aniversário no ano atual
        if (hoje.month, hoje.day) < (data_nascimento.month, data_nascimento.day):
            idade -= 1
            
        return idade
    except ValueError:
        # Retorna None se o formato da data estiver errado
        return None

# --- Fluxo Principal ---
data_texto = input("Digite sua data de nascimento no formato DD/MM/AAAA: ")
resultado_idade = calcular_idade_exata(data_texto)

if resultado_idade is not None:
    print(f"Você tem {resultado_idade} anos de idade!")
else:
    print("Erro: Por favor, digite a data corretamente utilizando barras (ex: 20/05/2010).")

Transformar blocos de código em funções independentes e seguras é uma das habilidades mais valorizadas no desenvolvimento de software, pois torna o seu sistema modular e fácil de manter.

Parabéns pelo excelente raciocínio lógico e pelo uso avançado da biblioteca de datas do Python!

Espero que possa ter lhe ajudado!

solução!

Obrigado pelo feedback e pelas dicas!