Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/04/2015, 19:30
rdv316
Invitado
 
Mensajes: n/a
Puntos:
Establecer diferencia en días de 2 fechas distintas [C].

Hola gente.
Tal vez les resulte un tanto extraño encontrar un post con un programa que compila correctamente y la lógica parece correcta, digo esto porque lo terminé hace una hora y por las pruebas que hice funciona correctamente.-
El motivo principal es para que me enseñen a modular este código en lenguaje C, no parecería algo difícil pero no me animo a hacerlo sólo la primera vez porque si logro que funcione seguramente no entenderé la lógica, siempre pudiendo hacer preguntas a los expertos me resulta más intuitivo, además en los blog por ej. casi nunca el autor te asiste.-
Por último y si tienen mucho tiempo y ganas me gustaría que me den alguna idea para mejorarlo.-

Código C:
Ver original
  1. // Programa para establecer la diferencia en día(s) entre 2 fechas diferentes.
  2.  
  3. #include <stdio.h>
  4.  
  5. typedef struct{
  6.     int dia;
  7.     int mes;
  8.     int anio;
  9. }Fecha;
  10.  
  11. int regularBisiesto( Fecha fecha1 ); //A0001
  12.  
  13.  
  14. int main(void){
  15.     Fecha fecha1 = { 15, 04, 2015 }, fecha2 = { 28, 04, 2015 }; //A0002
  16.     int difAnios, difDias=0, i, regBisAnioF1 = 0, regBisAnioF2;
  17.     int tot_dias[] = { 00,31,28,31,30,31,30,31,31,30,31,30,31 };
  18.    
  19.     difAnios = fecha2.anio - fecha1.anio; //A0003
  20.     regBisAnioF1 = regularBisiesto(fecha1); //A0004            
  21.    
  22.     if( difAnios == 0){ //A0005
  23.         if( fecha1.mes == fecha2.mes ){ //A0006
  24.             difDias += fecha2.dia - fecha1.dia;
  25.         }
  26.         else{ //A0007
  27.             difDias += (tot_dias[fecha1.mes] - fecha1.dia);
  28.             if( fecha1.mes == 2 ){
  29.                 difDias += regBisAnioF1;
  30.             }      
  31.             for( i=fecha1.mes+1; i < fecha2.mes; i++){
  32.                 if( i == 2 ){
  33.                     difDias += regBisAnioF1;
  34.                 }  
  35.                 difDias += tot_dias[i];                
  36.             }
  37.             difDias += fecha2.dia;
  38.         }  
  39.     }
  40.     else{ //A0008
  41.         difDias += (tot_dias[fecha1.mes] - fecha1.dia); //B0008
  42.         if(fecha1.mes == 2){
  43.             difDias += regBisAnioF1;
  44.         }      
  45.         if( fecha1.mes < 12 ){
  46.             for( i = fecha1.mes +1; i <= 12; i++ ){
  47.                 difDias += tot_dias[i];
  48.             }
  49.         }
  50.         for( i=fecha1.anio +1; i < fecha2.anio -1; i++){ // A0009
  51.             difDias += 365;
  52.             regBisAnioF1 = regularBisiesto(fecha1);
  53.             difDias += regBisAnioF1;
  54.         }
  55.         regBisAnioF2 = regularBisiesto(fecha2);
  56.         for( i=1; i < fecha2.mes; i++ ){ //A0010
  57.             if( i == 2 ){
  58.                 difDias += regBisAnioF2;
  59.             }  
  60.             difDias += tot_dias[i];
  61.         }
  62.         difDias += fecha2.dia; //A0011
  63.     }
  64.  
  65.     printf("\n Diferencia en dias....: %d", difDias);
  66.    
  67.     getchar();
  68.     return 0;
  69. }
  70.  
  71. int regularBisiesto( Fecha fechaRb ){ //A0001
  72.     if ((fechaRb.anio %4 == 0 && fechaRb.anio%100 != 0) || (fechaRb.anio%400) == 0){
  73.         return 1;
  74.     }
  75.     else{
  76.         return 0;
  77.     }
  78. }
  79.  
  80. /*
  81. ================================ Ayuda ================================
  82.     A0001..: Función para establecer si el año es bisiesto.-
  83.     A0002..: Fechas a consultar.-
  84.     A0003..: se guarda en difAnios la diferencia en años de las 2 fechas.-
  85.     A0004..: Se verifica si el año (fecha1) es bisiesto.-
  86.     A0005..: Se ejecuta lo que está dentro del cuerpo del if solamente si las 2 fechas tienen el mismo año.-
  87.     A0006..: Si son iguales los años y los meses de las 2 fechas solo queda  restar fecha1.dia - fecha2.dia.-
  88.     A0007..: Si los meses son distintos, en primer lugar se busca en tot_dias los dias que tiene el correspondiente
  89.                 mes de fecha1 y se los resta a fecha1.dia, después si el mes es Febrero se suma 1 si el año es
  90.                 bisiesto, luego los meses siguiente si los hay se busca en tot_dias y se los suma completos
  91.                 en este caso no se debe incluir fecha1.mes ni fecha2.mes (sólo los intermedios), al salir del bucle
  92.                 for queda tan sólo sumar los días que tenga fecha2.dia.-   
  93.     A0008..: En caso que los años sean distintos, en primer lugar hay que establecer los días que faltan para llegar
  94.                 a fin de mes ej. 15/02/2000 para el comienzo del próximo mes (Marzo) faltarían 13 días pero como
  95.                 el año 2000 fué bisiesto, se le debe agregar 1 dia. Luego se les debe sumar todos los meses
  96.                 completos hasta llegar a Diciembre, esta validación es para verificar que fecha1.mes no sea
  97.                 Diciembre, de ser así ya está contemplado en B0008, con esto se completa del inicio de fecha1
  98.                 hasta el 31/12 del mismo año.- 
  99.     A0009..: El bucle se ejecuta si entre las 2 fechas hay más de 1 año, por ej. 15/03/2012 al 19/04/2015, en este
  100.              caso 2013 y 2014 se suman completos, 365 días si no es bisiesto y 366 si lo es.-
  101.     A0010..: Este bucle establece los días que transcurrieron desde el 01/01/fecha2.anio a fecha2.mes-1.-                  
  102.     A0011..: Y lo último es sumar los días que hay desde el 01/fecha2.mes al fecha2.dia.-
  103. */

Desde ya muchas grcias por el tiempo que le dediquen.-
Daniel

EDITO: Seguramente pensaran para que hacer un programa de 103 líneas si con unas pocas y utilizando la biblioteca de c se logra lo mismo y seguramente más eficiente, lo que sucede es que este tipo de código me da una gran ejercitación mental más que nada con lo que respecta a la programación que estoy un poco flojo, he cometido el error de muchos, creo que primero deberíamos estudiar programación y luego hacer los programas con el lenguaje que mejor se adapte al mismo (aprender la sintaxis de los lenguajes es lo de menos).-

Última edición por rdv316; 28/04/2015 a las 20:08