Ir al contenido principal

C: Ejemplos: Congruencia de Zeller (nivel básico) ...

La Congruencia de Zeller es un algoritmo que se atribuye al matemático alemán Julius Christian Johannes Zeller que vivió en el siglo XIX.

Este algoritmo nos permite determinar el día de la semana que le corresponde a una fecha determinada del calendario Gregoriano.

La fórmula que nosotros usaremos (con algunas modificaciones respecto de la original para poder usarla en  informática) es la siguiente:


Donde h es el día de la semana (entre 0 y 6), J es año/100 (la centuria) y K es año mod 100 (el año de la centuria). Y hay que tener en cuenta que los meses de enero y febrero cuentan como el mes 13 y 14 del año anterior.

Ahora que tenemos la fórmula, programemos el algoritmo en C mediante el uso de una función:



Analicemos el código paso a paso:

  • Tenemos en cuenta el caso de enero y febrero: Dijimos que estos meses corresponden a los meses 13 y 14 del año anterior por lo que los asignamos como corresponde (mes + 12 , que dará 13 para enero y 14 para febrero) y le restamos 1 al año ya que son meses del año anterior. En caso contrario al mes le restamos dos para que marzo sea el mes 1 y así sucesivamente.
  • Calculamos K y J: Al momento de escribir la fórmula dijimos que K es año mod 100 y J es año div 100 por lo que realizamos estos dos cálculos.
  • Aplicamos la fórmula: Copiamos la fórmula que copiamos al comienzo.

Ahora si quisiéramos que el programa nos muestre por pantalla el día correspondiente al entero entre 0 y 6 que obtuvimos con esta función podríamos simplemente hacer un switch como éste:



Donde dependiendo del entero que nos devolvió la función Zeller, escribe el día correspondiente, teniendo en cuenta que el 0 corresponde al domingo


Luego se llama a las funciones como corresponde dentro del main y tendríamos nuestro programa listo. Para finalizar veamos qué día es hoy según el programa cuando lo ejecutamos:


Y, en efecto, es viernes...


Espero que les haya servido, para los que quieran el código de esta implementación pueden descargarlo desde el siguiente link: descargar zeller.c

Hasta la próxima.


Português:

A congruência de Zeller é um algoritmo atribuído ao matemático alemão Julius Christian Johannes Zeller, que viveu no século XIX.

Esse algoritmo nos permite determinar o dia da semana que corresponde a uma data específica do calendário gregoriano.

A fórmula que usaremos (com algumas modificações em relação ao original a ser usado na computação) é a seguinte:



Onde h é o dia da semana (entre 0 e 6), J é ano / 100 (o século) e K é ano mod 100 (o ano do século). E tenha em mente que os meses de janeiro e fevereiro contam como o 13º e o 14º mês do ano anterior.

Agora que temos a fórmula, programamos o algoritmo em C usando uma função:




Vamos analisar o código passo a passo:

Nós consideramos o caso em janeiro e fevereiro: Dissemos que estes meses correspondem aos meses 13 e 14 no ano passado, de modo que o atribuído em conformidade (mês + 12, que vai dar 13-14 janeiro a fevereiro) e subtrair 1 um ano desde que são meses do ano anterior. Caso contrário, o mês em que subtrairmos dois para março é o mês 1 e assim por diante.
Calculamos K e J: No momento em que escrevemos a fórmula, dissemos que K é o ano mod 100 e J é ano div 100, então realizamos esses dois cálculos.
Aplicamos a fórmula: copiamos a fórmula que copiamos no início.

Agora, se quisermos que o programa nos mostre por tela o dia correspondente ao número inteiro entre 0 e 6 que obtivemos com essa função, poderíamos simplesmente fazer uma troca como esta:




Onde dependendo do inteiro que retornou a função Zeller, escreva o dia correspondente, levando em conta que o 0 corresponde ao domingo


Então as funções são chamadas de acordo no principal e nós teríamos nosso programa pronto. Para terminar vamos ver que dia é hoje de acordo com o programa quando o executamos:



E, de fato, é sexta-feira ...


Espero que você tenha servido, para quem quiser o código desta implementação pode baixá-lo do seguinte link: download zeller.c

Até a próxima.

English:

The Congruence of Zeller is an algorithm that is attributed to the German mathematician Julius Christian Johannes Zeller who lived in the nineteenth century.

This algorithm allows us to determine the day of the week that corresponds to a specific date of the Gregorian calendar.

The formula that we will use (with some modifications with respect to the original to be used in computing) is the following:



Where h is the day of the week (between 0 and 6), J is year / 100 (the century) and K is year mod 100 (the year of the century). And keep in mind that the months of January and February count as the 13th and 14th month of the previous year.

Now that we have the formula, we program the algorithm in C by using a function:




Let's analyze the code step by step:

We take into account the case of January and February: We said that these months correspond to the months 13 and 14 of the previous year so we assigned them accordingly (month + 12, which will give 13 for January and 14 for February) and we subtract 1 a year since they are months of the previous year. Otherwise the month we subtract two for March is month 1 and so on.
We calculate K and J: At the time of writing the formula we said that K is year mod 100 and J is year div 100 so we perform these two calculations.
We apply the formula: Copy the formula that we copied at the beginning.

Now if we want the program to show us by screen the day corresponding to the integer between 0 and 6 that we obtained with this function we could simply make a switch like this:




Where depending on the integer that returned the Zeller function, write the corresponding day, taking into account that the 0 corresponds to Sunday


Then the functions are called accordingly in the main and we would have our program ready. To finish let's see what day it is today according to the program when we execute it:



And, in effect, it's Friday ...


I hope you have served, for those who want the code of this implementation can download it from the following link: download zeller.c

Until next time.


Comentarios

  1. Ese switch no tiene mucho sentido. Un array (de una sola dimensión) hubiera sido una solución más elegante.

    ResponderEliminar
  2. Si coges un calendario perpetuo y pruebas 01 01 1600....no da la mismo....luego es erroneo

    ResponderEliminar
  3. Creo que en el caso de Enero Febrero, es mes=mes+10, sino no funciona para estos meses.

    ResponderEliminar
  4. Para que se suma 700, siendo que eso no afecta en nada al modulo ?

    ResponderEliminar
  5. lo mismo me pregunto yo, de donde sale ese 700?

    ResponderEliminar
  6. tu código tiene un pequeño fallo en la función que devuelve el dia de la semana ;la variable m para valor 1 y2 se suma con 10,no con 12

    ResponderEliminar
  7. El error es que no puso paréntesis en 26*(mes-2). Y si el mes no es febrero ni enero no sé por qué hay que restarle dos al mes. En ese sentido nunca habría mes 11 ni 12. Ya se esta restando en la formula

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

C: Conversiones de tipo (casting) en C...

El casting o simplemente cast  nos permite hacer una conversión explícita de un tipo de dato a otro, a criterio del programador siempre y cuando estos tipos sean compatibles. Este cast se realiza a través de un operador de conversión de tipos (type casting operator) y es un recurso a tener en cuenta ya que hay situaciones en que nos puede resultar de gran utilidad. Hacer uso de un cast es tan sencillo como poner (tipo de dato)  delante de la expresión o variable a convertir. Veamos un ejemplo: Declaramos una variable de tipo int con un identificador tan creativo como "a" y le realizamos diferentes cast a a para mostrarlo como si fuera un float, un double y un char en un printf. Lo que obtendríamos en pantalla sería lo siguiente: Donde tenemos el valor de nuestro a, a convertido en float y double (mostrándolo con 3 cifras decimales) y a convertido en char. Si vemos este último caso, al hacer la conversión de "a" a char toma a como el código ascii de

Algoritmos: Resolución de problemas y refinamientos en pseudocódigo...

En otras entradas, vimos las partes que debe tener nuestro algoritmo en pseudocódigo y las estructuras que utilizaremos para resolverlo. Ahora llega el turno de implementar todo en conjunto para dar origen a nuestra creación. Pero ¿cómo resolvemos un problema así? Para hacerlo, utilizaremos lo que llamamos refinamientos sucesivos. Este concepto consiste en dividir el problema en subproblemas más pequeños y a estos, a su vez, en otros más pequeños; y así sucesivamente hasta que la solución de los últimos sea trivial, sencillo de resolver. Luego usaremos todas las soluciones obtenidas para armar la solución de nuestro problema mayor. Este principio, tiene base en parte de la técnica divide and conquer (dependiendo de la traducción: "divide y vencerás") que es una de las muchas técnicas de resolución de algoritmos existentes. Como vemos, al dividir el problema en otros más pequeños y más fáciles de resolver, podemos pasar de un problema complicado a uno cuya solución es much