Algoritmo bisiesto

Un año es bisiesto en el calendario Gregoriano, si es divisible entre 4 y no divisible entre 100, y también si es divisible entre 400.

En programación, el algoritmo para calcular si un año es bisiesto es un algoritmo útil para la realización de calendarios.

Considérese las siguientes proposiciones o enunciados lógicos:

  • p: Es divisible entre 4
  • ¬q: No es divisible entre 100
  • r: Es divisible entre 400

La fórmula lógica que se suele usar para establecer si un año es bisiesto sería cuando [p y ¬q] ó [r] es verdadera, pero esta otra p y [¬q ó r] sería más eficiente.

Diagrama de flujo

editar

 

Implementaciones en diversos lenguajes de programación

editar

Método programado en ADA

editar
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Ada.Characters.Handling;

procedure algoritmo_bisiesto is
anio : Integer;

procedure Bisiesto(anio:Integer) is
begin
	if (anio mod 400 = 0 or anio mod 4 = 0) and not(anio mod 100 = 0) then 
		Put("Es bisiesto.");
	else
		Put("No es bisiesto.");
	end if;
end Bisiesto;

begin
	Put("Dime un año: ");
	Get(anio);
	Bisiesto(anio);
end algoritmo_bisiesto;

Método programado en Assembly Language (ASM Intel x86)

editar
;Este es un macro que a partir del dato ingresado en el parametro PrAnio define si dicho año es bisiesto, el resultado se guarda en el parametro Bisiesto
;ATENCION: El parametro PrAnio deber ser del tipo DW
Bisiesto Macro PrAnio, Bisiesto
Local Evaluar, Evaluar2, EsBisiesto, NoBisiesto, Salir				;Declara las etiquetas locales usadas por el macro
	Mov AX, PrAnio						        	;Mueve el parametro anio al registro AX	
	Mov DX, 0000h								;Limpia DX para una division
	Mov BX, 0190h								;Mueve a BX 400d
	DIV BX									;Realiza la operacion ANIO/400d
	CMP DX, 0000h								;Compara el residuo de la operacion con 0
	JE EsBisiesto								;Si es igual entonces el año es bisiesto, sino hace otra comparacion
	JNE Evaluar								;Salta si la division anterior no dio un resultado positivo a la siguiente condicional
	Evaluar:
		Mov AX, PrAnio							;Mueve a AX el año ingresado por el usuario
		Mov DX, 0000h							;Reinicializa el registro DX
		Mov BX, 0004h							;Mueve a BX 00004h
		Div BX							        ;Hace la division AX/0004h
		CMP DX, 0000h							;Compara el residuo de la division con 0h
		JE Evaluar2							;Salta a la segunda comparacion si el residuo de la division es 0
		JNE NoBisiesto						        ;Si el residuo de la division es diferente de cero define que no es año bisiesto
	Evaluar2:
		Mov DX, 0000h	                                                ;Reinicializa el registro DX
		Mov AX, PrAnio							;Mueve el año ingresado por el usuario a AX
		Mov BX, 0064h							;Mueve a BX 100d
		Div BX								;Anio / 100d
		CMP DX, 0000h							;Compara el residuo de la division con 0h
		JNE EsBisiesto						        ;Si el residuo no es cero, entonces se define que es año bisiesto
		JE NoBisiesto						        ;Si el residuo es cero el año es un año normal
	EsBisiesto:
		Mov Bisiesto, 01h						;Define el año como un año bisiesto poniendo 1 en el resultado
		JMP Salir							;Salta al final del macro
	NoBisiesto:
		Mov Bisiesto, 00h						;Define el año como un año normal poniendo 0 en el resultado
		JMP Salir							;Salta al final del macro
	Salir:
EndM

Método programado en Arduino

editar
int a;
void setup() {
  a=2004; //Ingrese el año a determinar ejemplo 2014
  Serial.begin(9600);
  if (a%400==0){
    Serial.println("Es bisiesto");  
  }
  else if (a%4==0 & a%100!=0){
    Serial.println("Es bisiesto");
  }
  else
  {
    Serial.println("No es bisiesto");  
  }
}
void loop() {
}

Método programado en AS3

editar
var today:Date = new Date();
function esBisiesto(year:Number):Boolean {
    return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}
//uso:
var yearactual=String(today.getFullYear());
var annoActual=Number(yearactual);
bisiesto=esBisiesto(annoActual);
// respuesta: true o false

Método programado en ASP/VB

editar
function bisiesto(anio)
	if ( (anio mod 4 = 0) and (anio mod 100 <> 0) ) or (anio mod 400 = 0) then
		bisiesto = true 'Es bisiesto
	else
		bisiesto = false 'No es bisiesto
	end if 
end function

Método programado en C

editar
#include <stdio.h>
int atoi (const char * string);

int isLeap(int year) 
{
    return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}

int main(int argc, char** argv)
{
    if (isLeap(atoi(argv[1]))) printf("Año bisiesto.\n");
    else printf("Año NO bisiesto.\n");

    return 0;
}

Método programado en C++

editar
#include <iostream>

using namespace std;
bool esBisiesto(int year) 
{
     return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}

int main()
{
     int year;

     cout << "Año a consultar: ";
     cin  >> year;
     cout << "El año " << year << (esBisiesto(year) ? "" : " no") << " es bisiesto." <<endl;
     
     cin.get();
     return 0;
}

class Bisiesto

   {
       double año;
       string salida = "";
       public void IngresarDatos(double añ)
       {
           año = añ;
       }
       public void Calcularaño()
       {
           if (año % 4 == 0 && año % 100 != 0 || año % 400 == 0)
           {
               salida = "El año " + año + " es bisiesto";
           }
           else { salida = "El año " + año + " no es bisiesto"; }
           }
       public string Imprimir()
       {
           return salida;
       }
       }
   }

Método programado en Delphi 5

editar

Sea anio una variable Integer = Año a analizar. Sea B una variable Booleana cuyo valor True=Bisiesto, False=No bisiesto.

procedure Bisiesto(anio:Integer);
Begin
If anio mod 4=0 then
   If anio mod 100 = 0 then
      If anio mod 400=0 then B:=True
         else B:=False
      else B:=True
   else B:=False
End;

Como todo lenguaje de programación de alto nivel, Delphi tiene una función para resolver lo anterior: IsLeapYear (A), que es una función Booleana cuyo valor True=Bisiesto, False=No bisiesto.

Método programado en Fortran90

editar
program bisiestopr
implicit none
integer :: a
write(*,*) "Dime un año:"
read(*,*) a
if (esbisiesto(a)) then
     write(*,*) "El año es bisiesto"
else 
     write(*,*) "El año no es bisiesto"
endif

contains

function esbisiesto(an)
logical :: esbisiesto
integer :: an
if (mod(an,4) == 0 .and. mod(an,100) /= 0 .or. mod(an,400)==0) then
  esbisiesto=.true.
else  
   esbisiesto=.false.
endif
end function esbisiesto

end program bisiestopr

Método programado en Haskell

editar
esBisiesto::Int->Bool
esBisiesto x =( mod x 400==0) || (mod x 4==0) && not (mod x 100==0)

Método programado en Java

editar
public boolean isLeap(int year) {
    return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}

Método programado en Javascript

editar
// Función que determina si un año es bisiesto o no
// beta3designs 2009
function es_bisiesto(year) {
	return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}

En Javascript ES6

let leapYear = (y) => y % 4 == 0 && y % 100 != 0 || y % 400 == 0;

Método programado en Lisp

editar
(defun leap-p (year)
  (or
   (and (zerop (mod year 4))
        (not (zerop (mod year 100))))
   (zerop (mod year 400))))

Método programado en Matlab

editar
year = input('Introduzca el año que desea averiguar si es bisiesto:');

if (mod(year,4) == 0) && (mod(year,100) ~= 0) || (mod(year,400)==0)
    disp('Es bisiesto');
else
    disp('No es bisiesto');
end

Método programado en Pascal

editar
function esBisiesto(anio:integer):boolean;
begin
   esBisiesto := (anio MOD 400 = 0) OR ((anio MOD 100 <> 0) AND (anio MOD 4 = 0));
// Si retorna esBisiesto=True , el año es bisiesto.
end;

Método programado en PSeInt (en perfil estricto)

editar
SubProceso Bisiesto(anio)
Si (anio MOD 400 = 0) o (anio MOD 4 = 0) y ~(anio MOD 100 = 0) Entonces		
   Escribir 'Es bisiesto.';
Sino
   Escribir 'No es bisiesto.';
FinSi
FinSubProceso

Método programado en PHP (opción 1)

editar
function esBisiesto($year=NULL) {
    $year = ($year==NULL)? date('Y'):$year;
    return ( ($year%4 == 0 && $year%100 != 0) || $year%400 == 0 ); // devolvemos true si es bisiesto
}

Método programado en PHP (opción 2)

editar
function esBisiesto($year=NULL) {
    return checkdate(2, 29, ($year==NULL)? date('Y'):$year); // devolvemos true si es bisiesto
}

Método programado en PL/I

editar
COMPROBAR_ANY_BISIESTO: PROC(ANY);        
DCL   ANY     PIC'(4)9';                  
DCL   NUMANY  BIN FIXED(15) INIT (0);     
DCL   MODANY  BIN FIXED(15) INIT (0);     
                                          
NUMANY = ANY;                             
                                          
IF MOD(NUMANY,4) = 0 THEN                 
   DO;                                    
      MODANY = MOD(NUMANY,400);           
      IF   MODANY = 100                   
         | MODANY = 200                   
         | MODANY = 300 THEN              
         TIPANY = 0;                      
      ELSE                                
         TIPANY = 1;                      
   END;                                   
ELSE                                      
   TIPANY = 0;                            
                                          
END COMPROBAR_ANY_BISIESTO;

Método programado en Perl

editar
sub EsBisiesto{
 my $Anyo=shift;
 my $Bisiesto=0;
 if($Anyo=~/^\d+$/){
  if   (!($Anyo % 400)){$Bisiesto=1}
  elsif(!($Anyo % 100)){$Bisiesto=0}
  elsif(!($Anyo % 4  )){$Bisiesto=1}
 }
 return $Bisiesto;
}

Método programado en Python

editar
def esBisiesto(year):
    return year % 4 == 0 and year % 100 != 0 or year % 400 == 0

Al igual que en Delphi, Python también tiene una función para averiguar si un año es bisiesto o no:

import calendar
def esBisiesto(year):
    return calendar.isleap(year)

Método programado en R

editar
TipoAnio = function(anio) {         # La funciones DIV y MOD en R son "%/%" y "%%"
           a0 <- "Anio_Regular" ; a4 <- "Anio_Bisiesto"       # Crear Etiqueta del anio
           anioS <- ifelse(anio %% 100 == 0, anio/100, anio)  # Tomar el siglo o el anio
           anioT <- ifelse(anioS %% 4  == 0, a4, a0)          # Asignar la etiqueta condicional
           data.frame(Anio = anio, Tipo = anioT) }            # Mostrar cuadro de resultado
# Por ejemplo evaluar c(1600,1700,1800,1900,1970,1972,2000,2016)
TipoAnio( c(1600,1700,1800,1900,1970,1972,2000,2016) )

Método programado en Ruby

editar
def es_bisiesto?(year)
    year % 4 == 0 && year % 100 != 0 || year % 400 == 0
end

Otra forma de saber si el año es bisiesto es usando la librería 'date':

require 'date'

def es_bisiesto?(year)
    Date.leap?(year)
end

Método programado en VBA, también válido para VB y ASP

editar
Public Function AnioBisiesto(ByVal ElAnio As Long) As Boolean
'Funcion para verificar si un año es bisiesto. Ju@nK 2009 www.juank.es
    Dim x(2) As Long
    x(0) = ElAnio Mod (4) ' tiene que ser 0
    x(1) = ElAnio Mod (100) ' no tiene que ser 0
    x(2) = ElAnio Mod (400) ' tiene que ser 0
    
    AnioBisiesto = (x(2) = 0 Or (x(0) = 0 And x(1) <> 0))
    
End Function

Método programado en VB.NET

editar
    ''' <summary>
    '''  El año es bisiesto S/N
    ''' </summary>
    ''' <param name="año">el año que se analiza</param>
    ''' <returns>un valor logico, True, si el año analizado es bisiesto, False, en caso contrario</returns>
    ''' <remarks>
    '''   <code> https://support.microsoft.com/es-es/kb/214019 </code>
    '''   <para> Cómo determinar si un año es un año bisiesto                                           </para>
    '''   <para> 1. Si el año es divisible por 4, vaya al paso 2. Si no es así, vaya al paso 5.         </para>
    '''   <para> 2. Si el año es divisible por 100, vaya al paso 3. Si no es así, diríjase al paso 4.   </para>
    '''   <para> 3. Si el año es divisible por 400, vaya al paso 4. Si no es así, vaya al paso 5.       </para>
    '''   <para> 4. El año es un año bisiesto (tiene 366 días).                                         </para>
    '''   <para> 5.El año no es un año bisiesto (tiene 365 días).                                       </para>
    '''   </remarks>
    Function IsBisiesto(ByVal año As Integer) As Boolean
        Dim bisiesto As Boolean = False ' (Valor por defecto) No es bisiesto
        If ((año Mod 4 = 0) And (año Mod 100 <> 0)) Or (año Mod 400 = 0) Then
            bisiesto = True 'Es bisiesto
        End If
        Return bisiesto
    End Function

Método programado en Visual FoxPro (opción 1)

editar
FUNCTION EsBisiesto(tnAnio)
    RETURN (tnAnio%4 = 0 AND tnAnio%100 # 0) OR tnAnio%400 = 0
ENDFUNC

Método programado en Visual FoxPro (opción 2)

editar
FUNCTION EsBisiesto(tnAnio)
    RETURN NOT EMPTY(DATE(tnAnio, 02, 29))
ENDFUNC

Método programado en ML

editar
fun bisiesto y = ((x mod 4 == 0 andalso x mod 100 != 0) orelse x mod 400 == 0);

Enlaces externos

editar