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?
Obrigada =)

Responder Tópico
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 ) 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
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 ) 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 ).

Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.