0

Tutorial de Programación: Cómo comprobar si una fecha es válida

Buenas, lectores! Esta mañana he estado programando una función en C++ para comprobar si una fecha es válida o no. Aunque no es un código complicado de escribir, he pensado que daría para un tutorial interesante, especialmente para aquellos que estéis empezando a programar.

Esta función recibirá como parámetros seis variables enteras correspondientes a una fecha: año, mes, día, hora, minutos y segundos y nos devolverá un booleano que indicará la validez de la fecha.

Para comprobar si la fecha es correcta vamos a seguir estos cinco pasos:

  1. Comprobar que la hora sea correcta. Las variables de los segundos y los minutos deben tomar un valor entre 0 y 59, y la hora entre 0 y 23.
  2. Crear un array de números enteros, de 12 espacios, que contendrá el número de días de cada mes.
  3. Comprobar si el año es bisiesto. Si lo es, sumamos 1 al segundo espacio del array, que se corresponde a los días del mes de febrero.
  4. Comprobar que el mes sea válido. La variable tiene que ser un entero entre 1 y 12.
  5. Comprobar que el día sea válido. Buscamos en el array cuántos días tiene nuestro mes y comprobamos que el número de día no esté fuera de este rango.

¿Cómo comprobar si el año es bisiesto?

En el Calendario Gregoriano hay algunos años que son bisiestos, es decir, que el mes de febrero tiene 29 días en vez de 28. Este día extra se añade para corregir el desfase que existe entre el año del calendario, que es de 365 días, y el año trópico (tiempo que tarda la tierra en hacer una vuelta al sol), que es de 365 días, 5 horas, 48 minutos y unos 45 segundos.

En nuestro calendario, un año será bisiesto si es divisible entre 4. Sin embargo, no puede ser divisible entre 100, a menos que lo sea entre 400.

Por ejemplo, los años 1902, 1980 y 2000 serían bisiestos, pero 1900, 2100 y 2200 serían ordinarios.

En nuestro programa comprobaremos si el año es bisiesto con esta simple condición:

if((año % 4 == 0 and año % 100 != 0) or año % 400 == 0)

Si esta condición es cierta, el año será bisiesto.


Pseudocódigo

He aquí un esquema en pseudocódigo:

bool comprobar_fecha(int año, int mes, int dia, int hora, int min, int sec)

    array dias_mes := {31, 28, 31, 30,31, 30, 31, 31, 30, 31, 30, 31}


    //Comprobar la hora, minutos y segundos
    if(min< 0 or min >= 60 or sec < 0 or sec >= 60 or hora < 0 or hora >= 24)
        return False


    //Comprobar si el año es bisiesto
    if((año % 4 == 0 and año % 100 != 0) or año % 400 == 0)
        dias_mes[1] := dias_mes[1] + 1


    //Comprobar que el mes sea válido
    if(mes < 1 or mes > 12)
        return False

    //Comprobar que el dia sea válido
    m := m-1
    if(d < 0 or d > dias_mes[m])
        return False

    //Si ha pasado todas estas condiciones, la fecha es válida
        return True




Implementaciones

Vamos a ver la implementación de esta función en los tres lenguajes con los que estoy más habituado a programar: C++, Python y Processing. Si alguien quiere pasarme la implementación en algún otro lenguaje la añadiré a la lista con mucho gusto!

En todos los códigos pasamos una fecha predefinida a la función de comprobar_fecha. Si queremos cambiarla, habrá que modificar el texto del código y volver a compilar el programa. Si tenéis tiempo y ganas podéis ampliar un poco el código y permitir al usuario introducir una fecha (con funciones como ‘cin’ de C++ o ‘input()’ de Python).

C++

C++ es como un helado sabor nata: estándar, pero nunca te falla.

/* Programa en C++ para comprobar si una fecha es valida
 *
 *
 * Escrito por Nano en beneficio de los seres humanos
 * www.robologs.net
*/


#include <iostream>
using namespace std;


bool comprobar_fecha(int a, int m, int d, int hora, int min, int sec)
{
	//Array que almacenara los dias que tiene cada mes (si el ano es bisiesto, sumaremos +1 al febrero)
	int dias_mes[] = {31, 28, 31, 30,31, 30, 31, 31, 30, 31, 30, 31};


	//Comprobar si la hora, minutos y segundos son aceptables
	if(min < 0 or min >= 60 or sec < 0 or sec >= 60 or hora < 0 or hora >= 24)
		return false;


	//Comprobar si el ano es bisiesto y anadir dia en febrero en caso afirmativo
	if((a%4 == 0 and a%100 != 0) or a%400 == 0)
		dias_mes[1]++;

	//Comprobar que el mes sea valido
	if(m < 1 or m > 12)
		return false;
	
	//Comprobar que el dia sea valido
	m = m-1;
	if(d <= 0 or d > dias_mes[m])
		return false;

	//Si ha pasado todas estas condiciones, la fecha es valida
	return true;
	
	
}


int main(void)
{
        //Testear la funcion con una fecha arbitraria
	bool correcta = comprobar_fecha(2100, 2, 29, 20, 00, 00);


	if(correcta)
		cout << "\n\nLa fecha entrada es CORRECTA" << endl;

	else
		cout << "\n\nLa fecha entrada es FALSA" << endl;

	return 0;

}

 

Python

Con python hemos implementado el condicional que nos comprueba si el año es bisiesto, a pesar de que este lenguaje tiene una función propia para comprobarlo automáticamente.

""" Programa en Python para comprobar si una fecha es valida
 
 
   Escrito por Nano en beneficio de los seres humanos
   www.robologs.net

"""



def comprobar_fecha(a, m, d, hora, minuto, sec):

	#Array que almacenara los dias que tiene cada mes (si el ano es bisiesto, sumaremos +1 al febrero)
	dias_mes = [31, 28, 31, 30,31, 30, 31, 31, 30, 31, 30, 31]


	#Comprobar si la hora, minutos y segundos son aceptables
	if(minuto < 0 or minuto >= 60 or sec < 0 or sec >= 60 or hora < 0 or hora >= 24):
		return False


	#Comprobar si el ano es bisiesto y anadir dia en febrero en caso afirmativo
	if((a%4 == 0 and a%100 != 0) or a%400 == 0):
		dias_mes[1] += 1

	#Comprobar que el mes sea valido
	if(m < 1 or m > 12):
		return False
	
	#Comprobar que el dia sea valido
	m -= 1
	if(d <= 0 or d > dias_mes[m]):
		return False

	#Si ha pasado todas estas condiciones, la fecha es valida
	return True





correcta = comprobar_fecha(2000, 2, 29, 20, 00, 00)

#Mostrar el resultado:
if(correcta):
	print("\n\nLa fecha entrada es CORRECTA\n")

else:
	print("\n\nLa fecha entrada es FALSA\n")

 

Processing

/* Programa en Processing para comprobar si una fecha es valida
 *
 *
 * Escrito por Nano en beneficio de los seres humanos
 * www.robologs.net
*/


Boolean comprobar_fecha(int a, int m, int d, int hora, int min, int sec)
{
  //Array que almacenara los dias que tiene cada mes (si el ano es bisiesto, sumaremos +1 al febrero)
  int dias_mes[] = {31, 28, 31, 30,31, 30, 31, 31, 30, 31, 30, 31};


  //Comprobar si la hora, minutos y segundos son aceptables
  if(min < 0 || min >= 60 || sec < 0 || sec >= 60 || hora < 0 || hora >= 24)
    return false;


  //Comprobar si el ano es bisiesto y anadir dia en febrero en caso afirmativo
  if((a%4 == 0 && a%100 != 0) || a%400 == 0)
    dias_mes[1]++;

  //Comprobar que el mes sea valido
  if(m < 1 || m > 12)
    return false;
  
  //Comprobar que el dia sea valido
  m = m-1;
  if(d <= 0 || d > dias_mes[m])
    return false;

  //Si ha pasado todas estas condiciones, la fecha es valida
  return true;
  
  
}

void setup()
{
  Boolean correcta = comprobar_fecha(2100, 2, 29, 20, 00, 00);
  
  //Mostrar los resultados
  if(correcta)
      println("\n\nLa fecha entrada es CORRECTA");
  else
      println("\n\nLa fecha entrada es FALSA");
}

//El void draw no lo necesitamos
void draw()
{}

N4n0

Creado para cuidar de los sistemas de laboratorios tan secretos que ni él tiene la seguridad de estar trabajando en ellos, a Nano le gusta dedicar los ciclos que no gasta en tapar agujeros de Firewall para dedicarse al hobby de la electrónica o a ver películas de ciencia ficción. Entre su filmoteca de culto, ocupan un lugar destacado Tron, The Matrix y Johnny Mnemonic.

Deja un comentario

avatar