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
// Programa para establecer la diferencia en día(s) entre 2 fechas diferentes. #include <stdio.h> typedef struct{ int dia; int mes; int anio; }Fecha; int regularBisiesto( Fecha fecha1 ); //A0001 int main(void){ Fecha fecha1 = { 15, 04, 2015 }, fecha2 = { 28, 04, 2015 }; //A0002 int difAnios, difDias=0, i, regBisAnioF1 = 0, regBisAnioF2; int tot_dias[] = { 00,31,28,31,30,31,30,31,31,30,31,30,31 }; difAnios = fecha2.anio - fecha1.anio; //A0003 regBisAnioF1 = regularBisiesto(fecha1); //A0004 if( difAnios == 0){ //A0005 if( fecha1.mes == fecha2.mes ){ //A0006 difDias += fecha2.dia - fecha1.dia; } else{ //A0007 difDias += (tot_dias[fecha1.mes] - fecha1.dia); if( fecha1.mes == 2 ){ difDias += regBisAnioF1; } for( i=fecha1.mes+1; i < fecha2.mes; i++){ if( i == 2 ){ difDias += regBisAnioF1; } difDias += tot_dias[i]; } difDias += fecha2.dia; } } else{ //A0008 difDias += (tot_dias[fecha1.mes] - fecha1.dia); //B0008 if(fecha1.mes == 2){ difDias += regBisAnioF1; } if( fecha1.mes < 12 ){ for( i = fecha1.mes +1; i <= 12; i++ ){ difDias += tot_dias[i]; } } for( i=fecha1.anio +1; i < fecha2.anio -1; i++){ // A0009 difDias += 365; regBisAnioF1 = regularBisiesto(fecha1); difDias += regBisAnioF1; } regBisAnioF2 = regularBisiesto(fecha2); for( i=1; i < fecha2.mes; i++ ){ //A0010 if( i == 2 ){ difDias += regBisAnioF2; } difDias += tot_dias[i]; } difDias += fecha2.dia; //A0011 } return 0; } int regularBisiesto( Fecha fechaRb ){ //A0001 if ((fechaRb.anio %4 == 0 && fechaRb.anio%100 != 0) || (fechaRb.anio%400) == 0){ return 1; } else{ return 0; } } /* ================================ Ayuda ================================ A0001..: Función para establecer si el año es bisiesto.- A0002..: Fechas a consultar.- A0003..: se guarda en difAnios la diferencia en años de las 2 fechas.- A0004..: Se verifica si el año (fecha1) es bisiesto.- A0005..: Se ejecuta lo que está dentro del cuerpo del if solamente si las 2 fechas tienen el mismo año.- A0006..: Si son iguales los años y los meses de las 2 fechas solo queda restar fecha1.dia - fecha2.dia.- A0007..: Si los meses son distintos, en primer lugar se busca en tot_dias los dias que tiene el correspondiente 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 bisiesto, luego los meses siguiente si los hay se busca en tot_dias y se los suma completos en este caso no se debe incluir fecha1.mes ni fecha2.mes (sólo los intermedios), al salir del bucle for queda tan sólo sumar los días que tenga fecha2.dia.- A0008..: En caso que los años sean distintos, en primer lugar hay que establecer los días que faltan para llegar a fin de mes ej. 15/02/2000 para el comienzo del próximo mes (Marzo) faltarían 13 días pero como el año 2000 fué bisiesto, se le debe agregar 1 dia. Luego se les debe sumar todos los meses completos hasta llegar a Diciembre, esta validación es para verificar que fecha1.mes no sea Diciembre, de ser así ya está contemplado en B0008, con esto se completa del inicio de fecha1 hasta el 31/12 del mismo año.- 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 caso 2013 y 2014 se suman completos, 365 días si no es bisiesto y 366 si lo es.- A0010..: Este bucle establece los días que transcurrieron desde el 01/01/fecha2.anio a fecha2.mes-1.- A0011..: Y lo último es sumar los días que hay desde el 01/fecha2.mes al fecha2.dia.- */
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).-