MULTIMEDIA, Video digital, Grabación, Diseño gráfico, Diseño web, Programación > Webmasters - Diseño Web - Programación - Diseño gráfico

Un calendario

(1/1)

ALP:
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: ---#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");
}
--- Fin del código ---


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

jirho:
...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...

ALP:
Hay un  bucle extraño, que se quedó así después de las pruebas.

--- Código: --- /* d¡as de la semana */
   for (i = 0,  j = 0; i < 7; i++) {
      printf("%s", nom_dias[j]);
      if (++j >= 7)
         j = 0;
   }
--- Fin del código ---


Está mejor así:


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


Un saludo

jirho:
...de eso se trata de ir buscando mejoras.... :wink:

Navegación

[0] Índice de Mensajes

Ir a la versión completa