Logo Hardware.com.br
utopia123
utopia123 Novo Membro Registrado
2 Mensagens 0 Curtidas

Programa em C para calculo de dias entre duas datas

#1 Por utopia123 18/08/2010 - 20:05
Olá,
O problema eh o seguinte: O usuario digita 2 datas ( sendo que a segunda deve ser 'maior' q a primeira ) . Aí o programa deve calcular o numero de dias entre essas 2 datas. O mês é considerado com 30 dias, menos o mês de fevereiro, que deve ter 28 dias. Além disso, em anos bissextos, o mês de fevereiro deve conter 29 dias.

Fiz o código, mas tou com um problema... Nas datas de teste que coloquei , 1/1/2004 e 1/3/2004 era pra dar 59 dias, ma no meu programa tá dando 60. Ou seja, ele n tá considerando os 29 dias de fevereiro do ano bissexto.



#include
#include

int main () {

int dia [2];
int mes [2];
int ano [2];
int i;
int totaldias;
int anot,mest,diat;

for (i=0;i<2;i++)
{
printf("Digite o dia:\n");
scanf("%d",&dia[i]);
printf("Digite o mes:\n");
scanf("%d",&mes[i]);
printf("Digite o ano:\n");
scanf("%d",&ano[i]);

if (mes[i] == 2 || mes[i] == 02 && ano[i] % 4 == 0)
{
mes[i] = mes[i]*29;
}

if (ano[i] % 4 == 0)
{
ano[i] = ano[i]*366;
} else {
ano[i] = ano[i]*365;
}
if (mes[i] == 2 || mes[i] == 02)
{
mes[i] = mes[i]*28;

} else {

mes[i] = mes[i]*30;

}

aux = mes [i]

}

anot = ano[1] - ano[0];
mest = mes[1] - mes[0];
diat = dia[1] - dia[0];

totaldias = anot + mest + diat;

printf("Dias decorridos: %d \n",totaldias);

return 0;
}



Alguem pode me ajudar a resolver isso? de_olho.gif
Obrigada =)
Responder
utopia123
utopia123 Novo Membro Registrado
2 Mensagens 0 Curtidas
#2 Por utopia123
18/08/2010 - 20:08
Ah, para o cod. ficar mais legivel...



#include <stdio.h>
#include <stdlib.h>

int main () {

int dia [2];
int mes [2];
int ano [2];
int i;
int totaldias;
int anot,mest,diat;

for (i=0;i<2;i++)
{
printf("Digite o dia:\n&quot;
scanf("%d",&dia[i]);
printf("Digite o mes:\n&quot;
scanf("%d",&mes[i]);
printf("Digite o ano:\n&quot;
scanf("%d",&ano[i]);

if (mes[i] == 2 || mes[i] == 02 && ano[i] % 4 == 0)
{
mes[i] = mes[i]*29;
}

if (ano[i] % 4 == 0)
{
ano[i] = ano[i]*366;
} else {
ano[i] = ano[i]*365;
}
if (mes[i] == 2 || mes[i] == 02)
{
mes[i] = mes[i]*28;

} else {

mes[i] = mes[i]*30;

}

aux = mes [i]

}

anot = ano[1] - ano[0];
mest = mes[1] - mes[0];
diat = dia[1] - dia[0];

totaldias = anot + mest + diat;

printf("Dias decorridos: %d \n",totaldias);

return 0;
}

BHB
BHB Membro Junior Registrado
110 Mensagens 6 Curtidas
#3 Por BHB
18/08/2010 - 21:22
Utopia123,
Vc faz o condicional para o ano bissexto e multiplica mes[i] por 29, + depois vc multiplica por 28:

if (mes[i] == 2 || mes[i] == 02 && ano[i] % 4 == 0)
{
mes[i] = mes[i]*29;
}

(...)

if (mes[i] == 2 || mes[i] == 02)
{
mes[i] = mes[i]*28;
}
Então o mês 2 (ou 02 stick_out_tongue.png) vai ter sempre 28 dias. Move o promeiro if para o final dos if's que deve dar certo.
Uma outra coisa...
if (mes[i] == 2 || mes[i] == 02 && ano[i] % 4 == 0)
Acho que deveria ser if ((mes[i] == 2 || mes[i] == 02) && ano[i] % 4 == 0)
E... não tem mês de 31 dias não? :x
O resultado é 60 mesmo, janeiro tem 21 e fevereiro 29 stick_out_tongue.png
Bom, + não é só aí o erro não...
vc considera janeiro com 30 e fevereiro com 28, então o resultado deveria ser 58?!
O que acontece é q vc só considera fevereiro com 28 dias se o usuário entrar com fevereiro. se o usuário entra com janeiro e março a conta q vc faz é 3x30 - 1x30 q é como se tivesse passado 2 meses de 30 dias.
Acho que o mais fácil pra vc fazer agora é definir um vetor no começo com todos os meses tipo
int meses[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
aí vc lê as entradas do usuário normalmente e corrige fevereiro se for necessário (lembra q fevereiro vai ser meses[1]).
daí vc faz um loop só entre os meses de entrada, tipo for (i = mes[0]; i < mes[1]; i++) e vai somando os valores de meses[i]. Depois para os dias vc vai ter q voltar a consultar o meses[] e fazer duas diferenças pra somar (+ essa já não vai de graça stick_out_tongue.png) e para a diferença dos dias nos anos vc tem q ver não só se os anos são bissexto, mas também quantos anos bissextos tem entre eles (tb fica de homework stick_out_tongue.png).
punk.gif
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#4 Por tpcvasco
18/08/2010 - 21:49
Esses tópicos podem te ajudar bastante
https://www.hardware.com.br/comunidade/entender-dia/883496/
https://www.hardware.com.br/comunidade/descobrir-dias/226116/

Considerar q todos os meses têm 30 dias (na vida real, alguns têm 31) já facilita bastante os cálculos.
"Milhouse: - Médicos e bombeiros são heróis.
Bart Simpson: - Olha, as casas continuam pegando fogo e as pessoas continuam doentes. Os verdadeiros heróis são os Schwarzenegger's, os Stallone's, e, em menores proporções, os Vandame's..."
Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal