Congruencia de Zeller
Realice un programa que imprima los días de un mes y de un año ingresados por teclado, utilizando la congruencia de Zeller, el mismo deberá considerar si el año ingresado es bisiesto y los días que pueden tener cada mes, además debe de presentar los últimos días del mes anterior (si es que hay disponibles) y los primeros días del mes siguiente según el mes que sea este.
Consideraciones
Para calcular la congruencia de Zeller, se parte de una fecha del calendario gregoriano o Juliano como en nuestro ejercicio, se consideran como tres enteros: año, mes (1=enero, 12=diciembre) y día. Pero solo se lo realizara ingresando mes y año.
Los meses de Enero y Febrero serán equivalentes a los meses 13 y 14 del mes anterior.
q = es el día del mes
m = es el mes
Se debe obtener los valores de:
j = es la centura (año / 100)
k = es el año de la centuria (año % 100)
A partir de ahí, basta con aplicar la fórmula.

h = dia devuelto (0 = Sabado, 1 = Domingo, 2 = Lunes, 3 = Martes, 4 = Miercoles, 5 = Jueves, 6 Viernes)
Desarrollo:
Java (Eclipse Standard/SDK)
package congruencia;
public class trabajo1 {
public static void main(String[] args) {
// INGRESO AÑO Y MES
int aa = Integer.parseInt(javax.swing.JOptionPane.showInputDialog("Ingrese el año",""));
int mm = Integer.parseInt(javax.swing.JOptionPane.showInputDialog("Ingrese el mes",""));
// DIAS PERMITIDOS POR MES
int dperm = 0; // Variable para los días permitidos del mes (28, 29, 30 o 31)
switch (mm){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
dperm = 32; break;
case 4:
case 6:
case 9:
case 11: dperm = 31; break;
case 2:
if (aa%4 == 0 & aa%100 != 0 || aa %400 == 0){
dperm = 30;
} else{
dperm = 29;
}
break;
}
// CONDICION SI EL MES ES 1 O 2
if (mm <= 2){
mm += 12;
aa -= 1;
}
// OBTIENE CENTURIA y AÑO DE CENTURIA....
int j = aa / 100;
int k = aa % 100;
// DIA DE INICIO
int h = (1+(26*(mm+1))/10+k+k/4+j/4+5*j)%7;
System.out.println("Sa\tDo\tLu\tMa\tMi\tJu\tVi");
// OBTIENE LOS DIAS
int dias = 0, salto = 0; // salto es para cambiar de línea
int mesSig = 0; // Dias del mes siguiente
int cal[] = new int [42]; // Guarda los días encontrados
for (int i = h; i < cal.length; i++){
dias++;
if (dias < dperm){ // DIAS DEL MES
cal[i] = dias;
} else{ // DIAS DEL SIGUIENTE MES
mesSig++;
cal[i] = mesSig;
}
}
// OBTIENE LOS DIAS DEL MES ANTERIOR
if (h != 0){
int dMesAnt = 0;
switch (mm){
case 3:
if (aa%4 == 0 & aa%100 != 0 || aa %400 == 0){
dMesAnt = 29;
} else{
dMesAnt = 28;
}
break;
case 4: dMesAnt = 31; break;
case 5: dMesAnt = 30; break;
case 6: dMesAnt = 31; break;
case 7: dMesAnt = 30; break;
case 8: dMesAnt = 31; break;
case 9: dMesAnt = 31; break;
case 10: dMesAnt = 30; break;
case 11: dMesAnt = 31; break;
case 12: dMesAnt = 30; break;
case 13: dMesAnt = 31; break;
case 14: dMesAnt = 31; break;
}
for (int i = h - 1; i >= 0; i--){
cal[i] = dMesAnt;
dMesAnt -= 1;
}
}
// MUESTRA RESULTADO
for (int i = 0; i < cal.length; i++){
System.out.print(cal[i]+"\t");
salto++;
if (salto == 7){
System.out.println("");
salto = 0;
}
}
}
}
Capturas:
1. Ingresamos el Año
2. Ingresamos el mes
3. El resultado será los días del mes ingresado segun el año, junto a los días del mes anterior y los del mes siguiente.
David Arévalo Castro
Estudiante Licenciatura en Sistemas de Información
No hay comentarios:
Publicar un comentario