miércoles, 9 de julio de 2014

Congruencia de Zeller

Ejercicio 1:

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.



Falta el texto Alt de la imagen

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


Introduccion

Hola a todos, hoy empezaré a subir ciertos ejercicios en Java (Eclipse), los cuales no se encuentran tan fácilmente, espero que sean de ayuda para todos quienes como yo, recién empiezan en esto que no es simplemente una ciencia sino que es un arte... como lo es programar :)