martes, 12 de junio de 2012

Programa que Calcula Dia de la Semana


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
§  Enero y octubre.
§  Febrero, marzo y noviembre.
§  Abril y julio.
§  Mayo, junio y agosto no se corresponden con ningún mes.
En un año bisiesto
§  Enero, abril y julio.
§  Febrero y agosto.
§  Marzo y noviembre.
§  Mayo, junio y octubre no se corresponden con ningún mes.



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)];
        }

1 comentario: