Ver Mensaje Individual
  #3 (permalink)  
Antiguo 29/04/2015, 00:42
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Establecer diferencia en días de 2 fechas distintas [C].

Tu programa tiene varios errores:

Código C:
Ver original
  1. int regularBisiesto( Fecha fechaRb ){ //A0001
  2.     if ((fechaRb.anio %4 == 0 && fechaRb.anio%100 != 0) || (fechaRb.anio%400) == 0){
  3.         return 1;
  4.     }
  5.     else{
  6.         return 0;
  7.     }
  8. }

En la función anterior, únicamente haces uso del campo "anio". En este caso es preferible modificar la función para que únicamente acepte un entero. ¿motivo? Pues porque te obliga a hacer cosas raras:

Código C:
Ver original
  1. for( i=fecha1.anio +1; i < fecha2.anio -1; i++){ // A0009
  2.             difDias += 365;
  3.             regBisAnioF1 = regularBisiesto(fecha1);
  4.             difDias += regBisAnioF1;
  5.         }

Si te fijas, en el intervalo fecha1.anio < i < fecha2.anio compruebas llamas todo el rato a regularBisiesto pasando "fecha1"... fecha que, dicho sea de paso, no cambia... esto quiere decir que si fecha1 es inicialmente bisiesto estarás asumiendo que todos los años intermedios son bisiestos y, si fecha1 no es bisiesto, ignorará todos los años bisiestos que se encuentren en el intervalo.

Además, ahí estás eliminando un año. Prueba a poner dos fechas separadas exactamente por dos años. p.ej: 1/1/2001 y 1/1/2003. Verás que el programa te dice que la diferencia es de 365 días.

Código C:
Ver original
  1. regBisAnioF2 = regularBisiesto(fecha2);
  2.         for( i=1; i < fecha2.mes; i++ ){ //A0010
  3.             if( i == 2 ){
  4.                 difDias += regBisAnioF2;
  5.             }  
  6.             difDias += tot_dias[i];
  7.         }

En este caso... ¿qué pasa si fecha2 = 01/02/2004? pues que asume que el 2004 es bisiesto y le suma el día correspondiente al 29 de febrero.

También tienes código innecesario. Por ejemplo:

Código C:
Ver original
  1. if( fecha1.mes < 12 ){
  2.             for( i = fecha1.mes +1; i <= 12; i++ ){
  3.                 difDias += tot_dias[i];
  4.             }
  5.         }

Ese if es innecesario. ¿por qué? facil. Si el mes es 12, al ejecutarse el bucle no se cumplirá i = mes + 1 <= 12 <=> i = 13 <= 12, por lo que el bucle no se ejecutará en ningún momento. Eliminar código innecesario mejora enormemente la legibilidad del código (y de paso eliminas cosas que no necesitas)

Y con eso más o menos entiendo que debería estar. Eso sí, deberías acostumbrarte a usar un depurador de código. Con eso y con un cuadernito con el que hacer las cuentas a mano a ver si cuadran deberías ser capaz de localizar todos estos problemas :)

Y bueno, hablando también del diseño general del código tengo malas noticias. Repites demasiado código en proporción con el tamaño final del programa. Creo que deberías intentar eliminar el código redundante en la medida de lo posible