Autor
|
Tema: Problema con ejercicio de clase (Estructuras de selección) (Leído 3,123 veces)
|
foreground
Desconectado
Mensajes: 11
|
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: Pedir 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))))) if((((dia>1) || (dia<30)) && ((anyo>1900) || (anyo<2050))) && (((mes<1) || (mes>12)) && (((mes==4) || (mes==6) || (mes==9) || (mes==11))))) if((((dia>1) || (dia<28)) && ((anyo>1900) || (anyo<2050))) && (((mes<1) || (mes>12)) && ((mes==2)))) return 0; }
|
|
|
En línea
|
|
|
|
naderST
|
(((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.
|
|
« Última modificación: 4 Marzo 2013, 13:35 pm por naderST »
|
En línea
|
|
|
|
fer912
Desconectado
Mensajes: 1
|
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
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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 anio; dia = fn_leer("Introduce el dia: "); mes = fn_leer("Introduce el mes: "); anio = fn_leer("Introduce el anio: "); printf("%d %d %d\n", dia , mes , anio ); return EXIT_SUCCESS; } int fn_leer(char const *msj) { int rv; int num; int ch; 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
|
|
|
En línea
|
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
Desconectado
Mensajes: 11
|
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.
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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: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:#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,
|
|
« Última modificación: 7 Marzo 2013, 23:16 pm por leosansan »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema con ejercicio de separar interfaz de implementación de una clase
Programación C/C++
|
Mordecai
|
1
|
2,581
|
14 Septiembre 2013, 04:49 am
por erest0r
|
|
|
[SOLUCIONADO] Plantilla de una clase con estructuras
Programación C/C++
|
jesules79
|
1
|
1,811
|
18 Diciembre 2013, 23:58 pm
por jesules79
|
|
|
Compartiendo un ejercicio de selección aleatoria (C#)
Ejercicios
|
erest0r
|
0
|
2,688
|
7 Junio 2014, 22:24 pm
por erest0r
|
|
|
Ejercicio simple estructuras
Programación C/C++
|
Ja_90
|
4
|
2,478
|
13 Octubre 2014, 20:33 pm
por Ja_90
|
|
|
estructuras dentro de una clase
Programación C/C++
|
fafafa01
|
3
|
2,578
|
20 Septiembre 2017, 19:51 pm
por ivancea96
|
|