Foros del Web » Programación para mayores de 30 ;) » Programación General »

Validacién en C

Estas en el tema de Validacién en C en el foro de Programación General en Foros del Web. Saludos! Necesito hacer una validación a un dato ingresado por el usuario. Las condiciones a cumplir son: 1) Que sea un número. 2) Que dicho ...
  #1 (permalink)  
Antiguo 06/05/2005, 18:01
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Validacién en C

Saludos!

Necesito hacer una validación a un dato ingresado por el usuario. Las condiciones a cumplir son:
1) Que sea un número.
2) Que dicho número no sea menor que cero ni mayor que nueve (ó que sea un número entre 0 y 9 )

Ya lo he intentado.. y suena fácil... pero no le hayo . ¿Qué hay de malo con esto?
Código:
do {
    scanf("%d", &variable);
} while (!isdigit(variable) || variable<0 || variable>9);
Obviamente antes insertando las librerias correspondientes (ctype.h)...

El resultado que obtengo con esto es que si ingreso una letra me produce un ciclo infinito... lo extraño es que es el mismo comportamiento si no niego isdigit... e incluso si no lo inserto...

Utilizo scanf porque tengo que dar la opción a el usuario de que "corrija" si ha escrito un número que no quiere...

La verdad me apena decir que no le hayo... ¿en qué falla?, ¿qué es lo correcto??....

Gracias de antemano.
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #2 (permalink)  
Antiguo 06/05/2005, 19:12
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
while (!isdigit(variable) || variable<0 || variable>9);

Estas comprobando que alguna de estas tres condiciones se cumpla, estas poniendo || que sinigica or cuando deberias poner && que significa and.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 06/05/2005, 19:25
 
Fecha de Ingreso: diciembre-2002
Mensajes: 23
Antigüedad: 21 años, 4 meses
Puntos: 0
La funcion isdigit se utiliza para verificar si un determinado caracter es un digito o no, no la puedes utilizar para verificar si la entrada en tu caso es valida.
Lo que necesitas hacer es:

* Revisar el valor que devuelve scanf
* Verificar que los limites (0 y 9) no se sobrepasen.

Por ejemplo:
Código:
while (scanf("%d", &variable) != 1 || variable < 0 || variable > 9)
{
   /* pedir la entrada de nuevo */
}
Un saludo
  #4 (permalink)  
Antiguo 07/05/2005, 03:24
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Ese codigo sigue estando mal si, como dice el primer post, todas las condiciones deben cumplirse.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 07/05/2005, 04:59
 
Fecha de Ingreso: diciembre-2002
Mensajes: 23
Antigüedad: 21 años, 4 meses
Puntos: 0
El fragmento de codigo que mencione en el mensaje anterior es correcto ya que la condicion de salida del bucle while es que scanf devuelva un valor de 1 y que el numero almacenado en 'variable' sea igual o mayor que 0 e igual o menor que 9.

Un pequeño programa de prueba es:
Código:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int variable;
   
   printf("Introduce un numero: ");
   fflush(stdout);
   
   while (scanf("%d", &variable) != 1 || variable < 0 || variable > 9){
      puts("El rango valido es solo de 0 a 9.");
      printf("Introduce un numero: ");
      fflush(stdout);
   }
   
   printf("El valor de \'variable\' es %d\n", variable);
   return EXIT_SUCCESS;
}
Un saludo
  #6 (permalink)  
Antiguo 07/05/2005, 05:03
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Si, pone q y contame que pasa.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 07/05/2005, 05:28
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Asi funcionaria, igual me parece horrible ...

Código:
while (scanf("%d", &variable) != 1 || variable < 0 || variable > 9){
      puts("El rango valido es solo de 0 a 9.");
      printf("Introduce un numero: ");
      fflush(stdin);
}
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 08/05/2005 a las 05:24
  #8 (permalink)  
Antiguo 08/05/2005, 05:14
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Cita:
Iniciado por Eternal Idol
Estas comprobando que alguna de estas tres condiciones se cumpla, estas poniendo || que sinigica or cuando deberias poner && que significa and.
..... .... ... según sé... OR ma dará verdadero si alguna y al menos una condición me devuelve verdadero... y es el valor verdadero que necesito para que me repita lo que esta entre el do y el while() ¿no?

Entonces, yo solo necesito que al menos una condición me devuelva verdadero.. . teniendo lo que tengo ahora
Código:
!isdigit(variable) || variable<0 || variable>9
Debería tener los siguentes resultados:

Ingresando un valor correcto como 5:
- !isdigit -- false (sí lo es)
- variable<0 -- false (es mayor)
- variable >9 -- false (es menor)
Resultado??.. continuo... me quedo con el valor

Ingresando un número fuera de rango como lo es 15:
- !isdigit -- false (sí lo es)
- variable<0 -- false (es mayor)
- variable>9 -- TRUE (en efecto es mayor)
Resultado... teniendo un TRUE y utlizardo OR ... se repite el ciclo

Ingrasando una letra:
- !isdigit -- TRUE (no lo es) <- Y con esto debería bastar y sobrar
- variable<0 -- ¿? ni idea... no es número.. ¿por su valor en ASCII??
- variable>9 -- ¿? lo mismo que lo anterior
Resultado: Por no ser dígito tenemos TRUE.. debería repetir el ciclo.


... es por eso que según yo debe de manejarse OR y no AND ... ya que AND me regresaria verdadero solo sí todas las condicones se cumplen... si esto es cierto el simple hecho de condicionar variable<0 && variable>9 no aplicaría.. prácticamente sería una contradicción

Con un valor 10:
- variable<0 -- false
- variable>9 -- true
Resultado: Continuo.. me quedo con 10 ya que por el AND tener un false y un true me regresa FALSO... pero el 10 no sería un número válido para mi...

Lo he comprobado.. tampoco hablo solo por hablar... temo que el AND no me funciona...

También he intentado ( ya casi adivinando) con while (!isdigit(variable) && (variable<0 || variable>9)) y tampoco he obtenido buenos resultados...

Temo que la estructura que necesito es de do{ } while();... No sé cómo adaptar lo que me sugiere rir3760... básicamente dónde va el fflush(stdin) y qué hace???.... ¿por qué es horrible Eternal_Idol?

... Prácticamente lo que tengo funciona de alguna manera... ingreso una letra y me repite el ciclo... pero ¿por qué un ciclo infinito???, ¿por qué no me respeta el scanf???

Mil gracias por la atención prestada.. Saludos!
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #9 (permalink)  
Antiguo 08/05/2005, 05:28
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
El fflush(stdin) tenes que ponerlo despues del scanf para que limpie el buffer, en este caso por ejemplo cuando te ponen una letra y entonces por eso sigue repitiendo el ciclo, limpiando el buffer ya no pasa.

Diferencias de criterio, yo lo haria asi:

Código:
for (;;)
{
  if ( (scanf("%d", &variable) == 1) && (variable >= 0) && (variable <= 9) ) { break; }
  puts("El rango valido es solo de 0 a 9.");
  printf("Introduce un numero: ");
  fflush(stdin);
}
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #10 (permalink)  
Antiguo 08/05/2005, 05:49
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Hay otro fallo, y es que si se incluye el scanf en la condición junto con variable>0 && variable<9 puede que ello se comprae antes o después.

Depende del compilador, las comparaciones se empiezan por la primera, la última...
  #11 (permalink)  
Antiguo 08/05/2005, 14:23
Avatar de Spike_ak  
Fecha de Ingreso: marzo-2005
Ubicación: Argentina
Mensajes: 442
Antigüedad: 19 años, 1 mes
Puntos: 0
Condicion

Hola,porque no pones una condicion para validar el numero? y usas char?
__________________
*****************************************
la Ignorancia es la fuerza
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:05.