Translate

martes, 8 de enero de 2013

Dia del Año en C.

#include < stdio.h >

void leer_entrada(int *pm, int *pd, int *pa);
int convertir(int mm, int dd, int aa);

int main()
{
    int mm,dd,aa;
    int dia_semana;
   
    static char *diasemana[] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Sabado" };
    static char *mes[] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" };
   
    printf("Rutina de conversion de  fecha \n Para parar, introducir 0 0 0");
   
    leer_entrada(&mm, &dd, &aa);
   
    //Convertir fecha a dia numerico de la semana
    while (mm > 0)
    {
        dia_semana = convertir (dd, mm, aa);
        printf("\n El dia fue %s, %d %s de %d \n",diasemana[dia_semana], dd,mes[mm-1], aa);
        leer_entrada(&mm, &dd, &aa);
    }
}

void leer_entrada(int *pm, int *pd, int *pa) //Convertir una fecha en el dia de la semana.
{
    printf("\n Introducir MM DD AAAA: ");
    scanf("%d %d %d", pm, pd, pa);
    system("clear"); //Sirve para limpiar la pantalla en Linux.
    return;
}

int convertir (int mm, int dd, int aa) //Convertir una fecha en el dia de la semana.
{
   
long ndias; //Num de dias desde el comienzo de 1900.
long nciclos; //Num de cliclos de 4 años despues de 1900.
int nanios; //Num de años despues del ultimo cilico de 4 años.
int dia; //Dia de la semana {0,1,2,3,4,5,6}

//Conversiones numericas   
aa-=1900;
ndias = (long) (30.42 * (mm - 1)) + dd; //Dia aprox del año.

if(mm == 2) ++ndias; //Ajuste para febrero.
if((mm > 2) && (mm < 8)) --ndias; //Ajuste para marzo-julio.
if((aa % 4 == 0) && (mm > 2)) ++ndias; //Ajuste para el año bisiesto.

nciclos = aa / 4; //Ciclos de 4 años despues de 1900.

ndias += nciclos * 1461; //Añadir dias por ciclos de 4 años.

nanios = aa % 4; //Años despues del ultimo ciclo de 4 años.

if(nanios > 0) //Añadir dias por años despues del ultimo ciclo.
  ndias += 365 * nanios +1;
  
if(ndias > 59) --ndias; //Ajustar para 1900 (No año bisiesto).
  dia = ndias % 7;
 
  return(dia);
}

No hay comentarios: