elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  AYUDA URGENTE!! Comparacion de fechas en DEV C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: AYUDA URGENTE!! Comparacion de fechas en DEV C++  (Leído 2,551 veces)
JonatanP

Desconectado Desconectado

Mensajes: 4


Ver Perfil
AYUDA URGENTE!! Comparacion de fechas en DEV C++
« 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.  


En línea

BloodSharp


Desconectado Desconectado

Mensajes: 814


¡ Hiperfoco !


Ver Perfil WWW
Re: AYUDA URGENTE!! Comparacion de fechas en DEV C++
« Respuesta #1 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...


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 anio)
  49. {
  50.    return((anio>=1900)&&(anio<=2020));
  51. }
  52.  
  53. int VerificarFecha(int*dia,int*mes,int*anio)
  54. {
  55.    printf("Dame el dia: ");
  56.    scanf("%i",dia);
  57.    printf("Dame el mes: ");
  58.    scanf("%i",mes);
  59.    printf("Dame el anio: ");
  60.    scanf("%i",anio);
  61.    printf("La fecha es: %i:%i:%i\n",*dia,*mes,*anio);
  62.    if(VerificarAnio(*anio))
  63.        if(VerificarMes(*mes))
  64.            if(VerificarDia(*dia,*mes))
  65.                return 1;
  66.    return 0;
  67. }
  68.  
  69. int AnioADias(int anio)
  70. {
  71.    return ((anio)*(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, anio;
  92.    int fechaValida; // bool
  93.    do
  94.    {
  95.        fechaValida=VerificarFecha(&dia, &mes, &anio);
  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(anio)+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#


« Última modificación: 26 Mayo 2020, 18:55 pm por BloodSharp » En línea



Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: AYUDA URGENTE!! Comparacion de fechas en DEV C++
« Respuesta #2 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...
« Última modificación: 26 Mayo 2020, 20:47 pm por NEBIRE » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
otro tipo de problemas con fechas (Comparacion)
Programación Visual Basic
Zeroql 6 2,244 Último mensaje 1 Diciembre 2007, 16:54 pm
por Zeroql
Ayuda comparacion de Sonido
Programación Visual Basic
Saok Dagon 3 1,874 Último mensaje 11 Diciembre 2007, 07:44 am
por Saok Dagon
Ayuda con comparación de ficheros en C++
Programación C/C++
Deby93 0 3,825 Último mensaje 1 Diciembre 2011, 22:19 pm
por Deby93
Ayuda Comparacion de cadenas
Java
charmedever 3 2,215 Último mensaje 16 Julio 2012, 05:19 am
por hucruz
ayuda con comparacion en sentencia
Programación C/C++
rod00x3 3 2,693 Último mensaje 7 Enero 2013, 19:33 pm
por rod00x3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines