Foros de daboweb

MULTIMEDIA, Video digital, Grabación, Diseño gráfico, Diseño web, Programación => Webmasters - Diseño Web - Programación - Diseño gráfico => Mensaje iniciado por: ALP en 15 de Mayo de 2004, 01:52:40 am

Título: Un calendario
Publicado por: ALP 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
Título: Re: Un calendario
Publicado por: jirho 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...
Título: Un calendario
Publicado por: ALP 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
Título: Un calendario
Publicado por: jirho en 18 de Mayo de 2004, 03:45:20 pm
...de eso se trata de ir buscando mejoras.... :wink: