Ayuda en la validación de entrada de datos en C++

Iniciado por theluigy13etv, 26 Junio 2011, 08:44 AM

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

theluigy13etv

Hola a todos, me alegro de haber encontrado este sitio web...veo que acá podemos compartir información..recien estoy aprendiendo a usar el C++, en particular uso el compilador Borland C++ 5.02 y tengo el siguiente problema:

Cuando realizo un programa en donde me permita ingresar solo números enteros desde 1 hasta el 100 utilizo las funciones gotoxy y clreol juntas para poder lograr con mi cometido de tal forma que si ingreso algun numero que no se encuentre en el intervalo [ 1 ; 100 ] el programe se estanque hasta que ingrese un valor válido. El código es el siguiente:

# include <string.h>
# include <conio.h>
# include <iostream.h>
# include <stdio.h>
# include <stdlib.h>
# define l 100

// ********************************************************************
int main()
{
char resp;
system("color 1e");
short int n;
gotoxy(15,5); cout<<"DATOS DE ALUMNOS";
gotoxy(15,6); cout<<"----------------";
gotoxy(5,8); cout<<"_______________________________________________";
do{
gotoxy(10,10); cout<<"Ingrese numero de alumnos a ingresar: ";
clreol(); system("color 1e"); cin>>n;
}while(100<n || n<1);
getche();
}

// ********************************************************************

El problema :-[ está cuando ingreso texto, parece que ocurre un bucle infinito y no sé cuál es la razón y como poder arreglarlo, yo sé que sería ilógico ingresar texto cuando el programa me solicita el ingreso de un número, pero quiero hacer un programa eficiente que cuando ingrese algo que no me pidan o cuando por error presione alguna tecla que no corresponda, el programa responda de la forma adecuada indicando que estoy ingresando mal los datos y que ingrese correctamente....Espero respuestas....Muchas gracias

Aaaa.. >:D..además me pregunto si es posible realizar lo anterior, pero sin usar gotoxy ni clreol pero usando las funciones de la librería estándar  :rolleyes:-

Therue

Hola segun el condicional que has puesto en el while,estas leyendo numeros hasta que se introduzca un numero menor que 1 o un numero mayor que 100.
Si quieres que un intervalo sea cerrado debes poner AND por ejemplo
(n>=1 && n<=100).Un saludo espero te sirva.

theluigy13etv

 :D Gracias por contestarme...mmm...creo que no me dejé entender...lo que quiero en esa parte del código es que el programa solo acepte valores desde 1 hasta 100...de tal forma que si ingreso 0 (0<1)  o 123 (123>100)  en cualquiera de los dos casos el programa borre dicha linea y se vuelva e ejecutar la misma instrucción de lectura hasta que ingrese el número correcto...Bueno creo que eso si lo hice más o menos bien...el problema está cuando ingreso alguna palabra o texto...el programa lo lee pero se "cuelga" como si se estuviera produciendo un bucle infinito...Espero más aportes...muchísimas gracias

Queta

Primeramente, déjame decirte de nuevo que tienes el bucle mal. El esquema y la intención son muy buenos pero lo tienes que hacer tal y como Therue mencionó. Pégale un repaso a los operadores de C/C++:

http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

Finalmente, para comprobar si has introducido un número o una cadena, puedes usar la función atoi (http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/). Te dejo un pequeño código para que lo entiendas mejor:

Código (cpp) [Seleccionar]
#include <cstdio>
#include <cstdlib>
#include <cstring>

int main()
{
char string[50];

fgets(string, 50, stdin);

if(string[strlen(string) - 1] == '\n')
string[strlen(string) - 1] = '\0';

int integer = atoi(string);

if(integer == 0)
{
printf("\n");

main();
}

else
printf("%d", integer);

//O lo que sea

getchar();

return 0;
}



PD: ¿No te da errores tu código? ¿Qué compilador estás usando?
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

theluigy13etv


leogtz

Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

theluigy13etv

Sí gracias por el comentario...gustoso lo haría pero en el lugar en donde estoy llevando el curso nos exigen a usar este compilador...y debemos de hacerlo...aunque luego que termine el curso...usaré el Dev o algún otro que sea libre.  XD

leogtz

Entiendo, pues menuda persona el que los hace que usen ese compilador, habiendo muchisimos mejores, en fin, saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com