martes, 24 de abril de 2012

Calcular el día de la semana a partir de una fecha en Lenguaje C

Para calcular el día de la semana (Lunes, Martes, Miércoles...) a partir de una fecha del tipo 02/03/2010, hay que hacer uso del siguiente algoritmo.


Donde:

d = día de la semana
A = Año
DM = Días transcurridos hasta antes del primer día del mes
D = Día
% = Módulo

En primer lugar debemos tener en cuenta si el año es bisiesto o no. Por lo que para calcular el DM%7 deberemos usar una tabla u otra:

Meses E F M A M J J A S O N D
Año regular 0 3 3 6 1 4 6 2 5 0 3 5
Año bisiesto 0 3 4 0 2 5 0 3 6 1 4 6

Vamos a realizar el programa en C:

{

//Declaracion de vectores y variables
int regular[]={0,3,3,6,1,4,6,2,5,0,3,5};
int bisiesto[]={0,3,4,0,2,5,0,3,6,1,4,6};
int d,m,a;

//Para simplificar el algoritmo vamos a dividirlo en partes más pequeñas

int result1,result2,result3,result4,result5;

printf("Introduce un dia de la semana en numero: ");
scanf("%d",&d);
printf("Introduce un mes en numero: ");
scanf("%d",&m);
printf("Introduce un anyo en numero: ");
scanf("%d",&a);

//comprobamos primero si el año es bisiesto o es regular
//si es bisiesto, asignamos a m la posición del vector bisiesto -1
//si es regular, asignamos a m la posición del vector regular -1

if((a%4==0) && !(a%100==0))
{
    m=bisiesto[m-1];
}
else if (a%400==0)
{
    m=bisiesto[m-1];
}
else
{
    m=regular[m-1];
}

//Resolvermos la fórmula poco a poco

result1=(a-1)%7;
result2=(a-1)/4;
result3=(3*(((a-1)/100)+1))/4;
result4=(result2-result3)%7;
result5=d%7;
d=(result1+result4+m+result5)%7;

//resuelto el dia, con un switch case mostramos en pantalla lo que corresponda.

switch(d)
{
    case 0:
        printf("Domingo\n");
        break;
    case 1:
        printf("Lunes\n");
        break;
    case 2:
        printf("Martes\n");
        break;
    case 3:
        printf("Miercoles\n");
        break;
    case 4:
        printf("Jueves\n");
        break;
    case 5:
        printf("Viernes\n");
        break;
    case 6:
        printf("Sabado\n");
        break;
}
system("PAUSE");

}








































                   

5 comentarios:

  1. Me recontra q sirvio gracias :)

    ResponderEliminar
  2. El algoritmo devuelve 0 para el lunes, 1 para el martes... y 6 para el domingo, ojo con eso.
    ZoeDoGaM --> www.bitcoinxt.net

    ResponderEliminar
  3. ¿Que funciona tienen estos numeros 0,3,3,6,1,4,6,2,5,0,3,5 ?

    ResponderEliminar
  4. hola!!muchas gracias por la fuente...muy util..funciono a la perfeccion..lo programe en un FPGA y de maravilla...de nuevo muchas gracias por el aporte

    ResponderEliminar