Día de la semana de una fecha

Arnold Balasescu

/*
 * =====================================================================================
 *
 *       Filename:  dia_semana.c
 *
 *    Description:  Programa que calcula el dia de la semana usando un dato conocido.
 *
 *        Version:  1.0
 *        Created:  10/31/2011 11:56:37 PM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Balasescu Arnold
 *        Company:
 *
 * =====================================================================================
 */

#include <stdio.h>
#define ANIO 365	// dias en 1 anio
#define YEAR 1600	// punto de referencia (1 enero 1600 = Sabado)

/* Lo que viene a continuación es una función. Ademas de ahorrar código,
    el uso de funciones mejora su legibilidad.
    He nombrado la variable local "anio2" para no crear confusiones */

  int es_bisiesto(int anio2)
    {
      if ((anio2 %4 == 0 && anio2 %100 != 0) || anio2 %400 == 0)
        return 1;
      else return 0;
    }

// PROGRAMA PRINCIPAL
int main()
{
  int anio,mes,dia,i,n=0;    //n almacena los dias desde 1 enero 1600 hasta la fecha.

  printf("Escribe la fecha del siguiente modo: \nDia Mes Anio \n");
  scanf("%d %d %d", & dia, & mes, & anio);
  /* Comprobacion de los datos */
  if (anio < 1600)
    {
      printf("Programa limitado a fechas superiores a 1600");
      return 0;
    }
  /* Aqui falta el algoritmo que prueba si el numero de dias es correcto */
  for (i = YEAR; i < anio; i++)
    {       n += ANIO;	                // +365 dias para cada anio
            if (es_bisiesto(i)) n += 1;	// +1 dia para los bisiestos
    }
  for(i = mes - 1;i >= 1;i--)	//suma los dias de todos los meses ANTERIORES
    {			                //reciclando la variable 'i' para no cambiar 'mes'
      switch ( i ) {
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10: n += 31;	//nota: el caso 12 no tiene sentido
          break;
	case 4:
	case 6:
	case 9:
	case 11: n += 30;
          break;
	case 2: n = n + 28 + es_bisiesto(anio);	//aqui estoy ahorrando un condicional
          break;
	default: printf("El mes no es correcto");
	  return 0;
          break;
      }
    }
  n += dia;	//suma los dias del mes corriente
  printf("El dia %d-%d-%d es ", dia, mes, anio);
  switch ( n%7 ) {
    case 1: printf("Sabado");
      	    break;
    case 2: printf("Domingo");
     	    break;
    case 3: printf("Lunes");
            break;
    case 4: printf("Martes");
            break;
    case 5: printf("Miercoles");
	        break;
    case 6: printf("Jueves");
	        break;
    case 0: printf("Viernes");
	        break;
  }
  return 0;
}
Anuncios
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

2 respuestas a Día de la semana de una fecha

  1. Muy bien pero observa ahora el lugar de la función int bisiesto(). En general, no se puede definir una función dentro de otra función, y de cara a la claridad mejor hacer cada una por separado.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s