Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: MIG80 en 24 Julio 2010, 08:17 am



Título: Calendario perpetuo
Publicado por: MIG80 en 24 Julio 2010, 08:17 am
Hola a todos! :D

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  :rolleyes:, el resultado es el programa que está a continuación.

Código:
/*
  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  :)