• Viernes 8 de Noviembre de 2024, 11:40

Autor Tema:  validar entero para seleccion de un menu  (Leído 4408 veces)

kurtjavier

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
validar entero para seleccion de un menu
« en: Domingo 27 de Septiembre de 2009, 00:54 »
0
Hola como estan todos, soy nuevo aqui en el foro, estuve buscando algun foro de programacion en c++ y me tope con este....vamos a ver que tal me va por aca.

El hecho es que no se nada de excepciones en c++, tengo el libro de Programacion en c++ 2da edicion de joyanes donde hablan del tema pero no entiendo mucho. Bueno lo que estoy buscando por ahora es muy sencillo, practicando listas doblemente enlazadas he creado un programa para manejar una agenda telefonica, con la posibilidad de cargar la agenda desde un archivo a la lista y tambien guardar la agenda a un archivo desde la lista enlazada.

En el programa tengo varios menu donde el usuario selecciona una opcion leo el entero y ejecuto lo que el usuario ingresa, el problema viene cuando el usuario no ingresa un numero sino que ingresa una letra o un simbolo o un valor mayor a la capacidad de un entero, provocando un error, mi menu simplemente dice opcion invalida pero se ejecuta infinitamente por la misma condicion de un while que tengo no se para, por lo menos en java se como tratar estos problemas con excepciones, pero en c++ no tengo ni idea, si alguien puede darme una mano. aqui les dejo codigo del primer menu nada mas.

Código: C++
  1.  
  2. int menu()
  3. {
  4.     int opc=0;
  5.     system ("cls");
  6.     do
  7.     {
  8.         cout<<"nn1.Agregar contacton2.Eliminar contacton3.Buscar contacton4.Buscar multiples contactosn5.Listar todon6.Cargar agenda desde archivon7.Guardar agenda a archivon8.Salir"<<endl;
  9.         cin>>opc;
  10.         if(opc>0&&opc<9)
  11.             return opc;
  12.         else
  13.             cout<<"nOpcion invalida"<<endl;
  14.     }while(true);
  15.     return 8;
  16. }
  17.  
  18.  

cuando lee mal repite el do por la misma condicion del while pero no se para en el menu para leer la opcion sino que sigue sin pararse. Por lo menos en java manejo la excepcion en un bloque try y catch facil, pero c++ trato de hacerlo igual que he leido se puede hacer y no funciona, si ingreso una letra o un simbolo dice opcion invalida pero el menu se ejecuta infinitamente por el true del while. Trato limpiando el buffer de entrada pero tampoco. Bueno espero alguien me eche una mano por aca saludos
« última modificación: Domingo 27 de Septiembre de 2009, 16:54 por kurtjavier »

kurtjavier

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: como trabajar con excepciones
« Respuesta #1 en: Domingo 27 de Septiembre de 2009, 06:58 »
0
ok buscando y buscando encontre que taba buscando mal debi bucar sobre validacion de un entero, y bueno buscando sobre eso encontre como manejar el error cuando se introduce un simbolo:

Código: C++
  1.  
  2. int menu()
  3. {
  4.     int opc=0;
  5.     system ("cls");
  6.     do
  7.     {
  8.         cout<<"nn1.Agregar contacton2.Eliminar contacton3.Buscar contacton4.Buscar multiples contactosn5.Listar todon6.Cargar agenda desde archivon7.Guardar agenda a archivon8.Salir"<<endl;
  9.         cin>>opc;
  10.         cin.ignore(numeric_limits<int>::max(), 'n');
  11.         if (!cin || cin.gcount() != 1)
  12.         {
  13.             cout<<"nNo valido"<<endl;
  14.             cin.clear();
  15.             opc=0;
  16.         }
  17.         if(opc>0&&opc<9)
  18.             return opc;
  19.         else
  20.             cout<<"nOpcion invalida"<<endl;
  21.     }while(true);
  22.     return 8;
  23. }
  24.  
  25.  

si no lee un entero muetra el mensaje NO VALIDO limpia hago opc=0 y sigo el while se ejecuta nuevamente por el true esta bien, y muestra el menu y se para para que el usuario ingrese otra opcion, pero si introduzco una letra se muestra en mensaje de error igual se limpia pero no se para siguemostrando el menu y com osi estuviera leyendo la letra otra ves indefinidamente, porque pasa esto con ua letra y no con un simbolo como seria la forma correcta de manejar ese error sea lo que sea que se introduzca mientras no sea un entero :S

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: como trabajar con excepciones
« Respuesta #2 en: Domingo 27 de Septiembre de 2009, 10:36 »
0
Bueno, como ya viste esto no tiene nada que ver con las excepciones, no se produce ninguna. Si llamas a clear ANTES del ignore te va a funcionar bien tambien con letras, sino ya esta puesto el flag failbit en el stream (por la letra) y entonces ignore no hace nada.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

kurtjavier

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: como trabajar con excepciones
« Respuesta #3 en: Domingo 27 de Septiembre de 2009, 16:53 »
0
Cita de: "Eternal Idol"
Bueno, como ya viste esto no tiene nada que ver con las excepciones, no se produce ninguna. Si llamas a clear ANTES del ignore te va a funcionar bien tambien con letras, sino ya esta puesto el flag failbit en el stream (por la letra) y entonces ignore no hace nada.

si como en java se maneja como excepcion asi lo estaba buscando para c++ y bueno ya vi como hacerlo mmm de una manera digamos que funciona pero no se si es la mas correcta:

Código: C++
  1.  
  2. int menu()
  3. {
  4.     int opc=0;
  5.     system ("cls");
  6.     do
  7.     {
  8.         cout<<"nn1.Agregar contacton2.Eliminar contacton3.Buscar contacton4.Buscar multiples contactosn5.Listar todon6.Cargar agenda desde archivon7.Guardar agenda a archivon8.Salir"<<endl;
  9.         while(!(cin>>opc))
  10.         {
  11.             cout<<"nNo valido"<<endl;
  12.             cin.clear();
  13.             cin.ignore(numeric_limits<streamsize>::max(), 'n');
  14.         }
  15.         if(opc>0&&opc<9)
  16.             return opc;
  17.         else
  18.             cout<<"nOpcion invalida"<<endl;
  19.     }while(true);
  20.     return 8;
  21. }
  22.  
  23.  

Con la condicion del while anidado dentro del do-while  si la entrada no fue correcta  "if(!(cin>>opc))" llamamos al clear para que limpie, quitamos de la entrada lo que se leyo para que no siga causando problemas, en este caso no le especifico que es de tamañ ode un entero sino que tome todo el tamaño de lo que esta en la entrada "cin.ignore(numeric_limits<streamsize>::max(), 'n');" y vuelve a esperar la nueva lectura, de ese modo cunado se lea el entero si seguira sin problemas.

saque la informacion de aqui  " augustcouncil.com/~tgibson/tutorial/iotips.html "  esta buena la pagina ...

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: validar entero para seleccion de un menu
« Respuesta #4 en: Domingo 27 de Septiembre de 2009, 17:46 »
0
Yo usaria sync en lugar de ignore.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

kurtjavier

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: validar entero para seleccion de un menu
« Respuesta #5 en: Domingo 27 de Septiembre de 2009, 18:56 »
0
mmm mejor todavia asi no tengo que importar la limits.