Publi

Algoritmos: Año bisiesto y validación de fechas en C

Para inaugurar la nueva sección de Algoritmos de este blog, empezaré presentando una función para calcular años bisiestos (lo podemos encontrar en Wikipedia en bastantes más lenguajes, pero, ¿por qué aquí no?

1
2
3
4
function bisiesto(int year)
{
  return (a%4==0) && ( (a%100!=0) || (a%400==0) );
}

Es decir, cada 4 años hay un año bisiesto, no cuando el año es múltiplo de 100, aunque sí cuando es múltiplo de 400.

Esta función, podemos utilizarla para validar fechas:

1
2
3
4
5
6
7
8
9
10
11
12
short valida_fecha(short d, short m, int a)
{
  short dias_mes[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

  if ( (d<=0) || (m<=0) )   /* Si el día, o mes es negativo o cero */
    return 0;           /* la fecha no es válida */

  if ( (m!=2) || (!bisiesto(a)) )
      return (d<=dias_mes[m-1]);
  else
    return (d<=dias_mes[1]+1);
}

Es decir, primero creamos un array con los días que tiene cada mes, para que sea de fácil acceso, si lo prefieres, puede ser un array estático: short dias_mes[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
Luego comprobamos si el mes es distinto de 2, o no el año no es bisiesto, en ese caso comparamos con el valor del array (es importante decir que el mes 1 es Enero, pero en nuestro array, Enero será el elemento 0 y por eso restamos 1. Si la condición no se cumple, verificamos que el día es menor o igual que los días de Febrero + 1 (29 días).

En el ejemplo a continuación vemos todo el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
*************************************************************
* @file valida_fechas.c
* @brief Valida una fecha introducida por teclado
*
* @author Gaspar Fernández <blakeyed@totaki.com>
* http://totaki.com/poesiabinaria/algoritmos/
*************************************************************/


#include <stdlib.h>
#include <stdio.h>

short bisiesto (int a)
{
  return (a%4==0) && ( (a%100!=0) || (a%400==0) );
}

short valida_fecha(short d, short m, int a)
{
  short dias_mes[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

  if ( (d<=0) || (m<=0) )   /* Si el día, o mes es negativo o cero */
    return 0;           /* la fecha no es válida */

  if ( (m!=2) || (!bisiesto(a)) )
      return (d<=dias_mes[m-1]);
  else
    return (d<=dias_mes[1]+1);
}


int main(int argc, char *argv[])
{
  int a,m,d;

  printf ("Por favor, introduce una fecha (D/M/A)\n");
  scanf("%d/%d/%d", &d, &m, &a);
 
  if (valida_fecha(d, m, a))
    printf ("Fecha válida\n");
  else
    printf ("Fecha NO válida\n");

  return EXIT_SUCCESS;
}

Descargar archivo: valida_fechas.c (1Kb)

También podría interesarte...

There are 5 comments left Ir a comentario

  1. Pingback: Bitacoras.com /

  2. guzman6001 /
    Usando Google Chrome Google Chrome 17.0.963.83 en Windows Windows XP

    ¡Excelente! BASTANTE útil.

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 11.0 en Ubuntu Linux Ubuntu Linux

      Gracias !

  3. fernando ernesto reinaga /
    Usando Google Chrome Google Chrome 53.0.2785.116 en Windows Windows NT

    me gustaría presentar un problema se cuenta con fecha y hora de partida y fecha y hora de llegada de un viaje de colectivo de larga distancia calcular la cantidad de horas y minutos que duro el viaje – como se calcula mediante fechas por ejemplo cuando cambia el mes si es que el viaje duro mas que un día a fin de mes ejemplo hora de partida 31/01/2016 09:10 hora de llegada 02/02/2016 08:30 y generalizando para cambio de año? como se calcula para mostrar en horas y minutos como datos de salida?

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 48.0 en Ubuntu Linux Ubuntu Linux

      Hola Fernando,

      Algo que puedes hacer rápidamente es pasar a segundos las dos fechas, con strptime() y mktime(), por ejemplo. Una vez tienes en segundos los dos tiempos, sólo tienes que restar llegada-salida y te da la diferencia de tiempo.
      Como esa diferencia de tiempo es el segundos, para ver la cantidad de horas, sólo tendrás que dividir por 3600, quédate también con el resto por otro lado, porque dividido entre 60 sacarás los minutos y el resto de esa división serán segundos.

      Aunque no es todo lo que necesitas, echale un ojo a este post: http://totaki.com/poesiabinaria/2016/03/como-convertirte-en-un-senor-del-tiempo-en-cc-desde-cero-parte-1/ que seguro que te dará alguna idea más.
      Saludos!

Leave a Reply