[C con Clase] Ejercicio con fechas.

Alejandro alepelexo en yahoo.es
Dom Mayo 25 09:56:47 CEST 2008


¡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


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