Calcular el día de la semana C#

Nov 21, 2010 Codigos C# 18 comentarios

Esta vez les traigo un algoritmo clásico, que es de los primeros que hay que hacer al iniciarse en la programación, calcular el día de la semana (lunes, martes, miércoles…) a partir de una fecha (1/2/2021).

Lo primero es saber q esto se puede hacer de muchas formas, pero hay que tener en cuenta algunas cosas, como por ejemplo, que pasa cuando el año es bisiesto, cuando febrero tiene 29 días, etc…

Bueno, aquí les dejo un código que hice cuando estaba en primer año para resolver este problema, sencillo pero nada trivial. Si tienen alguna otra solución estaría encantado de que la compartieran, para ver entre todos cual es la mejor forma de hacer esta función.

Bueno, aquí les pongo el código, que consiste en un método: DayOfWeek(int dia, int mes, int año) y la clase Main, en la que hice un pequeño programa de consola para que introduzcan una fecha, y imprima el día de la semana correspondiente, incluso en mi facultad, había uno de mis compañeros, que podía hacer esto en la mente, en menos de 2 segundos, aún me pregunto como lo hacía, sin más, el código:

using System;
 
namespace DiaDeLaSemana
{
   class Class1
   {
      //Esta es la entrada principal del programa
      static void Main()
      {
         while(true)
         {
            Console.WriteLine('\n'+"Escribe una fecha "+'\n'+"
            Escribe un numero menor que '0' para salir");
            Console.Write("Dia: ");
            int d = int.Parse(Console.ReadLine());
            if(d<=0) break;
            Console.Write("Mes: ");
            int m = int.Parse(Console.ReadLine());
            if(m<=0) break;
            Console.Write("Año: ");
            int a = int.Parse(Console.ReadLine());
            if(a<=0) break;
 
            string[] days = {"Domingo", "Lunes", "Martes",
            "Miercoles", "Jueves", "Viernes", "Sabado"};
            int dia= DayOfWeek(d,m,a);
            Console.WriteLine("Ese dia es "+days[dia]);
         }
      }
 
      public static int DayOfWeek(int day, int month, int year)
      {
         int[] mesCode = {0,6,2,2,5,0,3,5,1,4,6,2,4};
         int result = year%100 + (year%100)/4 + day + mesCode[month];
 
         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;
 
         if(EsBisiesto(year) && (month==1 || month==2))
            result += -1;
 
         return result%7;
      }
 
      private static bool EsBisiesto(int a)
      {
         return (a%4==0 && a%100!=0) || a%400==0;
      }
   }
}

Bueno, la tarea va a ser entender lo que hace este método, y para que se necesita el array mesCode. Cualquier duda en los comentarios.

Compartir:

Relacionados

algunos artículos que te pueden interesar

18 comentarios

Forma parte de nuestra discusión y síguela de cerca

Me imagino que if(d<=0) break; es para que cuando ponga “0″ termine el programa o si pudiera explicar como funciona <=0 ya que no estoy familiarizado.

Gracias por el codigo

Autor: Pepe Lupe | Fecha: Nov 21, 2010.

ahhhhh perdon, ignora el comentario de arriba

Autor: Pepe Lupe | Fecha: Nov 21, 2010.

por favor me pueden ayudar con es ejemplo
RECURSIVIDAD
1. Los detectives de una agencia se envían todos los mensajes cifrados por motivos de seguridad. El algoritmo que están utilizando en la actualidad consiste en intercambiar cada vocal por la letra que la precede (si existe), por ejemplo: El resultado de codificar el mensaje está en León es: esáte n eóLn. Escribir un método recursivo para codificar mensajes.

Autor: arlin | Fecha: Dic 1, 2010.

buen post , fue de gran ayuda para mi. gracias

Autor: javier espinosa | Fecha: Dic 13, 2010.

Hola tengo una pregunta a que se refiere esto:
if(EsBisiesto(year) && (month==1 || month==2))

no entiendo esto &&

Autor: Herrold Real | Fecha: Sep 1, 2011.

El operador && es el “and” logico, se usa en expresiones booleanas, por ejemplo:
if(edad>0 && edad0 y edad<18.

Por otro lado el operador || es el operador "or" lógico, que devolverá true si se cumple alguna de las condiciones establecidas.

Autor: Tomy | Fecha: Sep 4, 2011.

Hola muxas gracias por la aclaracion……….

Tengo una pekeña pregunta sabes algo de los arreglos de objetos….seria bueno un tuto o me instruyeras un poco en ellos xfavos :D

Autor: Herrold Real | Fecha: Sep 5, 2011.

No tiene este mismo ejemplo pero que sea en formularios (Form) ya que por console se me dificulta

Autor: carlos | Fecha: Feb 6, 2012.

tengo el siguiente codigo:

int del = Convert.ToInt32(num_1.Value);
int al = Convert.ToInt32(num_2.Value);

for (int i = del; i <= al; i++)
{
cb_tablas.Items.Add("Tabla de multiplicar del "+i);

}

lo que ese codigo hace es que tengo 2 numeric up down entonces yo en ellos marco el inicio de las tablas que quiero ver, al darle click en el botn cargar se me despliegan en un combo box las tablas, elemplo: del 0 al 1 el combo box se llena con la informacion tabla de miltiplicar del 0 , tabla de multiplicar de 1, hasta ahi todo perfecto, lo que ocupo es que al seleccionar alguna opcion del combo se me despliegue la tabla en un list box, ejemplo: selecciono la opcion tabla de multiplicar del 1, en el list box me aparezca la tabla del 1 completa, en realidad no c como hacer eso, gracias

NECESITO AYUDA GRACIAS

Autor: JOSE | Fecha: Feb 6, 2012.

Hola!!! te puedo ayuda si quieres….dame tu email y nos comunicamos!!

hhrb2011@hotmail.com
facebook.com/hreal92

Autor: Herrold Real | Fecha: Feb 6, 2012.

Hola compañeros…
Saben estoy muy animado en aprender C# ya que iba a ser contratado en un exelente trabajo con muchas posiblidades sobresalir y cuando me dijieron, sabes C# ufff!!!! dije nop, no se..

Me dijieron muchas gracias, siga participando me senti de lo peor, serian tan amables de pasarme todos los manuales, ejercicios etc, que tengan…

Quiero regresar a ese trabajo, ya tenia en mente aprender C# desde hace tiempo, creo que me quiero casar con C#..

Autor: llerald | Fecha: Feb 7, 2012.

[...] Hola  que tal?, aqui de nuevo, para presentarles la explicacion (a mi manera) de los calculos del algoritmo para calcular el dia de la semana desarrollado por un cubano (http://www.puntopeek.com/codigos-c/calcular-el-dia-de-la-semana-c/). [...]

Autor: Algoritmo para calcular el dia de la semana(Explicacion) « mayraguilarm777 | Fecha: Feb 13, 2012.

gracias me gusto este ejercicio quisiera ejemplos con el codigo para no repetir console clear, gracias buen dia

Autor: xavi alexander | Fecha: Feb 29, 2012.

Hola Llerald y Xavi seria un placer para mi poder ayudarles a aprender e incurcionar en este maravilloso lenguaje, ustedes mandan y me dicen por que medios nos comunicamos, anteriormente ya deje mi Facebook y mi Correo para cualquier cosa.

Bye.

Autor: Herrold Real | Fecha: Mar 4, 2012.

Que es c#?

Autor: Jennifer Montor Aguilar | Fecha: Abr 2, 2012.

C# o CSharp es un lenguaje de programacion en .NET que es muy reciente apenas en el 2002 si mal no recuerdo lo lanzaron e incluyeron en el VS y es un lenguaje muy muy muy bueno, es aun, bueno en mi opinion, mejor que Java, si gustan dentro de poco estare posteando algunas cosillas en mi Blog acerca de C#

Autor: Herrold Rel | Fecha: Abr 5, 2012.

necesito exactamente el mismo programa, solo que a mi no me lo pidieron en consola, no se como hacerle, me podrian ayudar po rfavor?

Autor: marian | Fecha: Feb 9, 2013.

@mariam, puedes ver un tutorial que escribi hace un tiempo sobre como trabajar con la consola: Aplicaciones de Consola en C#. Solo tienes que agregar este codigo y un poco de interaccion. Suerte

Autor: Tomy | Fecha: Feb 21, 2013.

Escribe tu comentario

Requerido.

Requerido. No público.

Si tienes alguno.