Autor
|
Tema: Función esfechavalida que valide de forma separada (Leído 3,736 veces)
|
andoporto
Desconectado
Mensajes: 17
|
Hola tengo la siguiente codificación, me anda pero como hago para que me indique si el día, el mes o el año son incorrectos de forma separada? #include <stdlib.h> #include <stdio.h>
typedef struct { int dia, mes, anio; } t_fecha;
void IngrDato(); int EsFechaValida(int,int,int); int CantDiasMes(int,int); int EsBisiesto(int);
int main() { system("cls"); IngrDato(); printf("\n"); return 0; }
void IngrDato() { t_fecha fecha; printf("\n Ingrese el d%ca: ",161); scanf("%d",&fecha.dia); printf("\n Ingrese el mes: "); scanf("%d",&fecha.mes); printf("\n Ingrese un a%co: ",164); scanf("%d",&fecha.anio);
if (EsFechaValida(fecha.dia,fecha.mes,fecha.anio) == 1) printf("\n Es valida"); else printf("\n No es valida"); }
int EsFechaValida(int dia,int mes,int anio) { int fv = 0; if (anio > 1600) if (mes >= 1 && mes <= 12) if (dia >= 1 && dia <= CantDiasMes(mes,anio)) fv = 1; return (fv); }
int CantDiasMes(int mm,int aa) { int cdm; cdm = 31;
if(mm == 4 || mm == 6 || mm == 9 || mm == 11 ) { cdm = 30; } else { if (mm == 2) { cdm = 28+EsBisiesto(aa); } } return(cdm); }
int EsBisiesto(int a) { int b; if ((a%4==0 || a%100==0)||(a%400==0)) b=1; else b=0; return(b); }
|
|
|
En línea
|
|
|
|
3n31ch
Desconectado
Mensajes: 445
Grandes conocimientos engendran grandes dudas
|
Primero que todo, recuerda utilizar las etiquetas [ code ]. Para hacer esto, modifica tu mensaje, selecciona el código, luego haz clicl sobre el combobox que dice GeSHi y selecciona el lenguaje de programación en este caso C++
No te pondré código para no arruinar el ejercicio, es importante que aprendas por tu cuenta, solo te daré un par de idas.
1) Puedes hacer que el metodo EsFechaValida en vez de devolver un int devuelva un string. En el string guarda el mensaje de error, por ejemplo, "El año es invalido" , y si el string devuelto esta vacío quiere decir que la fecha es valida si no esta vacío entonces es invalida.
2) En el mismo metido añade el mensaje de error en cada else, si el año es incorrecto pues imprimes que el año es incorrecto y luego retornas un 0.
Ten en cuenta que en ese código estas verificando si el año es correcto, si lo es luego verificas el mes y si este lo es el día... por esta razón si el año y el día es incorrecto solo te darás cuenta del año (ya que nunca verificaste el día).
Suerte y si tienes algún problema dime e intentare ayudarte.
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
También puedes devolver simplemente un int que, dependiendo de su valor, indique si la fecha es correcta o, de producirse un error, dónde se encuentra.
Por ejemplo:
0 -> Fecha correcta 1 -> Año no válido 2 -> Mes no válido 3 -> Día no válido
Puedes asignar los valores que te de la gana, hay gente que prefiere poner valores negativos a los errores.
Un saludo
|
|
|
En línea
|
|
|
|
3n31ch
Desconectado
Mensajes: 445
Grandes conocimientos engendran grandes dudas
|
Buaaa pero que pasa si quiere el año y el día, o el mes el día y el año tendría que tener números para cada combinación Bueno también es una opción, ya tienes muchas de donde escoger, luego nos dices si te funciona alguna ^^
|
|
|
En línea
|
|
|
|
_Enko
|
Usar un int con 3 digitos? Primer digito para el dia, segundo para el mes y tercero para el año. Por ahi es mejor cambiar el nombre de la funcion por "EsFechaInvalida" porque seria mas comodo retornar 0 para cuando es valida. 000: los tres son validos 100: dia invalido 010: mes invalido 001: año invalido 111: dia, año mes invalidos 110... 011...
Ojo que no es binario. Es "cien" 100 para el dia invalido. Pero podria ser 800, 700, 600... Empiezas con 0, le sumas 100 si el dia es invalido, le sumas 10 si el mes es invalido y le sumas 1 si el año es invalido por ejemplo. O 700, 70, 7... 0xF00, 0x0F0, 0x00F... da igual. Saludos.
|
|
« Última modificación: 2 Febrero 2015, 16:50 pm por _Enko »
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
Buaaa pero que pasa si quiere el año y el día, o el mes el día y el año tendría que tener números para cada combinación Retornar un string con el mensaje de error es una mala idea porque esa solución plantea un problema de acomplamiento. Te limita el uso de esa función a un único idioma. Puedo aceptar que se diga que la función es muy sencilla y que no es para nada serio... pero dado que está aprendiendo es mejor evitar malos vicios como el que comentas de devolver el string. Por otro lado, yo no planteaba mi solución bajo la posibilidad de que la función pudiese indicar algo del tipo "el día y el mes no son válidos"... lo suyo sería o bien decir directamente que la fecha no es válida o bien soltar un mensaje del tipo "el año no es válido" y, una vez corregido el año, avisar de que el mes no es válido.
|
|
|
En línea
|
|
|
|
3n31ch
Desconectado
Mensajes: 445
Grandes conocimientos engendran grandes dudas
|
Pues si eferion, tienes razon. (Aunque la verdad nunca pense en la internacionalización, pero claramente afectaría a la moduladoridad del método, y seria una mala practica) Por otro lado _Enko tu idea me pareció muy buena PD: eferion no se si lo dijiste con animo de pelear o algo pero ese nunca fue mi interés así que pensare que tampoco el tuyo (lamento si hubo un mal entendido)
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
PD: eferion no se si lo dijiste con animo de pelear o algo pero ese nunca fue mi interés así que pensare que tampoco el tuyo (lamento si hubo un mal entendido) Para nada... pelear en el foro no lleva a ninguna parte. Únicamente he intentado exponer mi punto de vista... aunque todos sabemos que los foros no son especialmente buenos a la hora de transmitir emociones salvo que te dediques a poner veinte emoticonos por cada palabra escrita Un saludo.
|
|
|
En línea
|
|
|
|
Orubatosu
|
Veo que usas 3 funciones para hacer las comprobaciones. Bueno, cada cual se trocea el trabajo como quieres.
Pero puestos a aportar alguna idea, yo de una función que me tiene que devolver si un dato es correcto o no... uso un booleano, me parece lo mas sencillo.
|
|
|
En línea
|
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness" Hideto Matsumoto 1964-1998
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Hola a todos. …..aunque todos sabemos que los foros no son especialmente buenos a la hora de transmitir emociones salvo que te dediques a poner veinte emoticonos por cada palabra escrita. eferion, sabias palabras, que buen resumen de lo que me ha ocurrido tantas veces en este y otros foros, por Dios que difícil se torna esta comunicación de los foros- Eternal, borra este pos cuando lo desees y mil disculpas Orubatosu pero me sentí tan identificado con las palabras de eferion que no pude resistir.Saludos. Pino1952
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
compilacion separada
Java
|
yovaninu
|
2
|
3,323
|
4 Mayo 2008, 04:46 am
por yovaninu
|
|
|
Crear un bat que valide informacion de un archivo
Scripting
|
dablind
|
1
|
2,515
|
11 Diciembre 2010, 19:09 pm
por leogtz
|
|
|
otra forma de llamar a una funcion de una DLL
Programación Visual Basic
|
AlxSpy
|
3
|
2,056
|
12 Julio 2011, 16:57 pm
por raul338
|
|
|
leer secuencia separada por espacios
Programación C/C++
|
pMV2ere
|
2
|
4,343
|
2 Diciembre 2012, 18:22 pm
por pMV2ere
|
|
|
TextBox que solo valide Emails
Programación Visual Basic
|
Brian1511
|
2
|
1,988
|
17 Julio 2013, 20:16 pm
por Brian1511
|
|