Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: JonatanP en 26 Mayo 2020, 05:38 am



Título: AYUDA URGENTE!! Comparacion de fechas en DEV C++
Publicado por: JonatanP en 26 Mayo 2020, 05:38 am
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
  1. #include<stdio.h>
  2. int main()
  3. {
  4. int d,m,a;
  5. do{
  6. d=0,m=0,a=0;
  7. printf("Dame el dia:");
  8. scanf("%i",&d);
  9. printf("Dame el mes:");
  10. scanf("%i",&m);
  11. printf("Dame el año:");
  12. scanf("%i",&a);
  13. printf("La fecha es: %i:%i:%i",d,m,a);
  14.  
  15. if(a>=1900&&a<=2019)
  16. {
  17. if(m>=1&&m<=12)
  18. {
  19.   if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
  20. {
  21. if(d>=1&&d<=31)
  22. {
  23. printf("\nFECHA VALIDA\n");
  24. }
  25. else
  26. {
  27. printf("\nFECHA NO VALIDA\n");
  28. }
  29. }
  30. if(m==4||m==6||m==9||m==11)
  31. {
  32. if(d>=1&&d<=30)
  33. {
  34. printf("\nFECHA VALIDA\n");
  35. }
  36. else
  37. {
  38. printf("\nFECHA NO VALIDA\n");
  39. }
  40. }
  41. if(m==2)
  42. {
  43. if(d>=1&&d<=28)
  44. {
  45. printf("\nFECHA VALIDA\n");
  46. }
  47. else
  48. {
  49. printf("\nFECHA NO VALIDA\n");
  50. }
  51. }
  52. }
  53. else
  54. {
  55. printf("\nFECHA NO VALIDA\n");
  56. }
  57. }
  58.  
  59. else
  60. {
  61. printf("\nFECHA NO VALIDA\n");
  62. }
  63.  
  64. }while(a>=2020||a<=1899||m==2&&d>=29||m>=13||d>=32);
  65.  
  66.  
  67.  
  68. }
  69.  


Título: Re: AYUDA URGENTE!! Comparacion de fechas en DEV C++
Publicado por: BloodSharp en 26 Mayo 2020, 17:27 pm
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...

(https://i.imgur.com/2mB6DQW.png)

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. enum
  5. {
  6.    ENERO=1,
  7.    FEBRERO,
  8.    MARZO,
  9.    ABRIL,
  10.    MAYO,
  11.    JUNIO,
  12.    JULIO,
  13.    AGOSTO,
  14.    SEPTIEMBRE,
  15.    OCTUBRE,
  16.    NOVIEMBRE,
  17.    DICIEMBRE,
  18. };
  19.  
  20. int VerificarDia(int dia,int mes)
  21. {
  22.    int verificar;
  23.    if((mes==FEBRERO)&&(dia>=1)&&(dia<=28))
  24.        return 1;
  25.    switch(mes)
  26.    {
  27.        case ENERO:
  28.        case MARZO:
  29.        case MAYO:
  30.        case JULIO:
  31.        case AGOSTO:
  32.        case OCTUBRE:
  33.        case DICIEMBRE:
  34.            verificar=((dia>=1)&&(dia<=31));
  35.            break;
  36.        default:
  37.            verificar=((dia>=1)&&(dia<=30));
  38.            break;
  39.    }
  40.    return verificar;
  41. }
  42.  
  43. int VerificarMes(int mes)
  44. {
  45.    return((mes>=1)&&(mes<=12));
  46. }
  47.  
  48. int VerificarAnio(int año)
  49. {
  50.    return((año>=1900)&&(año<=2020));
  51. }
  52.  
  53. int VerificarFecha(int*dia,int*mes,int*año)
  54. {
  55.    printf("Dame el dia: ");
  56.    scanf("%i",dia);
  57.    printf("Dame el mes: ");
  58.    scanf("%i",mes);
  59.    printf("Dame el año: ");
  60.    scanf("%i",año);
  61.    printf("La fecha es: %i:%i:%i\n",*dia,*mes,*año);
  62.    if(VerificarAnio(*año))
  63.        if(VerificarMes(*mes))
  64.            if(VerificarDia(*dia,*mes))
  65.                return 1;
  66.    return 0;
  67. }
  68.  
  69. int AnioADias(int año)
  70. {
  71.    return ((año)*(7*31+1*28+4*30));
  72. }
  73.  
  74. int MesADias(int mes)
  75. {
  76.    return (mes*30);//Valor aproximado
  77. }
  78.  
  79. int DiasAAnios(int dias)
  80. {
  81.    return (dias/(7*31+1*28+4*30));
  82. }
  83.  
  84. int DiasAMeses(int dias)
  85. {
  86.    return (dias/30);//Valor aproximado
  87. }
  88.  
  89. int main()
  90. {
  91.    int dia, mes, año;
  92.    int fechaValida; // bool
  93.    do
  94.    {
  95.        fechaValida=VerificarFecha(&dia, &mes, &año);
  96.        if(!fechaValida)
  97.            puts("Fecha Invalida!!!\n");
  98.    } while (!fechaValida);
  99.  
  100.    int veintiuno_mayo_2020=AnioADias(2020)+MesADias(MAYO)+21;
  101.    int fechaSeleccionada=AnioADias(año)+MesADias(mes)+dia;
  102.    int diferenciaDeFecha=abs(veintiuno_mayo_2020-fechaSeleccionada);
  103.  
  104.    printf("Hay %i años, %i meses y %i dias de diferencia...\n",
  105.        DiasAAnios(diferenciaDeFecha),
  106.        abs(DiasAMeses(diferenciaDeFecha)-(DiasAAnios(diferenciaDeFecha)*12)),
  107.        abs(diferenciaDeFecha-(DiasAMeses(diferenciaDeFecha)*30)));
  108. }


B#


Título: Re: AYUDA URGENTE!! Comparacion de fechas en DEV C++
Publicado por: Serapis en 26 Mayo 2020, 20:12 pm
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:
Código:
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'...
Código:
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...

Código:
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...