Autor
|
Tema: Duda con estructuras en C (Urgente) (Leído 6,167 veces)
|
jamatbar
Desconectado
Mensajes: 104
|
Buenas, me han pedido un programa en la facultad en el que ,mediante estructuras, me pida dos fechas y el programa me dice si una fecha es posterior/anterior/igual a otra fecha y si los años son bisiestos o no. 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í: #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.anio);
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.anio < f2.anio) compara = -1; else if (f1.anio > f2.anio) 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.anio);
return; }
// Funcion para comprobar si un anio es bisiesto: int esBisiesto(struct fecha f) { int bis = 0;
// anio bisiesto: {divisible por 4 y no por 100} o {divisible por 400}
if (((f.anio % 4 == 0) && (f.anio % 100 != 0)) || (f.anio % 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 #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: #ifndef FECHA_H #define FECHA_H
struct fecha { int dia; int mes; int anio; };
#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!
|
|
« Última modificación: 4 Enero 2014, 20:31 pm por jamatbar »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Esta línea: printf("%d/%d/%d", f.dia, f.mes, f.año);
Cámbiala por: printf("%02d/%02d/%04d", f.dia, f.mes, f.año);
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Y aquí está el fichero fecha.h: #ifndef FECHA_H #define FECHA_H struct fecha { int dia; int mes; int año; }; /* ... */
La solución ya la dio amchacon, otra parte a cambiar en el programa es el nombre del campo "año" ya que en C solo son validos (como parte de un identificador) los caracteres del alfabeto ingles (ello excluye a la 'ñ'). Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
jamatbar
Desconectado
Mensajes: 104
|
Muchas gracias, ya está resuelto!
|
|
|
En línea
|
|
|
|
dato000
Desconectado
Mensajes: 3.034
|
Vaya, es muy buen programa para fechas la verdad, solo una cosa:
es mejor no usar variables con "ñ" puede que de errores de compilación, o bueno, es solo una sugerencia.
año ---> anyo, es muy recomendable no usar ese tipo de caracteres para lenguajes de programación, verás, estos lenguajes son principalmente basados en habla inglesa, donde no existe este caracter.
slds
|
|
|
En línea
|
|
|
|
jamatbar
Desconectado
Mensajes: 104
|
Respecto a lo de la variable año, yo tengo puesto anyo, pero supongo que por englobar en esta web el código me sale con ñ xD
Me queda una última cosa, que es que cuando le meta las fechas por ejemplo: 29/02/2000 y 29/02/1900 (la primera fecha es correcta ya que el 2000 es un año bisiesto pero el segundo no, ya que el 1900 no es un año bisiesto), entonces tendría que ponerme simplemente el mensaje de "Formato de fecha incorrecto"
Si ahora lo hago me sale el mensaje: 29/02/2000 es posterior a 29/02/1900 La primera fecha es en bisiesto
¿Alguna ayuda?
Saludos!
|
|
|
En línea
|
|
|
|
dato000
Desconectado
Mensajes: 3.034
|
Pues solo seria mostrar el mensaje en pantalla no?? ya comprobaste todo dentro de las funciones Ya hiciste todo el trabajo sucio, solo es indicarlo en pantalla para el usuario. bis1 = esBisiesto(f1); bis2 = esBisiesto(f2); { if (bis1 == 1 && bis2 == 0) { printf("\nLa primera fecha es en bisiesto"); printf("\nLa segunda fecha no es bisiesto\n"); } else if (bis1 == 0 && bis2 == 1) { printf("\nLa primera fecha no es bisiesto"); 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"); }
|
|
|
En línea
|
|
|
|
jamatbar
Desconectado
Mensajes: 104
|
Pues solo seria mostrar el mensaje en pantalla no?? ya comprobaste todo dentro de las funciones Ya hiciste todo el trabajo sucio, solo es indicarlo en pantalla para el usuario. bis1 = esBisiesto(f1); bis2 = esBisiesto(f2); { if (bis1 == 1 && bis2 == 0) { printf("\nLa primera fecha es en bisiesto"); printf("\nLa segunda fecha no es bisiesto\n"); } else if (bis1 == 0 && bis2 == 1) { printf("\nLa primera fecha no es bisiesto"); 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"); }
No pero no es eso lo que busco, lo que busco es que si por ejemplo pongo las fechas que he dicho (29/02/2000 y 29/02/1900) al ser la segunda una fecha incorrecta ,ya que no existe, que ponga sólo por pantalla "Formato de fecha incorrecto". Poner que no es bisiesto estaría mal ya que el 29/02/1900 directamente es una fecha que no existe puesto que al no ser bisiesto el 29 de Febrero no existe xD
|
|
|
En línea
|
|
|
|
dato000
Desconectado
Mensajes: 3.034
|
pues entonces el control tendria que ser mucho más estricto, especificandole al usuario que debe saber exactamente cuales son la cantidad de dias hay en cada mes en particular, incluyendo el mes bisiesto, dentro de las condiciones de los meses y dias, tendria que hacerse un ciclo (yo usaria un while).
En el que solo pueda usarse digamos, en enero, que solo tiene 31 días, no recibir la fecha que se use en el mes de enero --> DD/01/AAAA si es menor a 1 y mayor a 31, puesto que es incorrecto, indicandole al usuario que digite un fecha correcta, y así, se valide correctamente la información, en primera debe hacerse un control así en cada mes, dependiendo de la cantidad de días, y luego sería hacer un control particular sobre febrero, aunque lo indicado sería orientar al usuario sobre cuales años son biciestos.
|
|
|
En línea
|
|
|
|
jamatbar
Desconectado
Mensajes: 104
|
Gracias por la ayuda aunque no tengo ni idea de como hacerlo :S
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[C] - Duda estructuras
« 1 2 »
Programación C/C++
|
h0oke
|
14
|
7,225
|
21 Mayo 2010, 22:34 pm
por Littlehorse
|
|
|
Duda con estructuras (struct)
Programación C/C++
|
alexis33de
|
1
|
2,748
|
28 Agosto 2010, 03:41 am
por Littlehorse
|
|
|
[Duda] Estructuras
« 1 2 »
ASM
|
xv0
|
15
|
9,256
|
12 Febrero 2013, 10:18 am
por fary
|
|
|
Duda con estructuras
Dudas Generales
|
fins94
|
1
|
2,155
|
4 Junio 2013, 18:55 pm
por ivancea96
|
|
|
Duda lista con estructuras c++
Programación C/C++
|
d00ze13
|
3
|
2,226
|
19 Diciembre 2013, 15:34 pm
por rir3760
|
|