Comparar duas datas e exibir a quantidade de anos, meses e dias
Olá a todos!
Estou com um exercício sobre datas, no qual é informado duas datas (no estilo dd/mm/aaaa) e, através dessas duas datas eu preciso gerar um saída indicando na ordem a quantidade de anos, meses e dias que há entre as datas.
Um exemplo de entrada e suas respectivas saídas:
>
8
29/02/2000 01/03/2001 1 0 1
29/02/2000 28/02/2001 1 0 0
29/12/2012 13/01/2013 0 0 5
27/05/2012 27/05/2013 1 0 0
01/01/2012 05/01/2013 1 0 4
13/05/1966 05/02/2015 48 8 23
29/02/2003 4/05/2012 data invalida
14/13/1995 7/8/1996 data invalida
A primeira linhas representa a quantidade de testes que será feito.
O que eu já tenho até agora:
#include <stdio.h>
#define TRUE 1
#define FALSE 0
/ Reutilização de funções já criadas em outros exercícios para verificar datas /
int validaData( int, int, int ); / Função criada para o exercício data -> modificada /
int bissexto( int ); / Função criada para o exercício bissexto /
int dias_meses( int, int ); / Função criada para o exercício data /
int main()
{
int datas; scanf("%d", &datas);
int dias_totais;
int d1, d2, m1, m2, a1, a2;
int anos, meses, dias;
while( datas-- )
{
scanf("%d/%d/%d %d/%d/%d", &d1, &m1, &a1, &d2, &m2, &a2);
if( !(validaData(d1, m1, a1) && validaData( d2, m2, a2 )) || a1 > a2 )
printf("%s\n", "data invalida");
else {
if(m1 == 2 && d1 == 29) d1 == 28; /* Se a pessoa nasceu no dia 29/02, considerar como sendo 28/02 */
/*...*/
}
}
}
/*
Recebe como primeiro argumento um caractere que
será responsável por determinar quais cargas de testes
serão feitas para determinar se uma data é ou não
válida para aquela nação. A data é recebida "quebrada"
em três variáveis
*/
int validaData( int dia, int mes, int ano )
{
/ (dia/mês/ano, modelo comum no Brasil) /
if( (dia >= 1 && dia <= dias_meses(ano, mes)) && (mes >= 1 && mes <= 12) )
return TRUE;
return FALSE;
}
/*
Recebe ano como entrada e devolve uma expressão
booleana se este é verdadeiro ou falso
*/
int bissexto(int ano)
{
return ( ( ano % 4 == 0 ) && ( ano % 400 == 0 || ano % 100 != 0 ) );
}
/*
Recebe como primeiro argumnto o ano (para verificação de ano bissexto)
e como segundo argumento o mês que se deseja saber a quantidade de dias.
*Faz uso da função "bissexto".
*/
int dias_meses(int ano, int mes)
{
int dias;
switch(mes)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
dias = 31;
break;
case 4: case 6: case 9: case 11:
dias = 30;
break;
case 2:
if( bissexto(ano) )
dias = 29;
else if( !bissexto(ano) )
dias = 28;
break;
}
return dias;
}
Gostaria se alguém pudesse ajudar com alguma dica indicando um caminho para eu descobrir essa diferença.
Obrigado desde já!
P.S.: Eu havia feito uma outra versão, no qual a maioria dos testes disponibilizados funcionavam, mas estava um código porco, com muitas gambiarras e estava impossível de manutenção.
Discussão (1)
Carregando comentários...