/* 060208-5.c
* 45 min
*/
#include <stdio.h>
/* Prototipos de funciones dadas */
void diaSistema (int *dd, int *mm, int *aa);
long diaJul (int dd, int mm, int aa);
void diaGrg (long jul, int *dd, int *mm, int *aa);
int diaSem (long jul);
int festJul (long jul);
char *txtDsem (int dSem);
void f_a (void);
void f_b (void);
void f_c (long f1, long f2);
/* 10 min */
int main (void)
{
int dia, mes, ano; /* fecha en formato Gregoriano (día/mes/año) */
long f1, f2; /* fecha 1 y fecha 2 en formato numérico (Juliano) */
f_a ();
f_b ();
printf ("Introduce fecha inicio (dia mes año): ");
scanf ("%d%d%d", &dia, &mes, &ano);
f1 = diaJul (dia, mes, ano);
printf ("Introduce fecha final (dia mes año): ");
scanf ("%d%d%d", &dia, &mes, &ano);
f2 = diaJul (dia, mes, ano);
if (f2 < f1) {
printf ("Fechas incorrectas\n");
return 1;
}
else
f_c (f1, f2);
return 0;
}
/* 15 min */
void f_a (void)
{
int dia, mes, ano; /* fecha en formato Gregoriano (día/mes/año) */
long jul; /* fecha en formato numérico (Juliano) */
int dSem; /* día de la semana, 0: lunes, 6: domingo */
int i_m13; /* contador de días martes y trece */
printf ("Dos siguientes fechas martes y trece:\n");
diaSistema (&dia, &mes, &ano);
i_m13 = 0;
if (dia > 13)
mes++;
do {
if (mes == 13) {
mes = 1;
ano++;
}
jul = diaJul (13, mes, ano);
dSem = diaSem (jul);
if (dSem == 1) {
printf ("%02d/%02d/%04d\n", 13, mes, ano);
i_m13++;
}
mes++;
} while (i_m13 < 2);
}
/* 10 min */
void f_b (void)
{
int dia, mes, ano; /* fecha en formato Gregoriano (día/mes/año) */
long jul; /* fecha en formato numérico (Juliano) */
int dSem; /* día de la semana, 0: lunes, 6: domingo */
int i_asc; /* contador de años santos compostelanos */
printf ("Próximos cinco años santos compostelanos:\n");
diaSistema (&dia, &mes, &ano);
i_asc = 0;
do {
ano++;
jul = diaJul (25, 7, ano);
dSem = diaSem (jul);
if (dSem == 0) {
printf ("%d\n", ano);
i_asc++;
}
} while (i_asc < 5);
}
/* 10 min */
void f_c (long f1, long f2)
{
int dSem; /* día de la semana, 0: lunes, 6: domingo */
int cDias[5];
for (dSem = 0; dSem < 5; dSem++)
cDias[dSem] = 0;
while (f1 <= f2) {
if (!festJul (f1)) {
dSem = diaSem (f1);
cDias[dSem]++;
}
f1++;
}
for (dSem = 0; dSem < 5; dSem++)
printf ("%2d %s\n", cDias[dSem], txtDsem (dSem));
}
int diaSem (long jul)
{
return jul % 7;
}
int festJul (long jul)
{
int dSem;
dSem = diaSem (jul);
if (dSem > 4)
return 1;
return 0;
}
int es_bisiesto (int ano)
{
return ano % 4 == 0 &&
(ano % 100 != 0 || ano % 400 != 0);
}
int es_compostelano (int ano)
{
return diaSem (diaJul (25, 7, ano)) == 6;
}
/* --------------------------------------------------------------------*/
/* A partir de aquí no vamos a preocuparnos de cómo se hacen las cosas */
/* --------------------------------------------------------------------*/
/* Obtiene una fecha en formato numérico (Juliano)
* ------------ */
long diaJul (int dd, int mm, int aa)
{
long jul;
int ja,
jy,
jm;
jy = aa;
if (jy == 0)
return -1; /* No hay año 0 */
if (jy < 0)
++jy;
if (mm > 2) {
jm = mm + 1;
}
else {
--jy;
jm = mm + 13;
}
jul = (long) (365.25 * jy) +
(long) (30.6001 * jm) +
dd +
1720995;
if (dd + 31L * (mm + 12L * aa) >= (15 + 31L * (10 + 12L * 1582))) {
ja = (int) (0.01 * jy);
jul += 2 - ja + (int) (0.25 * ja);
}
return jul;
}
/* Obtiene una fecha en formato día/mes/año (Gregoriano) a partir
* de un formato numérico (gregoriano)
* ------------ */
void diaGrg (long jul, int *dd, int *mm, int *aa)
{
long ja, jal, jb, jc, jd, je;
if (jul >= 2299161) {
jal = ((float) (jul - 1867216) - 0.25) / 36524.25;
ja = jul + 1 + jal - (long) (0.25 * jal);
}
else if (jul < 0)
ja = jul + 36525 *( 1 - jul / 36525);
else
ja = jul;
jb = ja + 1524;
jc = (long) (6680.0 + ((float) (jb - 2439870) - 122.1) / 365.25);
jd = (long) (365 * jc + (0.25 * jc));
je = (long) ((jb - jd) / 30.6001);
*dd = jb - jd - (long) (30.6001 * je);
*mm = je - 1;
if (*mm > 12)
*mm -= 12;
*aa = jc - 4715;
if (*mm > 2) --(*aa);
if (*aa <= 0) --(*aa);
if (jul < 0)
*aa -= 100 * (1 - jul / 36525);
}
static char *cadenaDiaSemana [] = {
"lunes",
"martes",
"miércoles",
"jueves",
"viernes",
"sábado",
"domingo"
};
/* Devuelve la cadena de un día de la semana
* ------------ */
char *txtDsem (int dSem)
{
return cadenaDiaSemana [dSem];
}
#include <time.h>
#include <stdlib.h>
/* Devuelve la fecha del sistema
* ------------ */
void diaSistema (int *dd, int *mm, int *aa)
{
time_t timer;
struct tm *stm;
timer = time (NULL);
stm = localtime (&timer);
*dd = stm->tm_mday;
*mm = stm->tm_mon + 1;
*aa = stm->tm_year + 1900;
}
/* Devuelve la hora del sistema
* ------------ */
void horaSistema (int *hh, int *mm, int *ss)
{
time_t timer;
struct tm *stm;
timer = time (NULL);
stm = localtime (&timer);
*hh = stm->tm_hour;
*mm = stm->tm_min;
*ss = stm->tm_sec;
}