Tengo dos ficheros, el primero es fecha.c que hace la lectura, comprobación, comparación, comprobación si es bisiesto o no, con el código que me ha quedado así:
Código:
#include <stdio.h>
#include "fecha.h"
struct fecha leeFecha(void)
{
struct fecha Fech;
printf("Introduzca la fecha en formato dd/mm/aaaa: ");
scanf("%d/%d/%d", &Fech.dia, &Fech.mes, &Fech.año);
return Fech;
}
int compruebaFecha(struct fecha *pFecha)
{
int compru;
// int dia;
// int mes;
int bis;
{
if (pFecha->dia < 1 || pFecha->dia > 31)
compru = 0;
else if (pFecha->mes < 1 || pFecha->mes > 12)
compru = 0;
else if ((pFecha->mes == 4 || pFecha->mes == 6 || pFecha->mes == 9 || pFecha->mes == 11) && (pFecha->dia > 30))
compru = 0;
else if (pFecha->mes == 2)
{
if ((bis = 1) && (pFecha->dia > 29))
compru = 0;
else if ((bis = 0) && (pFecha->dia > 28))
compru = 0;
}
else
compru = 1;
}
return compru;
}
int comparaFecha(struct fecha f1, struct fecha f2)
/* Función comparaFecha, devuelve:
-1 si fecha1 < fecha2
0 si fecha1 = fecha2
1 si fecha1 > fecha2
*/
{
int compara;
if (f1.año < f2.año)
compara = -1;
else if (f1.año > f2.año)
compara = 1;
else
{
if (f1.mes < f2.mes)
compara = -1;
else if (f1.mes > f2.mes)
compara = 1;
else
{
if (f1.dia < f2.dia)
compara = -1;
else if (f1.dia > f2.dia)
compara = 1;
else
compara = 0;
}
}
return compara;
}
void imprimeFecha(struct fecha f)
{
printf("%02d/%02d/%d", f.dia, f.mes, f.año);
return;
}
// Funcion para comprobar si un año es bisiesto:
int esBisiesto(struct fecha f)
{
int bis = 0;
// año bisiesto: {divisible por 4 y no por 100} o {divisible por 400}
if (((f.año % 4 == 0) && (f.año % 100 != 0)) || (f.año % 400 == 0))
bis = 1;
return bis;
}
Aquí está el fichero estructura.c que contiene a la función main y usa las funciones de fecha.c
Código:
#include <stdio.h>
#include "fecha.h"
int main()
{
struct fecha f1;
struct fecha f2;
// struct fecha *pf1;
// struct fecha *pf2;
int a;
int compara;
int bis1;
int bis2;
f1 = leeFecha();
a = compruebaFecha(&f1);
if (a == 0)
{
printf("Formato de fecha incorrecto\n");
}
else
{
f2 = leeFecha();
a = compruebaFecha(&f2);
if (a == 0)
{
printf("Formato de fecha incorrecto\n");
}
else
{
compara = comparaFecha(f1, f2);
/* Imprimir */
imprimeFecha(f1);
{
if (compara > 0)
printf(" es posterior a ");
else if (compara == 0)
printf(" es igual a ");
else
printf(" es anterior a ");
}
imprimeFecha(f2);
bis1 = esBisiesto(f1);
bis2 = esBisiesto(f2);
{
if (bis1 == 1 && bis2 == 0)
printf("\nLa primera fecha es en bisiesto\n");
else if (bis1 == 0 && bis2 == 1)
printf("\nLa segunda fecha es en bisiesto\n");
else if (bis1 == 1 && bis2 == 1)
printf("\nAmbas fechas son en bisiesto\n");
else
printf("\nNinguna de las dos fechas es en bisiesto\n");
}
}
}
return 0;
}
Y aquí está fecha.h:
Código:
#ifndef FECHA_H
#define FECHA_H
struct fecha {
int dia;
int mes;
int año;
};
#define AMBAS_BISIESTO "Ambas fechas son en bisiesto\n"
#define PRIMERA_BISIESTO "La primera fecha es en bisiesto\n"
#define SEGUNDA_BISIESTO "La segunda fecha es en bisiesto\n"
#define NINGUNA_BISIESTO "Ninguna de las dos fechas es en bisiesto\n"
struct fecha leeFecha( void );
int compruebaFecha( struct fecha *pFecha );
int comparaFecha( struct fecha f1, struct fecha f2 );
void imprimeFecha( struct fecha f );
int esBisiesto( struct fecha f );
#endif
Pues bien, el programa me funciona perfectamente salvo por un pequeño error que no consigo solucionar, puede ser una tontería pero llevo tanto tiempo haciendo el programa que no lo veo.
En la ejecución, si le pongo las fechas 06/01/1981 y 02/06/1980 me dice:
6/1/1981 es posterior a 2/6/1980
La segunda fecha es en bisiesto
¿Cómo consigo que en vez de 6/1/1981 y 2/6/1980 me ponga 06/01/1981 y 02/06/1980?
Es decir, que no se "coma" esos ceros.
¿Alguna ayuda?, gracias de antemano
Necesito que me de la ejecución tal y como digo por que si no no me lo dan como válido el programa, aunque funcione correctamente
Un saludo!