Ejercicios y Practicas resueltas en lenguaje de programación en C
introduciendo dos fechas por pantalla utilizando estructuras para solicitar las mismas el programa ha de devolver la diferencia en dias entre las dos fechas tecleadas, esta función que existe en otros lenguaje es fácil de implementar en c, aunque algo tediosa. se ha de tener en cuenta que se emplean para resolver el ejercicio propuesto el operador condicional del lenguaje C. La solución de los ejercicios que se plantean es la siguiente:
/*
Nuevo ejercicio con solución o práctica resuelta de
programación en lenguaje C, estos ejercicios se proponen
para potenciar el aprendizaje de personas que estén estudiando
programación y en particular el lenguaje de programación c.
La práctica resuelta que se propone es la de realizar un programa
que solicitando dos fechas, devuelve la diferencia en días entre
las dos fechas tecleadas. Vuelvo a comentar que no es la única
solución posible y que la forma de mejorar siempre estas prácticas
es que aportéis vuestro granito de arena utilizando para ello los
comentarios. Un saludo y gracias por vuestra visita a este vuestro blog
www.aprendoencasa.com
*/
// Libreria de funciones a utilizar
#include <stdio.h>
// Definicion de constantes
#define TRUE 1
#define FALSE 0
// Estructuras de tipo fecha
typedef struct {
int dia;
int mes;
int anyo;
} Date;
// Predefinicion de funciones
int EsBisiesto(int);
int NumeroDiasAnyo(int);
int DiasTranscurridosAnyo(Date);
long DiferenciaFechas(Date,Date);
// Funcion principal
int main(int argc, char *argv[])
{
// Variables a utilizar para las fechas
Date Fecha1;
Date Fecha2;
// Solicitar la primera fecha
printf("Fecha Inicio (dd mm yyyy) : ");
scanf("%d %d %d",&Fecha1.dia,&Fecha1.mes,&Fecha1.anyo);
// Solicitar la segunda fecha
printf("Fecha Final (dd mm yyyy) : ");
scanf("%d %d %d",&Fecha2.dia,&Fecha2.mes,&Fecha2.anyo);
// las fechas solicitadas se suponen que son correctas ya que
// este programa no realiza la comprobacion de las mismas
// tambien se supone que la primera fecha es igual o inferior a la
// segunda fecha tecleada
// Visualizar la diferencia en dias llamando a la funcion
printf("Diferencia en dias = %ld",DiferenciaFechas(Fecha1,Fecha2));
// realizar una pausa en el sistema
system("PAUSE");
// Finalizar programa
return 0;
}
// Funcion para comprobar si un año es bisiesto
// se pasa como parametro el año
int EsBisiesto(int anyo)
{
int resultado = FALSE;
// se comprueba si el año es bisiesto o no
if ( ((anyo%4==0) && (anyo%100!=0)) || (anyo%400==0) )
resultado = TRUE;
// se devuelve el resultado
return resultado;
}
// Funcion que devuelve el numero de dias del año teniendo
// en cuenta si el año pasado como parametro es bisiesto o no
int NumeroDiasAnyo(int anyo)
{
// para devolver el numero de dias se utiliza el operador
// condicional en conjuncion con la llamada a la funcion
// que indica si el año es bisiesto o no
return EsBisiesto(anyo)?366:365;
}
int DiasTranscurridosAnyo(Date Fecha)
{
// Variables a utilizar
int contador=0;
int suma=0;
int dia=Fecha.dia;
int mes=Fecha.mes;
int anyo=Fecha.anyo;
// Crear una matriz numerica con los dias
// correspondientes a cada mes
int Meses_Anyo[] = {31,28,31,30,31,30,31,31,30,31,30,31};
// Contar los dias transcurridos segun los meses pasados
for (contador=0;contador<mes-1;contador++)
{
suma+= Meses_Anyo[contador];
}
// sumar los dias correspondientes al mes actual
suma+= dia;
// si el año es bisiesto sumar 1 dia mas al total
if(EsBisiesto(anyo) && mes>2)
suma++;
// devolver el numero de dias transcurridos de la fecha pasada
return suma;
}
// Funcion que devuelve el numero de dias transcurridos entre dos fechas
// la primera fecha ha de ser menor a la segunda fecha, los años de ambas
// fechas se han de especificar con cuatro digitos para que el programa
// funcione correctamente
long DiferenciaFechas(Date Fecha1,Date Fecha2)
{
// Variables a utilizar
int anyoiniciocuantos=0;
int anyofinalcuantos=0;
long sumadias=0;
int cuentaanyos=0;
// Dias transcurridos de la primera fecha, en caso de ser años iguales
// la diferencia en dias de la primera fecha es 0
anyoiniciocuantos = Fecha1.anyo==Fecha2.anyo?0:
NumeroDiasAnyo(Fecha1.anyo) - DiasTranscurridosAnyo(Fecha1);
// dias transcurridos del año de la segunda fecha
anyofinalcuantos = DiasTranscurridosAnyo(Fecha2);
// Contar los años transcurridos entre una fecha y otra sumando
// los dias correspondientes por año
for(cuentaanyos=Fecha1.anyo+1;cuentaanyos<Fecha2.anyo;cuentaanyos)
{
sumadias+=NumeroDiasAnyo(cuentaanyos);
}
// sumar los dias correspondientes al total de dias transcurridos
sumadias+=anyoiniciocuantos+anyofinalcuantos;
// devolver la suma de dias transcurridos
return sumadias;
}
La captura de pantalla, al ejecutar los ejercicios con solución es la siguiente:
Tenemos un pequeño fallo el el último bucle for.
for(cuentaanyos=Fecha1.anyo+1;cuentaanyos<Fecha2.anyo;cuentaanyos++) //Estaría faltando los ++ para que siga el recorrido, al hacer más años de diferencia el bucle se queda y no da nignún resultado.
{
sumadias+=NumeroDiasAnyo(cuentaanyos);
}
Además del error que comentó Carlos Daniel. Hay otro error en el metodo ‘DiferenciaFechas’ que hace que calcule mal la diferencie entre las 2 fechas.
Para corregir el error debemos agregar las siguientes lineas de código
int diasDelAnoOcurridosFechaInicial = DiasTranscurridosAnyo(anoi, mesi, diai);
anyofinalcuantos -= diasDelAnoOcurridosFechaInicial;
Justo despues de
// dias transcurridos del a�o de la segunda fecha
anyofinalcuantos = DiasTranscurridosAnyo(anof, mesf, diaf);
Tu código me ayudo bastante amigo.
Muchas gracias!