Leia uma data de nascimento de uma pessoa fornecida através de três números inteiros: Dia, Mês e Ano. Teste a validade desta data para saber se esta é uma data válida. Teste se o dia fornecido é um dia válido: dia
, dia
para o mês de fevereiro ( 29 se o ano for bissexto), dia
em abril, junho, setembro e novembro, dia
nos outros meses. Teste a validade do mês: mês
e mês
. Teste a validade do ano: ano
ano atual (use uma constante definida com o valor igual a 2008). Imprimir: “data válida” ou “data inválida” no final da execução do programa.
Passo 1
Resumo: a gente precisa verificar se uma data (dia, mês, ano) é válida segundo as regras de calendário (meses com 28/29/30/31 dias e ano ≤ 2008). Vamos usar lógica de teste de intervalo e checar ano bissexto para fevereiro.
Passo 2
Validar o mês antes de mais nada: testar se o mês está entre 1 e 12. Se não estiver, já sabemos que a data é inválida.
Passo 3
Validar o ano: checar se o ano é menor ou igual a uma constante ANO_ATUAL = 2008. Se for maior, a data é inválida.
Passo 4
Determinar se o ano é bissexto. Uma data em fevereiro pode ter 29 dias somente em ano bissexto, definido por: ano é bissexto se
ou
Passo 5
Definir o número máximo de dias do mês (diasMax):
- Para fevereiro: diasMax = 29 se bissexto, senão diasMax = 28.
- Para abril, junho, setembro e novembro: diasMax = 30.
- Para os outros meses (1, 3, 5, 7, 8, 10, 12): diasMax = 31.
Passo 6
Validar o dia: testar se dia ≥ 1 e dia ≤ diasMax. Se falhar, a data é inválida; caso contrário, é válida.
Passo 7
Imprimir o resultado final: “data válida” se todas as checagens passaram, ou “data inválida” caso alguma falha tenha ocorrido.
Resposta
Algoritmo em pseudo-código:
CONSTANTE ANO_ATUAL ← 2008
Ler dia, mês, ano
// Verifica mês válido
Se (mês < 1) ou (mês > 12) então
Imprimir "data inválida"
Parar
Fim se
// Verifica ano válido
Se (ano > ANO_ATUAL) então
Imprimir "data inválida"
Parar
Fim se
// Checa bissexto
bissexto ← (ano mod 400 = 0) ou ((ano mod 4 = 0) e (ano mod 100 ≠ 0))
// Define dias máximos no mês
Se mês = 2 então
Se bissexto então diasMax ← 29 senão diasMax ← 28
Senao Se mês ∈ {4,6,9,11} então
diasMax ← 30
Senao
diasMax ← 31
Fim se
// Verifica dia válido
Se (dia < 1) ou (dia > diasMax) então
Imprimir "data inválida"
Senao
Imprimir "data válida"
Fim se