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...
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("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#