Hola a todos!
Bueno al punto, vagando por la la Internet me encontré con una página que da el calendario (calendario gregoriano) de cualquier año y quise hacer un programa en C que haga lo mismo
, el resultado es el programa que está a continuación.
/*
Calendario perpetuo.
Autor: czealt
fecha: julio de 2010
*/
#include <stdio.h>
#include <stdlib.h>
#define year_ref 2010
#define diainicio Viernes
enum Dia{ Domingo, Lunes, Martes, Miercoles, Jueves, Viernes, Sabado };
enum Mes{ Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Setiembre,
Octubre, Noviembre, Diciembre };
int esbisiesto(int year);
int cdiasmes(int mes,int year);
void imprimirmes(int mes, int year, int diaunomes);
int main(int argc, char *argv[])
{
int a, year, ai=year_ref, af, ndias=0, dia1enero, mes, diaunomes;
if(argc < 2)
{
printf("Uso: %s A¤o\n", argv[0]);
return 0;
}
year = atoi(argv[1]);
af = year-1;
if(year < year_ref)
{
ai = year;
af = year_ref-1;
}
for(a = ai; a <= af; a++)
ndias += esbisiesto(a)?2:1;
dia1enero = (diainicio + ((year >= year_ref)?1:-1) * ndias) %7;
if(dia1enero < 0)
dia1enero += 7;
printf("Calendario del a¤o %d\n", year);
diaunomes = dia1enero;
for(mes = Enero; mes <= Diciembre; mes++)
{
imprimirmes(mes, year, diaunomes);
diaunomes = (diaunomes + cdiasmes(mes, year)) %7;
}
return 0;
}
int esbisiesto(int year)
/*
"Un año es bisiesto si es divisible por 4, excepto el último de cada siglo
(aquellos divisibles por 100) que para ser bisiestos, tambien deben ser
divisibles por 400."
*/
{
return (year%4) == 0 && ((year%100) != 0 || (year%400) == 0);
}
int cdiasmes(int mes,int year)
/*
Determina la cantidad de dias que trae cada mes.
*/
{
static const int diasmes[] = {31,28,31,30,31,30,31,31,30,31,30,31};
int cdias = diasmes[mes];
if(mes == Febrero && esbisiesto(year))
cdias++;
return cdias;
}
void imprimirmes(int mes, int year, int diaunomes)
{
static const char *strmes[]={"Enero","Febrero","Marzo","Abril","Mayo",
"Junio","Julio","Agosto","Setiembre","Octubre",
"Noviembre","Diciembre"};
const int diasmes = cdiasmes(mes,year);
int c, dia;
printf("\n%s\n D L M M J V S\n", strmes[mes]);
dia = (35 - diaunomes) % 35 + 1;
for(c = 35; c; c--)
{
if(dia > diasmes)
printf(" ");
else
printf("%3d", dia);
if((c - 1) % 7 == 0) putchar('\n');
dia = dia % 35 + 1;
}
}
Si tienen mejoras y/o criticas al codigo me gustaria conocerlas.
Saludos