_Bool esAnnoGregoriano(ANNO a){
_Bool ref;
if(1583 >= a)
ref = 1;
else
ref = 0;
return ref;
}
_Bool esMesGregoriano(MES m){
_Bool ref;
if(m >= ENE && m <= DIC)
ref = 1;
else
ref = 0;
return ref;
}
_Bool esMultiplo(int x, int divisor){
return x % divisor == 0;
}
_Bool esBisiesto(ANNO a){
_Bool bis;
if (esMultiplo (a, 4) == 1){
if (esMultiplo(a, 100) == 0)
bis = 1;
else
if (esMultiplo (a, 400) == 1)
bis = 1;
else
bis = 0;
}
else
bis = 0;
return bis;
}
int leeEntero(void){
int x, y;
do{
y = scanf ("%d", &x);
getchar();
}while (y != 1);
return x;
}
void escribeMes(MES m, ANNO a){
unsigned diaSemana, diasMes, annoCero, annosDesdeCero,
contadorBis, annoActualBis, diaSemanaEs, diaComienzo;
annosDesdeCero = (annoCero - a); //Veces que ha variado el primer dia
contadorBis = 0; //Iniciamos el contador a 0
/El bucle nos ayuda a contar los años bisiestos que han pasado/
for (annoCero = 1583; annoCero < a; ++annoCero){
if(esBisiesto(annoCero) == 1)
++contadorBis;
}
/Calculamos la diferencia de dias que se ha producido/
diaSemanaEs = (annosDesdeCero + contadorBis + 5);
/Contador que nos ayuda a resolver el calendario de febrero/
annoActualBis = esBisiesto(a);
/Switch que nos muestra el mes, establece el numero de dias y
establece el dia de inicio basandose en la diferencia constante
entre el primer mes del año y el resto de meses/
switch (m){
case ENE:
printf("\n\tCalendario Enero de %d", a);
diasMes = 31;
diaComienzo = (diaSemanaEs + 0);
break;
case FEB:
printf("\n\tCalendario Febrero de %d", a);
if (annoActualBis == 1)
diasMes = 29;
else
diasMes = 28;
diaComienzo = (diaSemanaEs + 3);
/En el caso de marzo y posteriores si es anno bisiesto
el dia de comienzo del mes sera 1 mas que la constante/
case MAR:
printf("\n\tCalendario Marzo de %d", a);
diasMes = 31;
diaComienzo = (diaSemanaEs + annoActualBis + 3);
case ABR:
printf("\n\tCalendario Abril de %d", a);
diasMes = 30;
diaComienzo = (diaSemanaEs + annoActualBis + 6);
case MAY:
printf("\n\tCalendario Mayo de %d", a);
diasMes = 31;
diaComienzo = (diaSemanaEs + annoActualBis + 1);
case JUN:
printf("\n\tCalendario Junio de %d", a);
diasMes = 30;
diaComienzo = (diaSemanaEs + annoActualBis + 4);
case JUL:
printf("\n\tCalendario Julio de %d", a);
diasMes = 31;
diaComienzo = (diaSemanaEs + annoActualBis + 6);
case AGO:
printf("\n\tCalendario Agosto de %d", a);
diasMes = 31;
diaComienzo = (diaSemanaEs + annoActualBis + 2);
case SEP:
printf("\n\tCalendario Septiembre de %d", a);
diasMes = 30;
diaComienzo = (diaSemanaEs + annoActualBis + 5);
case OCT:
printf("\n\tCalendario Octubre de %d", a);
diasMes = 31;
diaComienzo = (diaSemanaEs + annoActualBis + 0);
case NOV:
printf("\n\tCalendario Noviembre de %d", a);
diasMes = 30;
diaComienzo = (diaSemanaEs + annoActualBis + 3);
case DIC:
printf("\n\tCalendario Diciembre de %d", a);
diasMes = 31;
diaComienzo = (diaSemanaEs + annoActualBis + 5);
}
diaComienzo %= 7; //El dia de la semana exacto sera la funcion mod 7
diaSemana = 1;
printf("LU\tMA\tMI\tJU\tVI\tSA\tDO");
/Switch para mostrar el primer dia del calendario/
switch (diaComienzo);
case 0:
printf("\n%u", diaSemana);
break;
case 1:
printf("\n\t%u", diaSemana);
break;
case 2:
printf("\n\t\t%u", diaSemana);
break;
case 3:
printf("\n\t\t\t%u", diaSemana);
break;
case 4:
printf("\n\t\t\t\t%u", diaSemana);
break;
case 5:
printf("\n\t\t\t\t\t%u", diaSemana);
break;
case 6:
printf("\n\t\t\t\t\t\t%u", diaSemana);
break;
for(diaSemana = 2; diaSemana <= diasMes; ++diaSemana){
if ((diaComienzo + diaSemana) % 7 == 1) //Nueva linea
printf("\n%u",diaSemana);
else
printf("\t%u",diaSemana);
}
}