Función esfechavalida que valide de forma separada

Iniciado por andoporto, 2 Febrero 2015, 14:52 PM

0 Miembros y 1 Visitante están viendo este tema.

andoporto

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,
        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);
}




3n31ch

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.

eferion

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

3n31ch

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 ^^

_Enko

#4
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.

eferion

Cita de: Nac-ho 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

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.

3n31ch

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)

eferion

Cita de: Nac-ho en  2 Febrero 2015, 17:04 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.

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.
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

DanielPy

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