1
resposta

Desafio: Hora da Prática - Estrutura de Dados

Durante o meu estudo no capítulo sobre Estruturas de Dados, tive muita dificuldade na resolução da atividade 6 da Hora da Prática.

"6) Escreva um programa que peça uma data informando o dia, mês e ano e determine se ela é válida para uma análise."

Depois de quebrar a cabeça por bastante tempo, e não ter conseguido chegar a uma solução, optei por consultar a "Opinião do Instrutor".

No entanto, ainda não ficou claro o suficiente pra mim o método utilizado. Minha dúvida se concentrou principalmente no trecho do código, onde é criada uma lógica para determinar se o ano é bissexto ou não.

1 resposta

Oi Caio, Tudo bem?

Essa parte do código realmente costuma gerar dúvida, principalmente porque a regra de ano bissexto não é tão intuitiva à primeira vista. Vou explicar a lógica usada no gabarito de forma mais direta.
Analisando o código:

if ano % 4 == 0 and (ano % 400 == 0 or ano % 100 != 0):
    dias_fevereiro = 29
else:
    dias_fevereiro = 28

Para um ano ser bissexto, ele precisa passar por um "filtro" de três regras:

  1. Regra Básica: Deve ser divisível por 4.

  2. A Exceção: Se for divisível por 100, ele não é bissexto...

  3. A Exceção da Exceção: ...a menos que ele também seja divisível por 400.

Agora vamos interpretar a condição.

ano % 4 == 0
Verifica se o ano é divisível por 4. O operador % retorna o resto da divisão. Se o resto é 0, significa que o número é divisível.

Depois vem:

(ano % 400 == 0 or ano % 100 != 0)

Aqui temos duas possibilidades:

  • O ano é divisível por 400
    ou
  • O ano não é divisível por 100

E tudo isso está ligado ao primeiro teste com and, ou seja, todas essas regras precisam ser respeitadas ao mesmo tempo.

Alguns exemplos ajudam bastante:

2024

  • Divisível por 4 ✔️
  • Não divisível por 100 ✔️
    → Bissexto

1900

  • Divisível por 4 ✔️
  • Divisível por 100 ✔️
  • Não divisível por 400 ❌
    → Não é bissexto

2000

  • Divisível por 4 ✔️
  • Divisível por 100 ✔️
  • Divisível por 400 ✔️
    → Bissexto

Ou seja, o código está apenas transformando a regra matemática em uma expressão lógica com and e or.

Se te ajudar a visualizar melhor, essa mesma lógica poderia ser escrita separando as condições:

div4 = ano % 4 == 0
div100 = ano % 100 == 0
div400 = ano % 400 == 0

if div4 and (div400 or not div100):
    dias_fevereiro = 29
else:
    dias_fevereiro = 28

Fica exatamente igual em funcionamento, apenas coloquei em partes separadas para ajudar na compreensão.

Espero ter ajudado.

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!