Suponiendo que tenemos una fecha definida como:
Queremos saber si esa fecha está en un intervalo determinado, es decir si fechaMedia está entre fechaInicial y fechaFinal, bien la cabecera y funciones clave de nuestro programas serían:
#include <stdio.h> #include <dos.h> #include <conio.h>
#define dias_por_400_anios (365*400+100-3) #define es_anio_bisiesto(y) ((((y)%400)==0)||((((y)%4)==0)&&(((y)%100)!=0)))
enum bool { false = 0, true = 1 };
enum Mes { Enero = 1, Febrero = 2, Marzo = 3, Abril = 4, Mayo = 5, Junio = 6, Julio = 7, Agosto = 8, Septiembre = 9, Octubre = 10, Noviembre = 11, Diciembre = 12 };
long dias_pasados_400_anios(int y) { return ( y > 0 ) ? 365 * y + (y-1) / 4 - (y-1) / 100 + 1 : 0; }
long dias_pasados_mes (int y, int m) { const int dias[12] = { 0, 31, 31+28, 59+31, 90+30, 120+31, 151+30, 181+31, 212+31, 243+30, 273+31, 304+30 /*, 334+31 = 365*/ };
long resultado;
resultado = dias[m-1];
if ( m > Febrero && es_anio_bisiesto ( y ) ) resultado++;
return resultado; }
long dias_pasados_fecha (struct date fecha) { long dias; dias = (fecha.da_year/400) * dias_por_400_anios + dias_pasados_400_anios ( fecha.da_year % 400 ) + dias_pasados_mes ( fecha.da_year, fecha.da_mon ) + fecha.da_day;
return dias; }
bool es_media (struct date fechaInicial, struct date fechaFinal, struct date fechaMedia) { long dias_maximos = dias_pasados_fecha(fechaFinal) - dias_pasados_fecha(fechaInicial); long dias_fecha = dias_pasados_fecha(fechaFinal) - dias_pasados_fecha(fechaMedia);
if(dias_fecha>=0 && dias_fecha<=dias_maximos) return true; return false; } |
La función definida como es_media, retorna true si la fechaMedia está entre fechaInicial y fechaFinal, en caso contrario retorna false.
Ahora un pequeño programita para verificar si funciona todo esto:
void main() { struct date fechaInicial, fechaFinal; struct date fechaMedia;
fechaInicial.da_day=1; fechaInicial.da_mon=6; fechaInicial.da_year=2006;
fechaFinal.da_day=30; fechaFinal.da_mon=6; fechaFinal.da_year=2006;
fechaMedia.da_day=22; fechaMedia.da_mon=2; fechaMedia.da_year=2006;
clrscr();
if(es_media(fechaInicial, fechaFinal, fechaMedia)) printf("La fecha media esta en el intervalo"); else printf("La fecha media NO esta en el intervalo");
getch(); } |
Fíjense en lo fácil que resulta determinar si la fecha está en el intervalo especificado, gracias a la función que definimos
|