Ver Mensaje Individual
  #3 (permalink)  
Antiguo 16/08/2013, 13:52
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 9 meses
Puntos: 83
Respuesta: Como hago esta cuenta en c

Bueno, una pequeña ayuda :)

Código C:
Ver original
  1. typedef struct {
  2.     int d, m, a;
  3. } FECHA;
  4.  
  5.  
  6. int dias_al_mes(int m, int a) {
  7.     int fdxm[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  8.     return (m == 1 && a%4 == 0 && (a%100 != 0 || a%400 == 0))? fdxm[m]+1 : fdxm[m];
  9. }
  10.  
  11.  
  12. void suma_dias(FECHA *fecha, int dias) {
  13.     int dxm;
  14.    
  15.     //situacion inicial
  16.     dxm = dias_al_mes(fecha->m, fecha->a);
  17.    
  18.     //manos a la obra
  19.     while(dias > 0) {
  20.         //incremento dia
  21.         fecha->d++;
  22.         printf("Dia %02d (max %02d) ", fecha->d, dxm);
  23.        
  24.         //compruebo que no sea mayor que el maximo de dias del mes
  25.         if(fecha->d > dxm) {
  26.             printf(", ojo que aqui salto de mes\n");
  27.            
  28.             //incremento mes
  29.             fecha->m += 1;
  30.            
  31.             //compruebo que no sea mayor que 12 (basado en 0, por eso pongo 11)
  32.             if(fecha->m > 11) {
  33.                 //reinicio mes
  34.                 fecha->m = 0;
  35.                 //incremento año
  36.                 fecha->a++;
  37.             }
  38.             //reinicio dia
  39.             fecha->d = 1;
  40.             //redefino situacion inicial
  41.             dxm = dias_al_mes(fecha->m, fecha->a);
  42.             printf("Es decir, que ahora es dia %02d (max %02d) ", fecha->d, dxm);
  43.         }
  44.        
  45.         //adelanto trabajo
  46.         dias--;
  47.         printf("y aun quedan %d dias a sumar\n", dias);
  48.     }
  49. }
  50.  
  51.  
  52. int main() {
  53.     FECHA fecha = {20, 0, 2000};
  54.  
  55.     suma_dias(&fecha, 20);
  56.     printf("\n\n%02d/%02d/%d", fecha.d, fecha.m, fecha.a);
  57.    
  58.     return 0;
  59. }


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 original
  1. Un 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
  2. y además es divisible entre 400, también resulta bisiesto. Obviamente, esto elimina los años finiseculares (últimos de
  3. cada siglo, que ha de terminar en 00) divisibles sólo entre 4 y entre 100.

Espero que sirva de ayuda
Saludos
vosk