Problema con ejercicio de clase (Estructuras de selección)

Iniciado por foreground, 4 Marzo 2013, 11:00 AM

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

foreground

Buenos días a todos.  El caso es que tengo un problema con un ejercicio de clase ya que el programa que he hecho me compila pero no hace lo que se supone que debería hacer. El enunciado del problema en cuestión es:

CitarPedir al usuario una fecha: día, mes y año. Indicar si
la fecha es incorrecta. Para que la fecha sea
correcta:
•El año debe ser menor que 2050 y mayor que 1900.
•El mes debe estar comprendido entre 1 y 12.
•El día debe estar comprendido:

Entre 1y31 si el mes es: enero,marzo,mayo,julio, agosto, octubre o diciembre.
Entre 1 y 30 si el mes es: abril, junio, septiembre o noviembre
Entre 1 y 28 si el mes es febrero. No se considera si
el año es bisiesto o no

El código que pense para realizar el programa es el siguiente (no obstante da igual los datos que ponga ya que en ningun caso me muestra si la fecha es correcta o no):

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int dia,mes,anyo;
    printf("Introduzca el dia, el mes y el anyo \n");
    scanf("%d%d%d", &dia,&mes,&anyo);
    if((((dia>1) || (dia<31)) && ((anyo>1900) || (anyo<2050))) && (((mes<1) || (mes>12)) &&  (((mes==1) || (mes==3) || (mes==5) || (mes==7) || (mes==8) || (mes==10) || (mes==12)))))
    printf("Fecha correcta \n");
    if((((dia>1) || (dia<30)) && ((anyo>1900) || (anyo<2050))) && (((mes<1) || (mes>12)) && (((mes==4) || (mes==6) || (mes==9) || (mes==11)))))
    printf("Fecha correcta \n");
    if((((dia>1) || (dia<28)) && ((anyo>1900) || (anyo<2050))) && (((mes<1) || (mes>12)) && ((mes==2))))
    printf("Fecha correcta \n");
     
    system("PAUSE");
    return 0;
}


naderST

#1
(((mes<1) || (mes>12))

Si el mes es menor a uno y mayor a doce? Esto sería más bien así:

mes>=1 && mes<=12

Todas las comparaciones las deberías hacer estrictamente, es decir, mayor o igual y menor o igual

EDIT:

No te hace falta la comparación del rango en el cual está comprendido el mes, ya que compruebas directamente con el número del mes.

fer912

buenos dias, hace mucho que no uso c pero por que no lo desglosas por partes
por ejemplo el primer filtro que tenes es el año este va desde 1900 a 2050 cosa que con un if lo solucionas.
por lo que veo, el mes tambien lo pones en numero o sea que con us switch se soluciona desde 1 a 12
y por ultimo te queda los dias

if ( anyo >= 1900 && anyo <=2500)
{
   switch mes
           case (aca pones en numero los meses de 31 dias)
                    if (dia >=1 && dia<=31)
                     
           case (aca los de 30)
           case 2: "Febrero"
}

lamento no poder ayudarte mas, hace mucho que no programo, si esto lo pones en una funcion bool por ejemplo se entenderia mejor, saludos

rir3760

Si puedes manejar funciones puedes utilizar una para encapsular en ella la petición de un numero entero, un ejemplo sencillo:
#include <stdio.h>
#include <stdlib.h>

int fn_leer(char const *msj);

int main(void)
{
   int dia;
   int mes;
   int año;
   
   dia = fn_leer("Introduce el dia: ");
   mes = fn_leer("Introduce el mes: ");
   año = fn_leer("Introduce el año: ");
   
   printf("%d %d %d\n", dia, mes, año);
   
   return EXIT_SUCCESS;
}

int fn_leer(char const *msj)
{
   int rv;
   int num;
   int ch;
   
   printf("%s", msj);
   fflush(stdout);
   rv = scanf("%d", &num);
   while ((ch = getchar()) != EOF && ch != '\n')
      ;
   
   return rv == 1 ? num : -1;
}


Para conocer si el día, mes y año están en el rango valido debes seguir las indicaciones que te han dado y también utilizar el motor de búsqueda de los foros (hay varios temas sobre ello).

Un saludo
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

foreground

Al final solo cambie los operadores como dijo naderST y el programa funciono perfectamente.

Respecto a lo que has dicho rir3760 aun no he manejado esas posibilidades, por lo que he preferido hacerlo del primero modo ya que desconozco gran parte de las partes del codigo que has puesto tales como el fflush(stdout) o los usos del return.

Muchísimas gracias por las respuestas.

leosansan

#5
Cita de: foreground en  7 Marzo 2013, 21:34 PM
Al final solo cambie los operadores como dijo naderST y el programa funciono perfectamente.

.........................


Creo que estas equivocado en cuanto a que ya funciona bien , fíjate en esta entrada:

Código (cpp) [Seleccionar]
Introduzca el dia, el mes y el anyo
6
6
2012
Presione una tecla para continuar . . .


Ni correcto ni incorrecto ni nada.

Uno de los problemas básicos está que en lugar de || ha de ir && tanto en años como en días. Por ejemplo 32 es mayor que 1 con lo que cumple la condición si está en un ||. Y 1800 cumple con la condición al ser menor que 2050.

Además te falta "encadenar" los condicionales.Se puede comprobar primero el año y si cumple se comprueba el día y mes, que a su vez se puede simplificar.

Y claro falta la opción de "fecha incorrecta" y para no cambiártelo mucho tipo rir, magistral como siempre, pero que a veces está a "demasiada altura", quedaría algo como esto:


Código (cpp) [Seleccionar]
#include <stdio.h>

int main()
{
   int dia,mes,anyo;
   printf("Introduzca el dia, el mes y el anyo \n");
   scanf("%d%d%d", &dia,&mes,&anyo);
   if(anyo>=1900 && anyo<=2050){
       if((dia>=1 && dia<=31 ) &&  (mes==1 || mes==3 || mes==5 || mes==7 || mes==8 || mes==10 || mes==12))
           printf("Fecha correcta \n");
       else if((dia>=1 && dia<=30)  && mes!=2)
           printf("Fecha correcta \n");
       else if((dia>=1 && dia<=28)   && mes==2)
           printf("Fecha correcta \n");
       else
           printf("Fecha incorrecta \n");
   }
   else printf("Fecha incorrecta \n");
   system("PAUSE");
   return 0;
}


Saluditos!
. ....

P.D: Mírate lo que te comentaron del switch,