elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Programa para averiguar el dia de la semana
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Programa para averiguar el dia de la semana  (Leído 1,397 veces)
Caster


Desconectado Desconectado

Mensajes: 787


Ver Perfil WWW
Programa para averiguar el dia de la semana
« en: 18 Julio 2013, 15:40 pm »

Buenas, en un libro que estoy leyendo viene un programa, que a partir de una fecha base (Lunes, Enero 1, 1900) averigua el dia de la semana introduciendo dia mes y año. El programa entero es el siguiente:

Código
  1. #include <stdio.h>
  2.  
  3. void leerentrada(int *pm, int *pd, int *pa);
  4. int convertir(int mm, int dd, int aa);
  5.  
  6. int main()
  7. {
  8.    int mm, dd, aa;
  9.    int dia_semana;
  10.  
  11.    static char *diasemana[] = {    "Domingo",
  12.                                    "Lunes",
  13.                                    "Martes",
  14.                                    "Miércoles",
  15.                                    "Jueves",
  16.                                    "viernes",
  17.                                    "Sabado"    };
  18.  
  19.    static char *mes[] = {  "Enero",
  20.                            "Febrero",
  21.                            "Marzo",
  22.                            "Abril",
  23.                            "Mayo",
  24.                            "Junio",
  25.                            "Julio",
  26.                            "Agosto",
  27.                            "Septiembre",
  28.                            "Octubre",
  29.                            "Noviembre",
  30.                            "Diciembre" };
  31.  
  32.    printf("Rutina de conversión de fecha\n Para parar, introducir 0 0 0");
  33.  
  34.    leerentrada(&mm, &dd, &aa);
  35.  
  36.    while (mm > 0)
  37.    {
  38.        dia_semana = convertir (mm, dd, aa);
  39.        printf("\n%s, %s %d, %d", diasemana[dia_semana], mes[mm-1], dd, aa);
  40.        leerentrada(&mm, &dd, &aa);
  41.    }
  42.    return 0;
  43. }
  44.  
  45. void leerentrada(int *pm, int *pd, int *pa)
  46. {
  47.    printf("\n\nIntroducir mm dd aaaa: ");
  48.    scanf("%d %d %d", pm, pd, pa);
  49. }
  50.  
  51. int convertir (int mm, int dd, int aa)
  52. {
  53.    long int ndias;     // numero de dias desde el comienzo de 1900
  54.    long int nciclos;   //numero de ciclos de 4 años despues de 1900
  55.    int nanios;         //numero de años despues del ultimo ciclo de 4 años
  56.    int dia;            //dia de la semana (0, 1, 2, 3, 4, 5 o 6)
  57.  
  58.    aa -= 1900;
  59.  
  60.    ndias= (long) (30.42 * (mm - 1) + dd); //dia aproximado del año
  61.  
  62.    if (mm == 2) ++ndias;   //ajuste para febrero
  63.    if ((mm > 2) && (mm < 8)) --ndias;  //ajuste para marzo-julio
  64.    if ((aa % 4 == 0) && (mm > 2)) ++ndias; //ajuste para el año bisiesto
  65.  
  66.    nciclos = aa / 4;   //ciclos de 4 años a partir de 1900
  67.  
  68.    ndias += nciclos * 1461;    //añadir dias por ciclos de 4 años
  69.  
  70.    nanios = aa % 4;        //años despues del ultimo ciclo de 4 años
  71.  
  72.    if (nanios > 0) ndias += 365 * nanios + 1; //añadir dias por años despues del ultimo ciclo
  73.  
  74.    if (ndias > 59) --ndias; //ajustar para 1990 (NO años bisiesto)
  75.  
  76.    dia = ndias % 7;
  77.  
  78.    return (dia);
  79. }

el codigo esta copiado exactamente igual que en libro, con los comentarios para explicarlo.

Me ha costado, pero he entendido, en parte, la logica del programa, porque lo que no entiendo es como hace la funcion convertir para sacar el dia de la semana, de esa funcion la unica linea que entiendo es esta:

Código
  1. aa -= 1900;

Lo que hace es sacar los años que han pasado desde el año 1900 hasta hoy, pero a partir de ahi no entiendo nada de nada y queria pedir a ver si alguien me lo explica de alguna manera mas clara que en libro.


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Programa para averiguar el dia de la semana
« Respuesta #1 en: 18 Julio 2013, 15:59 pm »

Código
  1. ndias= (long) (30.42 * (mm - 1) + dd); //dia aproximado del año

Enero: 31 días
Febrero: 28 días
Marzo: 31 días
Abril: 30 días
...

Total días por año: 365 días ( 12 meses )
Media de días por mes: 365 / 12 = 30.41666

Para calcular el número de días calcula la media de días por mes y lo multiplica por el número de mes que hayas puesto.

Luego hace un ajuste rápido para los meses de menos de 31 días y ajusta también posibles años bisiestos y listo.


En línea

Caster


Desconectado Desconectado

Mensajes: 787


Ver Perfil WWW
Re: Programa para averiguar el dia de la semana
« Respuesta #2 en: 18 Julio 2013, 16:06 pm »

Código
  1. ndias= (long) (30.42 * (mm - 1) + dd); //dia aproximado del año

Enero: 31 días
Febrero: 28 días
Marzo: 31 días
Abril: 30 días
...

Total días por año: 365 días ( 12 meses )
Media de días por mes: 365 / 12 = 30.41666

Para calcular el número de días calcula la media de días por mes y lo multiplica por el número de mes que hayas puesto.

Luego hace un ajuste rápido para los meses de menos de 31 días y ajusta también posibles años bisiestos y listo.

Es a partir de esa linea lo que no entiendo, por que si es Febrero le suma un dia, si esta entre Marzo y Julio se lo resta, a partir de esa linea no entiendo ningun ajuste de los que hace.
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Programa para averiguar el dia de la semana
« Respuesta #3 en: 18 Julio 2013, 16:25 pm »

a ver... si tu sabes que, de promedio, cada mes tiene 30.42 días.

Si tu pones 5 de Julio de 1900... qué día del año es??

Lo primero es calcular el número de días hasta Julio, es decir, 30.42 * ( 7 - 1 ) = 182.52.

Como estás trabajando con enteros, el resultado se trunca a 182.

Si tu sumas: 31 + 28 + 31 + 30 + 31 + 30 = 181 ( uno menos ).

Luego en las siguientes líneas hace los ajustes necesarios para terminar de cuadrar el dato.

Una vez que tienes el número de días que hay entre el 1 de enero de 1900 y la fecha que has introducido, divides entre 7 y te quedas con el resto... ese resto te da el día de la semana.


En línea

Caster


Desconectado Desconectado

Mensajes: 787


Ver Perfil WWW
Re: Programa para averiguar el dia de la semana
« Respuesta #4 en: 18 Julio 2013, 16:34 pm »

Vale, ahora creo que lo entendi todo, muchas gracias.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines