Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Thiago Retondar

Comparar duas datas e exibir a quantidade de anos, meses e dias

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você poderia transformar ambas as datas em períodos de dias, subtraindo do ano algum valor (como 1900), subtrair o menor valor do maior e converter em dia, mês e ano. Parece difícil mas é a forma mais simples.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.