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> * https://poesiabinaria.net/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)