elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Función esfechavalida que valide de forma separada
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Función esfechavalida que valide de forma separada  (Leído 3,736 veces)
andoporto

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Función esfechavalida que valide de forma separada
« en: 2 Febrero 2015, 14:52 pm »

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?


Código:
#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 Desconectado

Mensajes: 445


Grandes conocimientos engendran grandes dudas


Ver Perfil
Re: Función esfechavalida que valide de forma separada
« Respuesta #1 en: 2 Febrero 2015, 15:56 pm »

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 Desconectado

Mensajes: 1.248


Ver Perfil
Re: Función esfechavalida que valide de forma separada
« Respuesta #2 en: 2 Febrero 2015, 16:04 pm »

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 Desconectado

Mensajes: 445


Grandes conocimientos engendran grandes dudas


Ver Perfil
Re: Función esfechavalida que valide de forma separada
« Respuesta #3 en: 2 Febrero 2015, 16:14 pm »

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  :xD

Bueno también es una opción, ya tienes muchas de donde escoger, luego nos dices si te funciona alguna ^^
En línea

_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: Función esfechavalida que valide de forma separada
« Respuesta #4 en: 2 Febrero 2015, 16:39 pm »

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.
Citar
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 Desconectado

Mensajes: 1.248


Ver Perfil
Re: Función esfechavalida que valide de forma separada
« Respuesta #5 en: 2 Febrero 2015, 16:52 pm »

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  :xD

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 Desconectado

Mensajes: 445


Grandes conocimientos engendran grandes dudas


Ver Perfil
Re: Función esfechavalida que valide de forma separada
« Respuesta #6 en: 2 Febrero 2015, 17:04 pm »

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  :P

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  :xD (lamento si hubo un mal entendido)
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Función esfechavalida que valide de forma separada
« Respuesta #7 en: 2 Febrero 2015, 17:10 pm »

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  :xD (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  :xD

Un saludo.
En línea

Orubatosu


Desconectado Desconectado

Mensajes: 2.515


Ver Perfil WWW
Re: Función esfechavalida que valide de forma separada
« Respuesta #8 en: 3 Febrero 2015, 10:16 am »

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 Desconectado

Mensajes: 145



Ver Perfil
Re: Función esfechavalida que valide de forma separada
« Respuesta #9 en: 3 Febrero 2015, 14:52 pm »

Hola a todos.
Citar
…..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.-
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
compilacion separada
Java
yovaninu 2 3,323 Último mensaje 4 Mayo 2008, 04:46 am
por yovaninu
Crear un bat que valide informacion de un archivo
Scripting
dablind 1 2,515 Último mensaje 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 Último mensaje 12 Julio 2011, 16:57 pm
por raul338
leer secuencia separada por espacios
Programación C/C++
pMV2ere 2 4,343 Último mensaje 2 Diciembre 2012, 18:22 pm
por pMV2ere
TextBox que solo valide Emails
Programación Visual Basic
Brian1511 2 1,988 Último mensaje 17 Julio 2013, 20:16 pm
por Brian1511
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines