Autor
|
Tema: AYUDA URGENTE!! Comparacion de fechas en DEV C++ (Leído 2,551 veces)
|
JonatanP
Desconectado
Mensajes: 4
|
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 #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); }
|
|
|
En línea
|
|
|
|
BloodSharp
Desconectado
Mensajes: 814
¡ Hiperfoco !
|
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 anio) { return((anio>=1900)&&(anio<=2020)); } int VerificarFecha(int*dia,int*mes,int*anio) { printf("La fecha es: %i:%i:%i\n",*dia ,*mes ,*anio ); if(VerificarAnio(*anio)) if(VerificarMes(*mes)) if(VerificarDia(*dia,*mes)) return 1; return 0; } int AnioADias(int anio) { return ((anio)*(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, anio; int fechaValida; // bool do { fechaValida=VerificarFecha(&dia, &mes, &anio); if(!fechaValida) puts("Fecha Invalida!!!\n"); } while (!fechaValida); int veintiuno_mayo_2020=AnioADias(2020)+MesADias(MAYO)+21; int fechaSeleccionada=AnioADias(anio)+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#
|
|
« Última modificación: 26 Mayo 2020, 18:55 pm por BloodSharp »
|
En línea
|
|
|
|
Serapis
|
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...
|
|
« Última modificación: 26 Mayo 2020, 20:47 pm por NEBIRE »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
otro tipo de problemas con fechas (Comparacion)
Programación Visual Basic
|
Zeroql
|
6
|
2,244
|
1 Diciembre 2007, 16:54 pm
por Zeroql
|
|
|
Ayuda comparacion de Sonido
Programación Visual Basic
|
Saok Dagon
|
3
|
1,874
|
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
|
1 Diciembre 2011, 22:19 pm
por Deby93
|
|
|
Ayuda Comparacion de cadenas
Java
|
charmedever
|
3
|
2,215
|
16 Julio 2012, 05:19 am
por hucruz
|
|
|
ayuda con comparacion en sentencia
Programación C/C++
|
rod00x3
|
3
|
2,693
|
7 Enero 2013, 19:33 pm
por rod00x3
|
|