Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

rexxar

DUVIDA: contar os dias entre duas datas !!

Mensagens Recomendadas

rexxar

boas pessoal.. o meu objectivo é dadas 2 datas conseguir saber quantos dias passaram entre elas..

ou seja por exemplo quantos dias tenho de vida.. etc..

tenho andado as voltas com o algoritmo e acabo sempre com um monte de erros..

isto é o que tenho agora:


// quantidade de anos
if(mes1<mes2) ano=(ano1-ano2)-1;
else ano=ano1-ano2;		//mes 2 menor
        if (ano<=0)ano=0;

//quantidade de meses
if(ano1>ano2)mes=12-mes2+mes1;
else mes=mes2;
mes=mes+12*ano;

//quantidade de dias
if (mes1<mes2)
meses=(12-mes1)+(12-mes2)+mes;
else meses=mes1-mes2+mes;
dia=30*meses+5*ano; // fevereiro com 28 dias e 7 meses com 31dias

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Tens de calcular os dias todos que esse ano tem, desde o inicial até ao final do ano (tens de verificar quantos dias tem cada mês, anos bissextos, etc.) e depois fazer o mesmo para o resto dos anos.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Isso é algum trabalho da escola? É que já é o segundo em poucos dias...

No outro tópico deixei a solução toda em C, mas levei logo na tarraqueta. Por um lado, ainda bem que apaguei a solução, porque até tinha erros; e consegui chegar a um algoritmo bastante melhor.

Não tentes calcular logo o número de dias entre duas datas - calcula o número de dias desde o ano 0 para cada uma, e depois subtrais uma pela outra.

Tem cuidado - muito cuidado - com os anos bissextos. A primeira pista que te dou é que o dia da bissextalidade (29 de Fevereiro) é num dia mesmo, mesmo, chato. Se fosse no fim do ano era muito mais fácil fazer as contas...  :biggrin:


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rexxar

lol.. bem umas respostas que mais parecem a "casa ao tesouro" ;D lol..

mas bem ja e uma ajuda.. vou bater mais uma beca no pc.. pode ser que saia alguma coisa!! lol

mas digo ja que estou com problemas e para calcular o numero de dias do mes.. como faco se para saber quantos dias passaram ate maio ou ate novembro..etc..

obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

Acho que por coincidência, também tenho um work assim pra faculdade, a ser entregue mto brevemente.

Quanto a calcular os dias do mês no mesmo ano é relativamente fácil. Usas o ciclo "for".

Ex:

for (i=mes1+1; i<=mes2-1; i++){
                    dm += mes[i]; }
     dm1 = mes[mes1] - dia1;
     dias = dm + dm1;
     return dias;

Atenção: Utiliza isso caso tenhas declarado um vector de 13 elementos cujas posições correspondem ao número de dias do mês.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado
lol.. bem umas respostas que mais parecem a "casa ao tesouro" ;D lol..

Claro, noutro tópico semelhante meti a minha implementação completa, veio logo o moderador aqui da zona dar-me na cabeça. A partir de agora, é assim: sei muito, mas não posso dizer; temos pena.

Há várias maneiras do gato ir às filhoses, certo? Mas pensem assim: ciclos são inimigos da performance. O ideal é conseguir fazer o problema todo sem ciclos.

E vejam bem esta pista que já dei ali atrás: o dia da bissextalidade (29 de Fevereiro) é num dia mesmo, mesmo, chato. Se fosse no fim do ano era muito mais fácil fazer as contas...


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Gimme a break. Agora não vais transformar todas as dúvidas em enigmas, pois não?

Podes ajudar, sem dar a solução.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Gimme a break. Agora não vais transformar todas as dúvidas em enigmas, pois não?

Podes ajudar, sem dar a solução.

Quase impossível, a solução tem três linhas. Mas be my guest.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rexxar

pessoal  nada de zangas..

com ou sem mapa do tesouro ja consegui acabar..

esta uma linguagem esparguete mas serve ;D

a dica de relacionar com ano 0 foi mt boa..

a outra do ano bisexto nao percebi!!!!

o ciclo tb me parece bem.. mas eu fiz assim:

conta_dias_mes(int *dia,int *mes,int *ano)
{
    int a=0,dias=0;
    if((*ano%4==0)&&(*ano%100!=0) || (*ano%400==0))a=29; // ano bissexto e fev tem 29 dias
    else a=28;
    switch(*mes)
{
	case 12: dias=30;
	case 11: dias=dias+31;
	case 10: dias=dias+30;
	case 9: dias=dias+31;
	case 8: dias=dias+31;
	case 7: dias=dias+30;
	case 6: dias=dias+31;
	case 5: dias=dias+30;
	case 4: dias=dias+31;
	case 3: dias=dias+a;
	case 2: dias=dias+31;
	case 1: dias=dias;
}
return dias;
}

assim conto os dias desde o inicio do ano até ao mes..

depois e so somar o dia e somar os dias dos anos passados..

brigadao..

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado
a dica de relacionar com ano 0 foi mt boa..

a outra do ano bisexto nao percebi!!!!

Lá está, rexxar, para calculares a partir do ano 0, tens de saber quantos anos bissextos apanhas pelo caminho. As duas coisas estão relacionadas. Mas lá está, se a performance não está em causa, é só iterar pelos anos todos a testar a bissextalidade e ir somando os que se encontrarem. É assim que estás a fazer, não é?


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

pessoal  nada de zangas..

com ou sem mapa do tesouro ja consegui acabar..

esta uma linguagem esparguete mas serve ;D

a dica de relacionar com ano 0 foi mt boa..

a outra do ano bisexto nao percebi!!!!

o ciclo tb me parece bem.. mas eu fiz assim:

conta_dias_mes(int *dia,int *mes,int *ano)
{
    int a=0,dias=0;
    if((*ano%4==0)&&(*ano%100!=0) || (*ano%400==0))a=29; // ano bissexto e fev tem 29 dias
    else a=28;
    switch(*mes)
{
	case 12: dias=30;
	case 11: dias=dias+31;
	case 10: dias=dias+30;
	case 9: dias=dias+31;
	case 8: dias=dias+31;
	case 7: dias=dias+30;
	case 6: dias=dias+31;
	case 5: dias=dias+30;
	case 4: dias=dias+31;
	case 3: dias=dias+a;
	case 2: dias=dias+31;
	case 1: dias=dias;
}
return dias;
}

assim conto os dias do mes..

brigadao..

Não confundas uma coisa com a outra. Ninguém se zangou, as coisas são mesmo assim  :P


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rexxar

tipo em cada 5 anos que passam 1 deles e bisexto, entao dividi a quantidade de anos por 5.. e somei aos dias totais.

assim :

dias_ano=(365*ano)+ano/5;

pareceu m que o raciocinio esta correto

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

tipo em cada 5 anos que passam 1 deles e bisexto, entao dividi a quantidade de anos por 5.. e somei aos dias totais.

assim :

dias_ano=(365*ano)+ano/5;

pareceu m que o raciocinio esta correto

Quase...

Em primeiro lugar, não são cinco, são só quatro (atão, pá?).

Depois, essa regra é mais ou menos comum, mas não está completa. A cada 100 anos há um que era suposto ser bissexto, mas na realidade não é. Para além disso, a cada 400, há um que é suposto não ser pela regra anterior, mas é mesmo.

Então,

dias_ano = (365 * ano) + ano / 4 - ano / 100 + ano / 400;

Mas se fizeres alguns testes com uma aplicação que calcule distâncias entre datas, vais chegar à conclusão que ainda não está mesmo na batata, ainda vais falhar por um ou dois dias nalguns testes. O problema aqui é quando a data que estás a contabilizar é num ano bissexto, dependendo se é antes ou depois do dia 29 de Fevereiro - e se a data for o próprio dia 29, então estás mesmo enterrado.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rexxar
não são cinco, são só quatro

tipo podem passar 4 anos e nenhum deles ser bisexto..

por isso e que utilizei o 5..

quanto ao 100 e ao 400 nao sabia que eram excepçoes..

ate agora o programa esta a correr bem.. o problema do dia 29 resolvi com o switch que ja apresentei a bocadito..

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

tipo podem passar 4 anos e nenhum deles ser bisexto..

por isso e que utilizei o 5..

quanto ao 100 e ao 400 nao sabia que eram excepçoes..

ate agora o programa esta a correr bem.. o problema do dia 29 resolvi com o switch que ja apresentei a bocadito..

Se passares por quatro "Fevereiros", há um, de certeza absoluta, que tem dia 29...  :) A menos que seja um ano "100" e não seja um ano "400".

Mas testa isso intensivamente. Se tiveres o Windows 7, a calculadora nova tem funções de datas.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rexxar

ok ja percebi!! nepia nao tenho o windows 7.. tenho linux - ubuntu!!

ja acabei nao mexi mais..

ja estou a fazer o relatorio!!

obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
citadp

Boas pessoal. Tenho um programa para fazer parecido a este, após horas ontem a fio só consegui fazer este programa que calculava um mês, mas n era nada disto.

O que queria era após inserir data de nascimento exemplo 15 10 2011 e mes e ano a analisar  por exemplo12 2011, daria os dias que passaram até ao 1º dia do mês de dezembro. que daria 46 dias, porque contamos desde dia 15 até 1 de novembro.

#include <stdio.h>

int main (void){

int ano;
int mes;
int dia;

printf ("Introduza o dia, mes e ano, separados por espaços:\n");
scanf ("%d%d%d", &dia, &mes, &ano);

if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12)
  printf ("%d dias \n", 32-dia);
   else
     if (mes !=2)
     printf ("%d dias\n", 31-dia);
      else
       if (ano %4 == 0)
        printf("%d dias\n",30-dia);
        else
        printf("%d dias\n", 29-dia);

return 0;
} 

Após pesquisar neste forum tentei juntar o que vi aqui...

#include <stdio.h>

int conta_dias_mes(int dia,int mes,int ano);

int main (void){

int ano;
int mes;
int dia;
int mesAnalisar;
int anoAnalisar;

printf ("Introduza o dia, mes e ano, separados por espaços e a data a analisar:\n");
scanf ("%d%d%d", &dia, &mes, &ano, &mesAnalisar, &anoAnalisar);
printf (" %d dias", conta_dias_mes(dia,mes,ano));

return 0;
} 

conta_dias_mes(int dia,int mes,int ano)
{
    int a=0,dias=0;
    if((ano%4==0)&&(ano%100!=0) || (ano%400==0))a=29; 
    else a=28;
    switch(mes)
        {
                case 12: dias=30;
                case 11: dias=dias+31;
                case 10: dias=dias+30;
                case 9: dias=dias+31;
                case 8: dias=dias+31;
                case 7: dias=dias+30;
                case 6: dias=dias+31;
                case 5: dias=dias+30;
                case 4: dias=dias+31;
                case 3: dias=dias+a;
                case 2: dias=dias+31;
                case 1: dias=dias;
        }
        return dias;

mas aqui conta os dias desde o inicio do ano...

alguem me pode ajudar ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger

Para quem tiver estes problemas em exercício de universidade, é valorizado o algorítmo, logo tentem fazer de acordo com o que outros já falaram por aqui.

Se alguém precisar de uma solução que não obrigue a implementar o algoritmo, existem bibliotecas em Linux que vos podem ajudar muito.

Primeiro existe um tipo de dados time_t, que vos indica o número de segundos que passaram desde 1 de Janeiro de 1970.

Segundo existe uma estrutura: struct tm, que representa uma data com todos os campos (dia, ano, mes, hora minuto, segundos, e mais alguns). Existem funções que fazem a conversão de um para o outro e vocês podem fazer operações algébricas com eles.

Algumas funções úteis:

http://www.manpagez.com/man/3/difftime/

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.