Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: andoporto en 2 Febrero 2015, 14:52 pm



Título: Función esfechavalida que valide de forma separada
Publicado por: andoporto 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,
        año;
} 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.año);

    if (EsFechaValida(fecha.dia,fecha.mes,fecha.año) == 1)
        printf("\n Es valida");
    else
        printf("\n No es valida");
}



int EsFechaValida(int dia,int mes,int año)
{
    int fv = 0;
    if (año > 1600)
        if (mes >= 1 && mes <= 12)
            if (dia >= 1 && dia <= CantDiasMes(mes,año))
                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);
}




Título: Re: Función esfechavalida que valide de forma separada
Publicado por: 3n31ch 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.


Título: Re: Función esfechavalida que valide de forma separada
Publicado por: eferion 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


Título: Re: Función esfechavalida que valide de forma separada
Publicado por: 3n31ch 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 ^^


Título: Re: Función esfechavalida que valide de forma separada
Publicado por: _Enko 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.


Título: Re: Función esfechavalida que valide de forma separada
Publicado por: eferion 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.


Título: Re: Función esfechavalida que valide de forma separada
Publicado por: 3n31ch 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)


Título: Re: Función esfechavalida que valide de forma separada
Publicado por: eferion 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.


Título: Re: Función esfechavalida que valide de forma separada
Publicado por: Orubatosu 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.


Título: Re: Función esfechavalida que valide de forma separada
Publicado por: DanielPy 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