AYUDA URGENTE!! Comparacion de fechas en DEV C++

Iniciado por JonatanP, 26 Mayo 2020, 05:38 AM

0 Miembros y 1 Visitante están viendo este tema.

JonatanP

Tengo que resolver un problema que dice lo siguiente: Programa que captura una fecha válida, considerando año entre 1900 y 2020, febrero de 28 días y el resto de los
meses como corresponde, deberá indicar error si no es válida y seguirla preguntando hasta que lo sea. Luego
calcule los años, meses y días que hay comparando al 21 de Mayo de 2020.
D.e: Fecha valida
D.s:Año, mes y dias comparados al 21 de mayo 2020.

Tengo este codigo, pero me falta que haga la comparacion de la fecha que ingrese con la que esta determinada que es el 21 de Mayo del 2020. ayuda por favor
Código (cpp) [Seleccionar]
#include<stdio.h>
int main()
{
int d,m,a;
do{
d=0,m=0,a=0;
printf("Dame el dia:");
scanf("%i",&d);
printf("Dame el mes:");
scanf("%i",&m);
printf("Dame el año:");
scanf("%i",&a);
printf("La fecha es: %i:%i:%i",d,m,a);

if(a>=1900&&a<=2019)
{
if(m>=1&&m<=12)
{
    if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
{
if(d>=1&&d<=31)
{
printf("\nFECHA VALIDA\n");
}
else
{
printf("\nFECHA NO VALIDA\n");
}
}
if(m==4||m==6||m==9||m==11)
{
if(d>=1&&d<=30)
{
printf("\nFECHA VALIDA\n");
}
else
{
printf("\nFECHA NO VALIDA\n");
}
}
if(m==2)
{
if(d>=1&&d<=28)
{
printf("\nFECHA VALIDA\n");
}
else
{
printf("\nFECHA NO VALIDA\n");
}
}
}
else
{
printf("\nFECHA NO VALIDA\n");
}
}
   
else
{
printf("\nFECHA NO VALIDA\n");
}

}while(a>=2020||a<=1899||m==2&&d>=29||m>=13||d>=32);



}

BloodSharp

#1
Hola JonatanP lo que hice yo para la solución fue convertir las fechas a días y luego realizar una resta y reconvertir a años, meses y días, también re hice el ejercicio desde cero dado que tu código no se puede leer bien... :silbar: :silbar:

NOTA: La fecha es aproximadas, por lo que se requiere trabajar más en el código si se quiere una fecha de distancia exacta...


#include <stdio.h>
#include <math.h>

enum
{
   ENERO=1,
   FEBRERO,
   MARZO,
   ABRIL,
   MAYO,
   JUNIO,
   JULIO,
   AGOSTO,
   SEPTIEMBRE,
   OCTUBRE,
   NOVIEMBRE,
   DICIEMBRE,
};

int VerificarDia(int dia,int mes)
{
   int verificar;
   if((mes==FEBRERO)&&(dia>=1)&&(dia<=28))
       return 1;
   switch(mes)
   {
       case ENERO:
       case MARZO:
       case MAYO:
       case JULIO:
       case AGOSTO:
       case OCTUBRE:
       case DICIEMBRE:
           verificar=((dia>=1)&&(dia<=31));
           break;
       default:
           verificar=((dia>=1)&&(dia<=30));
           break;
   }
   return verificar;
}

int VerificarMes(int mes)
{
   return((mes>=1)&&(mes<=12));
}

int VerificarAnio(int año)
{
   return((año>=1900)&&(año<=2020));
}

int VerificarFecha(int*dia,int*mes,int*año)
{
   printf("Dame el dia: ");
   scanf("%i",dia);
   printf("Dame el mes: ");
   scanf("%i",mes);
   printf("Dame el año: ");
   scanf("%i",año);
   printf("La fecha es: %i:%i:%i\n",*dia,*mes,*año);
   if(VerificarAnio(*año))
       if(VerificarMes(*mes))
           if(VerificarDia(*dia,*mes))
               return 1;
   return 0;
}

int AnioADias(int año)
{
   return ((año)*(7*31+1*28+4*30));
}

int MesADias(int mes)
{
   return (mes*30);//Valor aproximado
}

int DiasAAnios(int dias)
{
   return (dias/(7*31+1*28+4*30));
}

int DiasAMeses(int dias)
{
   return (dias/30);//Valor aproximado
}

int main()
{
   int dia, mes, año;
   int fechaValida; // bool
   do
   {
       fechaValida=VerificarFecha(&dia, &mes, &año);
       if(!fechaValida)
           puts("Fecha Invalida!!!\n");
   } while (!fechaValida);

   int veintiuno_mayo_2020=AnioADias(2020)+MesADias(MAYO)+21;
   int fechaSeleccionada=AnioADias(año)+MesADias(mes)+dia;
   int diferenciaDeFecha=abs(veintiuno_mayo_2020-fechaSeleccionada);

   printf("Hay %i años, %i meses y %i dias de diferencia...\n",
       DiasAAnios(diferenciaDeFecha),
       abs(DiasAMeses(diferenciaDeFecha)-(DiasAAnios(diferenciaDeFecha)*12)),
       abs(diferenciaDeFecha-(DiasAMeses(diferenciaDeFecha)*30)));
}



B#



Serapis

#2
Lo que complica las fechas son los años bisiestos. Anulado dicho efecto, es un problema mucho más sencillo de tratar...

Yo tendría una enumeración en la forma:

enumeracion DiasHastaMes
 dEnero = 1
 dFebrero = dEnero + 31
 dMarzo = dFebrero + 28
 dAbril = dMarzo + 31
 ...
 dDiciembre = dNoviembre + 30
 dAño = dDiciembre + 31
Fin enum

Es decir cada mes valdría el día absoluto del año. Y equivaldría al día 1 de dicho mes (nótese que puede considerarse el día 1 consumido o sin consumir, bastando cambiar para enero el valor 1 ó 0 según convenga cuando se adelante el bosquejo y se pase al código).

Por supuesto se mantiene la enumeración de meses... y pasaría los datos a un array. Nótese igualmente el 'AÑO'...

Enumeracion MesesDelAño
 ENERO = 1
 FEBRERO = 2
 ...
 DICIEMBRE = 12
 AÑO = 13
fin enumeracion

array DiasHastaMes Mes(1 a 13)  
  Mes(ENERO) = dEnero
  Mes(FEBRERO) = dFebrero
  ...
  Mes(DICIEMBRE) = dDiciembre
  Mes(AÑO) = dAño


Me 'inventaría el mes 13' que es el 'año completo' que tendrá 365.

Desde esta perspectiva basta:
 1 - Contar el año inicial incompleto (si lo es)
 2 - Contar años completos (si los hay).
 3 - Contar el año final incompleto (si lo es).
Ahora el problema se fragmentado en 3 partes, la más sencilla de calcular es la segunda...


Funcion CalcularIntervalosEntre2Fechas(fecha-string FechaInicial, FechaFinal)
   entero DiaInicial, DiaFinal, AñoInicial, AñoFinal
   MesesDelAño MesInicial, MesFinal
   entero dias, meses, años

   // La fecha inicial recibida se separa en año, mes y dia
   llamada a la funcion SepararFecha(FechaInicial, AñoInicial, MesInicial, DiaInicial)

   // Idem con la fecha final.
   llamada a la funcion SepararFecha(FechaFinal, AñoFinal, MesFinal, DiaFinal)

   // 1 --- contar año inicial incompleto:
   Si ((MesInicial> 1) o (DiaInicial >1) )  // Esto es si: (fechaInicial > "1 de enero")
       dias = dAño - (mes(MesInicial+1) - DiaInicial))
       meses = (12 - MesInicial)
       // años = 0
       AñoInicial + = 1
   fin si

   // 3 ---- contar año final incompleto.
   si ((MesFinal < 12) o (Dia < 31))    // Esto es si: (Fechafinal < "31 diciembre")
      dias += mes(MesFinal) + diaFinal
      meses += Mesfinal
      añoFinal -=1
   fin si

   // 2 ---- Contar años completos.
    Si añoFinal <= añoInicial)
        años = (añoFinal - añoInicial)
    sino
        años = 0
    fin si

   meses + = (años * 12)
   dias += (años * dAño)  // * 365
 
   imprimir dias, meses, años
Fin funcion

La función 'SepararFecha', es una función que separa la fecha según el formato de entrada en sendos parametros que devuelve por referencia... es superfluo definir una función así, queda a tu esfuerzo.

Nótese que en meses y años solo se cuentan como tales los que sean completos...
y noteses que como está hecho al vuelo, puede precisar algún ajuste del tipo +1, -1 en alguna parte...