Explicare como funciona el Método para calcular que día será una fecha
determinada, es un poco difícil de entender, pero tratare de explicarlo paso a
paso para que no queden muchas dudas o al menos se den una idea de cómo
funciona
Antes que nada creamos el método
que nos regresara un número entero (ahorita veremos el por que).Este método
recibirá 3 parámetros enteros: día, mes y año.
public static int
DayOfWeek(int day, int
month, int year)
{
}
|
Luego, dentro
del método, crearemos un arreglo de una dimensión que nos dará el primer
coeficiente que nos servirá para hacer posible el calculo de días. El mes será
el primer coeficiente (C1) y su valor nos lo da la siguiente
tabla:
Enero
|
Feb.
|
Marzo
|
Abril
|
Mayo
|
Junio
|
Julio
|
Agosto
|
Sept.
|
Oct.
|
Nov.
|
Dic.
|
6
|
2
|
2
|
5
|
0
|
3
|
5
|
1
|
4
|
6
|
2
|
4
|
Los valores anteriores se dan
debido a cálculos matemáticos comparando meses que son similares, y que común mente se nombran meses
correspondientes
El concepto "meses
correspondientes" se aplica a aquellos meses del calendario que empiezan
en el mismo día de la semana. Por ejemplo,septiembre y diciembre son correspondientes ya que el 1 de septiembre cae en el mismo día de la semana que 1 de diciembre. Los meses son
correspondientes si el número de días entre ellos es divisible entre 7. Por
ejemplo febrero corresponde con marzo ya que febrero tiene 28 días, es decir, un número divisible entre 7, y 28 días son
exactamente cuatro semanas. Los meses se corresponden del siguiente modo:
En un año común
§ Septiembre y diciembre.
En un año bisiesto
§ Septiembre y diciembre.
Entonces lo primero que
agregaremos al método será:
//ponemos 0 como
numero de la posicion 0 del arreglo, ya que sera
//la posicion del
unico numero que jamas nos regresara
int[] mesCode = { 0, 6, 2, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };
|
Para obtener el Segundo coeficiente (C2), necesario
tomamos los dos últimos dígitos del año en cuestión y a ese número de dos
cifras le sumamos un cuarto del mismo (despreciando los decimales).
int result = year % 100 + (year % 100) / 4 + day +
mesCode[month];
|
Lo siguiente será calcular el
tercer coeficiente (C3), el cual nos será brindado al conocer el siglo del año
que se desea calcular, y dependiendo del siglo será asignado un número
especifico de acuerdo a la siguiente tabla:
1700…1799
|
1800…1899
|
1900…1999
|
2000…2099
|
2100…2199
|
2200…2299
|
+5
|
+3
|
+1
|
0
|
-2
|
-4
|
El año sobre 100 dara como
resultado el numero del siglo al que pertenece, y dependiendo del siglo se le sumara a la variable “result” el numero
correspondiente de acuerdo a la tabla anterior.
Entonces:
if (year /
100 == 17) result += 5;
else if (year / 100
== 18) result += 3;
else if (year / 100
== 19) result += 1;
else if (year / 100
== 20) result += 0;
else if (year / 100
== 21) result += -2;
else
if (year / 100 == 22) result += -4;
|
Ahora usaremos el método
EsBisiesto() que ya habíamos creado para saber si el año es bisiesto y así
obtener el cuarto coeficiente (C4), entonces veremos si es bisiesto y
quitaremos un dia si el mes es enero o
febrero
if
(EsBisiesto(year) && (month == 1 || month == 2))
result +=
-1;
|
Entonces hacemos el
calculo de la formula que es la siguiente determinando que el quinto
coeficiente(C5) es simplemente el numero en cuestion.
La formula es: (C1 + C2 + C3 + C4 + C5) % 7 . Por lo que
finalizamos el metodo asi:
return result % 7;
//ya que result iba acomulando (sumando) cada coeficiente
solamente para obtener su //modulo o residuo
|
Dependiendo del
numero devuelto entre 0 y 6 sera el dia de la semana resultante asi como lo
marca la siguiente tabla:
Lunes
|
Martes
|
Miércoles
|
Jueves
|
Viernes
|
Sábado
|
Domingo
|
1
|
2
|
3
|
4
|
5
|
6
|
0
|
ejemplo:
Calcular que dia
fue el 1 de mayo del 2007
reslult = (0 + 8 +
0 + 0 + 1) % 7 = 9 % 7 = 2
el 2 sera el numero
que regrese el metodo y le corresponde al martes, entonces sabemos que el 1 de
mayo del 2007 fue martes.
Ahora trabajaremos
con la forma para mandar llamar los metodos y
hacer que nuestro programa funcione.
Primero que nada
diseñamos nuestra interfaz visual, la mia fue de la siguiente manera.
Por los nombres no
se preocupen, cada etiqueta de texto constante se llama como originalmente
habian sido nombradas(label1, label2, etc.), la etiqueta que mostrara el
resultrado han sido alterada en sus propiedades, es decir, en BorderStyle
seleccionamos Fixed3D, en Autosize seleccionamos false y expandimos la etiqueta
hasta donde nos pareciera combeniente y dejamos en blanco la propiedad Text.
Los nombres de los
componentes que usaremos y manipularemos para que el programa funcione tienen nombres
logicos, por ejemplo la etiqueta se llama “lresult” el boton se llama
“bCalcular”, los numericUpDown inician con “nud”(nudDia, nudMes, nudAño).
Y la forma de
manipular la forma es la siguiente:
private void bCalcular_Click(object
sender, EventArgs e)
{
//pedimos
que entre la fecha y validamos que los datos
sean correctos
int d = Convert.ToInt32(nudDia.Value);
int m = Convert.ToInt32(nudMes.Value);
int a = Convert.ToInt32(nudAño.Value);
//Creamos array con
los dias de la semana
string[]
days = { "Domingo", "Lunes", "Martes",
"Miercoles",
"Jueves", "Viernes", "Sabado"
};
//esta
es la respuesta usando el metodo DayOfWeek()
lResult.Text = days[Matematicas.DayOfWeek(d,
m, a)];
}
|
podrias enviamr tu proyecto pro fa
ResponderEliminar