Ir ao conteúdo
  • Cadastre-se

Diferença entre datas


Michaeldgs

Posts recomendados

Olá, estou com um problema na hora de concluir o meu programa, ele deverá calcular a diferença entre datas, mostrando o resultado em total de dias, meses e anos. O programa leva em consideração os anos bissextos, a quantidade de dias de cada mês. Foi dado como dicas: 1- retornar uma função que retorne a quantidade de dias do ano, identificando se é bissexto ou não. 2- montar uma função que calcule a quantidade de dias corridos do inicio do ano até as datas informadas. Meu problema é que na hora de somar os valores não correspondem ao que deveriam corresponder, por exemplo, 13/09/1993 e 20/05/2015, a diferença é de 7 dias, 8 meses e 21 anos, 14/10/2013 e 20/05/2015 a diferença é de 6 dias, 7 meses e 1 ano, porém o que a princípio está certo é parte dos dias e dos anos, porém os meses nunca dão exatos, ou dão negativos. Sendo if (dias>31){dias=0;meses++}; if (meses>13){meses=0;anos++;} segue o programa: 

 

#include <stdio.h>
#include <stdlib.h>
int reload,d1,d2,m1,m2,a1,a2,x1,x2,b1,b2,d28,d29,d30,d31,af,mf,df,total;
char quit;
int di1,di2,mi1,mi2;
/////////////////////////////////////////////////////////////////////////////////////////////////
int main ()
{
for (reload=0;;reload++)
{
printf ("TODOS OS DIREITOS RESERVADOS A MICHAEL DOUGLAS GOULART SILVA\n\n");
printf ("\tEste programa ira' calcular a diferenca entre duas datas,\nsendo elas validas apenas apos a invencao do calendario em 24/02/1582\n\n");
printf ("Insira a data no formato DD/MM/AAAA, sendo desde o ano 1582 ate' o ano 3000\n\n");
ano1: printf ("Ano Inicial:\t"); scanf ("%d",&a1); if ((a1<1582)||(a1>3000)) goto ano1; 
x1=a1/4; if (a1==(x1*4))
{
printf ("\tAno bissexto\n");
b1=1;
}
mes1: printf ("Mes Inicial:\t"); scanf ("%d",&m1); if ((m1<1)||(m1>12)) goto mes1;
switch (m1)
{
case 1:
dia1131: printf ("Dia Inicial:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>31)) goto dia1131;
break;
case 3:
dia1331: printf ("Dia Inicial:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>31)) goto dia1331;
break;
case 5:
dia1531: printf ("Dia Inicial:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>31)) goto dia1531;
break;
case 7:
dia1731: printf ("Dia Inicial:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>31)) goto dia1731;
break;
case 8:
dia1831: printf ("Dia Inicial:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>31)) goto dia1831;
break;
case 10:
dia11031: printf ("Dia Inicial:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>31)) goto dia11031;
break;
case 12:
dia11231: printf ("Dia Inicial:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>31)) goto dia11231;
break;
case 4:
dia1430: printf ("Dia Inicial:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>30)) goto dia1430;
break;
case 6:
dia1630: printf ("Dia Inicial:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>30)) goto dia1630;
break;
case 9:
dia1930: printf ("Dia Inicial:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>30)) goto dia1930;
break;
case 11:
dia11130: printf ("Dia Inicial:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>30)) goto dia11130;
break;
case 2:
if (b1==1)
{
dia129: printf ("Dia Inicial:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>29)) goto dia129;
break;
}
dia128: printf ("Dia Inicial:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>28)) goto dia128;
break;
 
}
printf ("---------------------------------------------------------------------\n");
printf ("Data Inicial:\t%d/%d/%d\n",d1,m1,a1);
printf ("=====================================================================\n");
ano2: printf ("Ano Final:\t"); scanf ("%d",&a2); if ((a2<1582)||(a2>3000)) goto ano2; 
x2=a2/4; if (a2==(x2*4))
{
printf ("\tAno bissexto\n");
b2=1;
}
mes2: printf ("Mes Final:\t"); scanf ("%d",&m2); if ((m2<1)||(m2>12)) goto mes2;
switch (m2)
{
case 1:
dia2131: printf ("Dia Final:\t"); scanf ("%d",&d2); if ((d2<1)||(d2>31)) goto dia2131;
break;
case 3:
dia2331: printf ("Dia Final:\t"); scanf ("%d",&d2); if ((d2<1)||(d2>31)) goto dia2331;
break;
case 5:
dia2531: printf ("Dia Final:\t"); scanf ("%d",&d2); if ((d2<1)||(d2>31)) goto dia2531;
break;
case 7:
dia2731: printf ("Dia Final:\t"); scanf ("%d",&d2); if ((d2<1)||(d2>31)) goto dia2731;
break;
case 8:
dia2831: printf ("Dia Final:\t"); scanf ("%d",&d2); if ((d2<1)||(d2>31)) goto dia2831;
break;
case 10:
dia21031: printf ("Dia Final:\t"); scanf ("%d",&d2); if ((d2<1)||(d2>31)) goto dia21031;
break;
case 12:
dia21231: printf ("Dia Final:\t"); scanf ("%d",&d2); if ((d2<1)||(d2>31)) goto dia21231;
break;
case 4:
dia2430: printf ("Dia Final:\t"); scanf ("%d",&d2); if ((d2<1)||(d2>30)) goto dia2430;
break;
case 6:
dia2630: printf ("Dia Final:\t"); scanf ("%d",&d2); if ((d2<1)||(d2>30)) goto dia2630;
break;
case 9:
dia2930: printf ("Dia Final:\t"); scanf ("%d",&d2); if ((d2<1)||(d2>30)) goto dia2930;
break;
case 11:
dia21130: printf ("Dia Final:\t"); scanf ("%d",&d2); if ((d2<1)||(d2>30)) goto dia21130;
break;
case 2:
if (b2==1)
{
dia229: printf ("Dia Final:\t"); scanf ("%d",&d2); if ((d2<1)||(d2>29)) goto dia229;
break;
}
dia228: printf ("Dia Final:\t"); scanf ("%d",&d1); if ((d1<1)||(d1>28)) goto dia228;
break;
}
printf ("--------------------------------------------------------------------\n");
printf ("Data Final:\t%d/%d/%d\n\n",d2,m2,a2);
if (a2==a1) af=a2-a1; else af= (a2-a1)-1; if ((m2==m1)&&(d2==d1)) af++; // 7 dias 8 meses e 21 anos 1993-2015
if (m2>=m1) mf=m2-m1; else mf= (m1-m2); // Minha duvida aparece aqui 0009-0005
if (d2>=d1) df=d2-d1; else df= mf+(d2-d1); // inicial-final 0013-0020
printf ("=====================================================================\n");
printf ("A diferenca entre as datas e' de %d dias, %d meses e %d anos\n",df,mf,af);
printf ("=====================================================================\n\n");
printf ("\t\t \"x\" para sair\n");
scanf ("%s",&quit);
if ((quit=='x')||(quit=='X')) break;
system ("cls");
}
}

a princípio acho que consegui corrigir modificando algumas das linhas finais
 
 
if (m2>=m1) mf=m2-m1; else mf= 12-(m1-m2);
if (d2>=d1) df=d2-d1; else df= 30-(d2-d1);
 
 
será que alguém tem como dar uma verificada com outras datas?
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...