Como saber si una fecha está en un intervalo determinado? Imprimir
Escrito por adrianvaca   
Martes, 22 de Marzo de 2011 23:43

Suponiendo que tenemos una fecha definida como:

struct date fechaMedia;



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

 
Otros artículos