[C con Clase] Ejercicio con fechas.

Javier Cancio del Busto sepholin en gmail.com
Dom Mayo 25 15:40:57 CEST 2008


Muchísimas gracias por tu ayuda y por tu tiempo, me ha ido de perlas ;)

El día 25 de mayo de 2008 9:56, Alejandro <alepelexo en yahoo.es> escribió:

> ¡Hola Javier! Creo que te has planteado mal desde el principio el problema,
> no es una buena idea almacenar la fecha en un array de tipo "char", más que
> nada porque después te va a ser muy complejo realizar operaciones con él
> (comparar fechas o sumar 7 días, como tú dices, se convertirá en tarea
> complicadísima cuando en realidad no lo es tanto). Yo me lo plantaría de
> otra forma, y guardaría la fecha en una estructura:
>
> struct Fecha//Estructura para almacenar las fechas
> {
>       int dia;
>       int mes;
>       int anho;
> };
>
> Incluso podrías mejorar la estructura, haciendo que las variables sean
> "unsigned short" y no "int" porque sabes que no necesitarás toda la
> capacidad de un int. O podrías utilizar también campos de bits, pero son
> opciones más complejas que no creo que sean necesarias para este programa
> (sí serían buenas para optimizar y mejorar el programa). La estructura ya
> ves que es muy simple, sólo tiene tres campos: el día, el mes y el año de
> una fecha.
>
> Ahora comprobar si entre una fecha y otra han pasado siete días debería ser
> tarea fácil. Sólo hay que desarrollar unas reglas para comprobarlo e
> implementarlo:
>
>  - Si la diferencia en días es mayor de 7, entonces es claro que va a haber
> esa diferencia.
>  - Si la diferencia es mayor de dos meses, también habrá esa diferencia.
>  - Si la diferencia es de años, también habrá esa diferencia.
>
> Esos tres puntos son claros, pero hay uno que es más complejo: comprobar si
> hay esa diferencia entre dos fechas que están e meses contiguos. Para eso
> primero habría que guardar en un array de int el número de días de cada mes:
>
> int meses[] = {31,28,31,30,31,30,31,31,30,31,30,31};
>
> Incluso podrías desarrollar una función que comprobase si el año es
> bisiesto para sumar un día a febrero (en caso de que lo fuera).
>
> Una vez tenemos ese array, comprobar si las dos fechas tienen 7 días de
> diferencia es simple:
>
>  - A la fecha menor: se le restan al número total de días del mes el número
> del día de la fecha (para saber cuantos días quedan para el final del mes).
>  - A ese resultado se le suma el número del día de la otra fecha (que
> estaba en el mes siguiente) y ya tenemos la diferencia en días de las
> fechas. De nuevo, sólo queda comprobar si es mayor de 7 o no.
>
> Creo que el problema de diferencia de fechas está resuelto. Vamos con el de
> sumar 7 días.
>
> Simplemente incrementamos el valor de la variable "dia" de la estructura en
> 7:
>
> fecha.dia += 7;
>
> Ya estaría resuelto, pero aún queda hacer algunas comprobaciones, como que
> al sumar 7 días no se pase del máximo de días del mes o no se pase del
> número de meses del año.
>
>  - Si el día (después de sumar 7) es mayor que el número máximo de días de
> ese mes (recuerda que almacenamos el máximo de días en un array): entonces
> sumamos uno al mes y restamos al día el número máximo de días del mes
> anterior. Por ejemplo, supongamos que estamos a 29 de enero y le sumamos 7:
>
> 29 + 7 = 36 //Obviamente, el día 36 no existe.
> Como(36 > Máximo de días de enero)//Al pasarse del máximo de días
>    enero + 1 = febrero//Pasa al siguiente mes
>    36 - Máximo de días de enero = 5//Le resta el nº de días del mes
> anterior
>
> Como ves no he puesto el código (es mucho mejor que lo desarrolles tú),
> pero la idea básica es esa. Por último, habría que comprobar que el mes no
> se saliea del año. Supongamos la fecha 29 de diciembre de 2007, después de
> haber hecho lo anterior. Entonces tendríamos la fecha siguiente: 5 del mes
> 13 del año 2007:
>
> Como(13 > 12)//Al pasarse del máximo de meses
>    13 - 12 = 1//Restamos doce meses para volver a enero
>    2007 + 1 = 2008 //Avanzamos de año y llegamos al 2008.
>
>
> Bueno, creo que eso es todo. No te he proporcionado código, pero sí una
> idea básica de por dónde debería ir el algoritmo para conseguir lo que tú
> quieres. Además, al tratarse del tema de fechas lo que tú estás haciendo, te
> recomiendo que visites el siguiente enlace:
> http://c.conclase.net/curso/index.php?cap=011b#STR_problemas
>
> Son problemas sobre estructuras que hay en la página de C con Clase. Desde
> el número 2 hasta el 5 se te pide que realices diversas tareas con fechas,
> cada vez un poco más complejas. Pueden ser muy útiles para practicar y
> ayudarte a entenderlo mejor.
>
> Espero haberte ayudado.
>
> Un saludo, Alejandro.
>
>
> El pasado 2008-05-24 15:55:21, Javier Cancio escribió:
>
> JC> Hola!
> JC> Vereis, tengo un problema con un programa, se trata de comparar dos
> fechas y
> JC> comprobar si entre ambas fechas han pasado 7 dias o más, y por mas que
> miro
> JC> no consigo plantearme cómo desarrollar esa función... Y también cómo
> sumarle
> JC> 7 dias a una fecha dada.. Seguro que es una tonteria, pero con las
> fechas lo
> JC> llevo fatal. La fecha está definida como un char Fecha[100]
> JC> Muchas gracias!
> JC> _______________________________________________
> JC> Lista de correo Cconclase Cconclase en listas.conclase.net
> JC>
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> JC> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20080525/f93259b1/attachment.html>


Más información sobre la lista de distribución Cconclase