Ir para conteúdo

POWERED BY:

Arquivado

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

jsfrocha

Cálculo de datas em C

Recommended Posts

Boas,

 

Estou com uma dificuldade a nível aqui de um código que preciso de fazer para universidade, e cheguei a um ponto onde tenho um brain-freeze :angry:

#include <stdio.h>






int main(){
   int ano, dia1, mes1, dia2, mes2, calc1, bissexto;
   unsigned int difmes;

   bissexto == 0
   printf("Escreva o ano: ");
   scanf("%d", &ano);
   if (ano%4==0 && (ano%100!=0 || ano%400==0)){ /* Verificação Bissexto */
      printf("O ano introduzido e bissexto.\n");
      bissexto=1;
      }
   printf("Escreva a primeira data: ");
   scanf("%d %d", &dia1, &mes1);
   printf("Escreva a segunda data: ");
   scanf("%d %d", &dia2, &mes2);
   if (mes1%2 == 0 && mes1 != 1 && mes1 != 2) /* Meses Pares Excepto Fev */
      calc1 = 31 - dia1;
      else if (mes1%2 != 0) /* Meses Impares */
           calc1 = 30 - dia1;
           else if (mes1 == 2 && bissexto == 1)
                calc1 = 29 - dia1;
                else if (mes1 == 2 && bissexto == 0)
                     calc1 = 28 - dia1;

   difmes=mes1-mes2;





   system("PAUSE");
}

 

Eu preciso de calcular a diferença (em dias) entre duas datas, e além disso, verificar se o ano é bissexto para saber quantos dias tem Fevereiro, o que já fiz.

Tem de ser mantido simples, sem usar a biblioteca "time", portanto o que eu pensei foi calcular a diferença entre o 1º dia e o fim desse mes, e depois com "difmes" calcular quantos meses são até chegar ao ultimo.

 

O que eu não estou a conseguir chegar é como faço para somar os dias dos meses que conta difmes por exemplo 31+28+31+30 etc, não estou a chegar lá como faço isso em código.

 

A minha ideia seria somar esses e depois adicionar o dia2, o que fazia a soma de dias total.

 

Se alguem me puder ajudar, agradeço =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já penso em fazer um for com uma variavel recebendo o primeiro mês e o for continua ate o mes1<=mes2, dentro desse for faz um if pra ver se o mês tem 30 ou 31 dias, vai somando em uma variavel.

 

Não sei se consegui explicar direito, mas seria mais ou menos isso:

aux = mes1
for(;aux <= mes2; aux++)
{
    //if para verificar se mes tem 30 ou 31 dias.
    //variavel que vai acumulando os dias acrescentada de 30 ou 31 dias.
}

Deu pra sacar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já penso em fazer um for com uma variavel recebendo o primeiro mês e o for continua ate o mes1<=mes2, dentro desse for faz um if pra ver se o mês tem 30 ou 31 dias, vai somando em uma variavel.

 

Não sei se consegui explicar direito, mas seria mais ou menos isso:

aux = mes1
for(;aux <= mes2; aux++)
{
    //if para verificar se mes tem 30 ou 31 dias.
    //variavel que vai acumulando os dias acrescentada de 30 ou 31 dias.
}

Deu pra sacar?

 

Já consegui ultrapassar a barreira.. até agora tenho isto:

#include <stdio.h>

int main(){
   int ano, dia1, mes1, dia2, mes2, calc1, bissexto, i, totaldias, totalmes;
   int verifdia1, verifdia2, verifmes1, verifmes2;
   unsigned int difmes;
   int meses[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

   bissexto = 0;

   do {
   ano = 1583;
   printf("Escreva o ano: ");
   scanf("%d", &ano);
   if (ano%4==0 && (ano%100!=0 || ano%400==0)){ /* Verificação Bissexto */
      printf("O ano introduzido e bissexto.\n");
      bissexto=1;
      }
      if (ano<1582) {
           printf("Introduza um ano maior que 1582\n");
      }

   } while (ano<1582);

   do {
   verifdia1 = 0;
   verifmes1 = 0;
   verifdia2 = 0;
   verifmes2 = 0;
   printf("Escreva a primeira data: ");
   scanf("%d %d", &dia1, &mes1);
   printf("Escreva a segunda data: ");
   scanf("%d %d", &dia2, &mes2);

   if (mes1 > 12)
       verifmes1 = 1;
   if (mes2 > 12)
       verifmes2 = 1;
   if (dia1 > 31)
       verifdia1 = 1;
   if (dia2 > 31)
       verifdia2 = 1;


   if (mes1 == 1 || mes1 == 3 || mes1 == 5 || mes1 == 7 || mes1 == 8 || mes1 == 10 || mes1 == 12){
      calc1 = 31 - dia1;
      if (dia1>31)
           verifdia1=1;
      if (dia2>31)
           verifdia2=1;
      if (dia1<=31)
           verifdia1=0;
      if (dia2<=31)
           verifdia2=0;
      }
      else if (mes1 == 4 || mes1 == 6 || mes1 == 9 || mes1 == 11){
           calc1 = 30 - dia1;
               if (dia1>30)
                   verifdia1=1;
               if (dia2>30)
                   verifdia2=1;
               if (dia1<=30)
                   verifdia1=0;
               if (dia2<=30)
                   verifdia2=0;
      }
           else if (mes1 == 2 && bissexto == 1){
               calc1 = 29 - dia1;
               if (dia1>29)
                   verifdia1=1;
               if (dia2>29)
                   verifdia2=1;
               if (dia1<=29)
                   verifdia1=0;
               if (dia2<=29)
                   verifdia2=0;
           }
                else if (mes1 == 2 && bissexto == 0){
                     calc1 = 28 - dia1;
                     if (dia1>28)
                       verifdia1=1;
                     if (dia2>28)
                       verifdia2=1;
                     if (dia1<=28)
                       verifdia1=0;
                     if (dia2<=28)
                       verifdia2=0;
                }
   printf("Calc1: %d\n", calc1);
   if (verifdia1 == 1)
       printf("Dia 1 Invalido\n");
   if (verifdia2 == 1)
       printf("Dia 2 Invalido\n");
   if (verifmes1 == 1)
       printf("Mes 1 Invalido\n");
   if (verifmes2 == 1)
       printf("Mes 2 Invalido\n");

   } while (verifdia1 == 1 || verifmes1 == 1 || verifmes2 == 1 || verifdia2 == 1);

  i = 0;
  totalmes = 0;
  if (mes1<mes2){
      printf("Mes 1 < Mes2\n");
  do{
  totalmes = meses[mes1+i] + totalmes;
  i=i+1;
     printf("Totalmes: %d\n", totalmes);
  } while (i<mes1-1);
  }
   else {
       printf("Mes1 > Mes2\n");
   do{
   totalmes = meses[mes2-i] + totalmes;
   i=i+1;
   printf("I = %d\n", i);
   printf("Totalmes: %d\n", totalmes);
   } while (i<mes2-1);

   }
  totaldias = calc1+totalmes+dia2;

  printf("O total de dias e: %d\n", totaldias);





   system("PAUSE");
}

 

Mas mesmo assim, ainda não está batendo certo..

 

Alguém com paciencia para rever o código, por favor me ajude, porque eu já revi várias vezes e nada..

 

EDIT: Os if's de verificação são necessarios para evitar datas inválidas, tanto ano, como dia ou mes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, foi mal, falei errado no outro post, estava considerando apenas as somas dos meses, pode acontecer de não ser o mês inteiro...

Temos que levar em conta também os dias...

Uma dúvida, a data um tem que ser maior que a data dois, certo?

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.