Autor Tema: Un calendario  (Leído 4096 veces)

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
Un calendario
« en: 15 de Mayo de 2004, 01:52:40 am »
Reorganizando mis fuentes me he encontrado con este calendario que desarrollé hace un tiempo. Podría ser interesante, porque te permite calcular el día de la semana de una fecha concreta. La idea me la dió el programa "cal" de linux, que muestra un calendario, pero es más completo. Os prometo que no lo he copiado (este es mio)

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <dos.h>

main(int argc, char *argv[])
{
struct date fecha;
float cociente, dia_jul;
int i, j, a, b, dia_sem;
int dia,  mes, anno, mes_ini, anno_ini;

int dias_mes[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char *nom_meses[12] = { "Enero", "Febrero", "Marzo", "Abril",
"Mayo", "Junio", "Julio", "Agosto",
"Septiembre", "Octubre", "Noviembre", "Diciembre" };
char *nom_dias[7] = { "LUN ","MAR ","MIE ","JUE ","VIE ","SAB ", "DOM" };


dia = 1;
mes_ini = anno_ini = 0;

if (argc == 3) {
mes_ini = atoi(argv[1]);
anno_ini = atoi(argv[2]);
if (mes_ini < 0 || mes_ini > 12)
mes_ini = 0;
}

if (mes_ini == 0 || anno_ini == 0) {
getdate(&fecha);
mes_ini = fecha.da_mon;
anno_ini = fecha.da_year;
}

mes  = mes_ini;
anno = anno_ini;


/*
Años bisiestos: los años que terminan en dos ceros son bisiestos
si son divisibles por 400. As¡, un año es bisiesto si es divisible
por 4 y no por 100 o es divisible por 400
*/
if (mes == 2 && ((anno%4 == 0 && anno % 100 !=0) || anno % 400==0))
dias_mes[1] = 29;


if (mes < 3) {
anno--;
mes+=12;
}

a = anno / 100;
b = 2 - a + (a / 4);

dia_jul = (long)(365.25*(anno+4716))+(long)(30.6001*(mes+1))+dia+b-1524.5;

dia_jul += 1.5;
cociente = floor(dia_jul / 7.0);
dia_sem = (int)(dia_jul - (cociente * 7.0));


/* cambiamos el dia inicial (0) al lunes */
dia_sem--;
if (dia_sem < 0)
dia_sem = 6;

/* nombre del mes y año */
printf("\n\t%s  %i\n", nom_meses[mes_ini-1], anno_ini);

/* d¡as de la semana */
for (i = 0,  j = 0; i < 7; i++) {
printf("%s", nom_dias[j]);
if (++j >= 7)
j = 0;
}
printf("\n");

/* d¡as del mes */
for (i = 0; i < dia_sem; i++)
printf("    ");

for (i = 0, j = dia_sem; i < dias_mes[mes_ini-1]; i++) {
printf("%3i ", i+1);
if (++j >= 7) {
printf("\n");
j = 0;
}
}
printf("\n\n");
}


El programa admite como parámetros el mes y el año que queréis visualizar. Si, por ejemplo, el programa se llama cal.exe....

cal.exe               --> visualiza el mes actual
cal.exe 01 2004  --> visualiza el mes de enero del 2004

Un saludo
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado jirho

  • Member
  • ***
  • Mensajes: 303
Re: Un calendario
« Respuesta #1 en: 17 de Mayo de 2004, 04:15:37 pm »
...esta perfecto para linux, que es donde mas usamos argumentos, por modo comando, despues se podria perfeccionar poniendole ayuda y demas al igual que Linux...por ejemplo que se le de el nombre solo y se ejecute la ayuda...y las demas cosas...
[root@local_host jirho]#Conecting to underground zone...:superman:

http://www.hackeando.com/gifs/logomini.gif

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
Un calendario
« Respuesta #2 en: 17 de Mayo de 2004, 10:06:41 pm »
Hay un  bucle extraño, que se quedó así después de las pruebas.
Código: [Seleccionar]
/* d¡as de la semana */
   for (i = 0,  j = 0; i < 7; i++) {
      printf("%s", nom_dias[j]);
      if (++j >= 7)
         j = 0;
   }


Está mejor así:

Código: [Seleccionar]
/* d¡as de la semana */
   for (i = 0;  i < 7; i++)
      printf("%s", nom_dias[i]);


Un saludo
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado jirho

  • Member
  • ***
  • Mensajes: 303
Un calendario
« Respuesta #3 en: 18 de Mayo de 2004, 03:45:20 pm »
...de eso se trata de ir buscando mejoras.... :wink:
[root@local_host jirho]#Conecting to underground zone...:superman:

http://www.hackeando.com/gifs/logomini.gif

 

Aviso Legal | Política de Privacidad | Política de Cookies

el contenido de la web se rige bajo licencia
Creative Commons License