Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Netzari Limas en 25 Marzo 2015, 07:18 am



Título: isdigit(); problema con validacion de caracteres
Publicado por: Netzari Limas en 25 Marzo 2015, 07:18 am
Buenas, soy nuevo en este foro y quisiera saber si me pueden ayudar con mi codigo..

Código
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <math.h>
  4. using namespace std;
  5. int numeros[10];
  6.  
  7. int i,n;
  8. int j;
  9. int main(int argc, char *argv[])
  10. {
  11.  
  12.    char desea;
  13.    do
  14.    {
  15.    cout << "Bienvenido al programa para desplegar 10 numeros! \n"<<endl;
  16.    for (i=0; i<=9; i++)
  17.    {
  18.  printf("Ingrese un numero %i: ", i+1);
  19.  scanf("%i", &numeros[i]);
  20.  //FALTA VALIDAR EL INGRESO DE CARACTERES//              
  21.        }
  22.        for (j=0; j<=9; j++)
  23.        {
  24.            cout << numeros[j];
  25.            cout <<"\n";
  26.            }
  27.            fflush(stdin);
  28.            cout << "Desea continuar con el programa ? (S/N) \n";
  29.            cin >>desea;
  30.            desea = toupper(desea);
  31.            if (desea!='S' && desea!='N')
  32.            {
  33.                           do
  34.                           {
  35.                           fflush(stdin);
  36.                           cout <<"Error! inserte (S/N) \n";
  37.                           cin >>desea;
  38.                           desea = toupper(desea);
  39.                           }while (desea!='S' && desea!='N');
  40.                           }  
  41.            }while(desea=='S');
  42.    system("PAUSE");
  43.    return EXIT_SUCCESS;
  44. }
  45.  

Se supone que mi programa se ingresan numeros, pero tengo que validar que no se puedan ingresar caracteres al principio y cuando me pide que inserte un numero, e ingreso un caracter me lanza error. Ayuda plz como uso ahi el isdigit();

Gracias de antemano:)


Título: Re: isdigit(); problema con validacion de caracteres
Publicado por: eferion en 25 Marzo 2015, 08:20 am
Código
  1.    cout << "Bienvenido al programa para desplegar 10 numeros! \n"<<endl;
  2.    for (i=0; i<=9; i++)
  3.    {
  4.  printf("Ingrese un numero %i: ", i+1);
  5.  scanf("%i", &numeros[i]);

No tiene demasiado sentido que estés mezclando "cout" (propio de C++) con "printf" (herencia de C). Lo suyo, por claridad, es que usases todo el rato "cout". Lo mismo te digo con "cin" y "scanf".

Código
  1. flush(stdin);

Vaya manía con usar fflush sobre los buffer de entrada... fflush está pensado para ser utilizado con los buffer de salida, no con los de entrada. Usar fflush sobre un buffer de entrada va a dar un resultado indeterminado, es decir, puede que en tu casa funcione perfectamente y que delante del profesor falle sin remedio. Hay otras alternativas (aunque quizás no tan "bonitas") para vaciar el buffer de entrada... por ejemplo algo del tipo:

Código
  1. #include <limits>
  2.  
  3. cin.ignore(numeric_limits<int>::max());

Hablando de tu problema, lo que quieres es verificar que la tecla pulsada por el usuario se corresponde, efectivamente, con un número. Lo que tienes que hacer entonces es leer un carácter y verificar si dicho carácter se corresponde con un dígito o no. Algo tal que:

Código
  1. int numero = 0;
  2. char c;
  3. cin >> c;
  4. if ( is_digit( c ) )
  5. {
  6.  // Es un dígito numérico
  7.  numero = c - '0';
  8. }
  9. else
  10. {
  11.  // No es un dígito numérico
  12. }

Por cierto, el include a math.h... que usando la versión C++ debería quedar tal que "#include <cmath>", te sobra. No estás haciendo uso de ninguna función matemática que yo vea.

Un saludo.


Título: Re: isdigit(); problema con validacion de caracteres
Publicado por: Netzari Limas en 25 Marzo 2015, 22:03 pm
Disculpa, muchas gracias portu ayuda, ahora ya puedohacerlo, pero falta un detalle que todavia ando checando y si pudieras ayudarme un poco te lo agradeceria:)

Código
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <cmath>
  4. using namespace std;
  5. int numeros[10];
  6.  
  7. int i,n;
  8. int j;
  9. int main(int argc, char *argv[])
  10. {
  11.  
  12.    char desea;
  13.    char c;
  14.    do
  15.    {
  16.    cout << "Bienvenido al programa para desplegar 10 numeros! \n"<<endl;
  17.    for (i=0; i<=9; i++)
  18.    {
  19.  cout<<"Ingrese un numero "  <<i+1<<endl;
  20.  cin >>c;
  21.  if(isdigit(c))
  22.  {
  23.                 numeros[i]= c - '0';
  24.                 }
  25.                 else
  26.                 {
  27.                     cout <<"No es un digito numerico \n";
  28.                     i--;
  29.                     }              
  30.        }
  31.        for (j=0; j<=9; j++)
  32.        {
  33.            cout << numeros[j];
  34.            cout <<"\n";
  35.            }
  36.            fflush(stdin);
  37.            cout << "Desea continuar con el programa ? (S/N) \n";
  38.            cin >>desea;
  39.            desea = toupper(desea);
  40.            if (desea!='S' && desea!='N')
  41.            {
  42.                           do
  43.                           {
  44.                           fflush(stdin);
  45.                           cout <<"Error! inserte (S/N) \n";
  46.                           cin >>desea;
  47.                           desea = toupper(desea);
  48.                           }while (desea!='S' && desea!='N');
  49.                           }  
  50.            }while(desea=='S');
  51.    system("PAUSE");
  52.    return EXIT_SUCCESS;
  53. }
  54.  

Cuando inserto ahora mas de dosdigitos ejemplo: 23 , me lo toma como dos.. y se salta 2 preguntas... :/ que puedo hacer para que el caracter le quepan mas numeros?

GRACIAS:)


Título: Re: isdigit(); problema con validacion de caracteres
Publicado por: NOIS en 26 Marzo 2015, 08:00 am
Puedes hacer un array del char, utilizar un int para registrar los números o, ya que estás en C++ usar string


Título: Re: isdigit(); problema con validacion de caracteres
Publicado por: eferion en 26 Marzo 2015, 08:05 am
Tienes varias opciones:

1. Leer la entrada del tirón como si fuese un string y comparar dígito a dígito:

Código
  1. std::string cad;
  2. cin >> cad;
  3. for( int i=0; i < cad.length( ); ++i )
  4. {
  5.  if ( !std::is_digit( cad[ i ] ) )
  6.  {
  7.    // ERROR
  8.  }
  9. }

2. Intentar leer directamente el número como tal y comprobar errores:

Código
  1. int numero;
  2. cin >> numero;
  3. if ( !cin )
  4. {
  5.  cin.clear( );
  6.  // ERROR: No es un número
  7. }