Bueno, una pequeña ayuda :)
Código C:
Ver originaltypedef struct {
int d, m, a;
} FECHA;
int dias_al_mes(int m, int a) {
int fdxm[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
return (m == 1 && a%4 == 0 && (a%100 != 0 || a%400 == 0))? fdxm[m]+1 : fdxm[m];
}
void suma_dias(FECHA *fecha, int dias) {
int dxm;
//situacion inicial
dxm = dias_al_mes(fecha->m, fecha->a);
//manos a la obra
while(dias > 0) {
//incremento dia
fecha->d++;
printf("Dia %02d (max %02d) ", fecha
->d
, dxm
);
//compruebo que no sea mayor que el maximo de dias del mes
if(fecha->d > dxm) {
printf(", ojo que aqui salto de mes\n");
//incremento mes
fecha->m += 1;
//compruebo que no sea mayor que 12 (basado en 0, por eso pongo 11)
if(fecha->m > 11) {
//reinicio mes
fecha->m = 0;
//incremento año
fecha->a++;
}
//reinicio dia
fecha->d = 1;
//redefino situacion inicial
dxm = dias_al_mes(fecha->m, fecha->a);
printf("Es decir, que ahora es dia %02d (max %02d) ", fecha
->d
, dxm
); }
//adelanto trabajo
dias--;
printf("y aun quedan %d dias a sumar\n", dias
); }
}
int main() {
FECHA fecha = {20, 0, 2000};
suma_dias(&fecha, 20);
printf("\n\n%02d/%02d/%d", fecha.
d, fecha.
m, fecha.
a);
return 0;
}
Ojo, no está optimizado solo es para ver paso a paso lo que hay. Lo ideal sería agrupar los dias a sumar segun el maximo de dias sumables (dia actual - dias maximos), dejando un remanente que se usaría en el siguiente bucle, de forma que se va repitiendo hasta que el remanente sea <= 0
Otra cosa, he puesto los meses basados en 0 para ir rapido pero puedes pasarlo a 1 (en el ejemplo 0->ene, 1->feb,...,11->dic)
Creo que no olvido nada; el algoritmo para calcular años bisiestos es la propia definicion:
Código C:
Ver originalUn año es bisiesto si es divisible entre 4, a menos que sea divisible entre 100. Sin embargo, si un año es divisible entre 100
y además es divisible entre 400, también resulta bisiesto. Obviamente, esto elimina los años finiseculares (últimos de
cada siglo, que ha de terminar en 00) divisibles sólo entre 4 y entre 100.
Espero que sirva de ayuda
Saludos
vosk