Título: Como evitar que se introduzcan valores no válidos
Publicado por: grodomio en 17 Mayo 2013, 12:47 pm
Hola, tengo que hacer un método de una clase que compruebe si un valor introducido es válido o no. Ese valor proviene de un menú que tiene las opciones desde 0 hasta 6 incluidas. Con el código que pongo a continuación controlo los valores numéricos, pero no se cómo evitar que un usuario introduzca una letra por ejemplo. bool Help::isvalid(int option) { if(option < '0' || option > '6') { return false; } return true; } Espero vuesta ayuda, gracias.
Título: Re: Como evitar que se introduzcan valores no válidos
Publicado por: leosansan en 17 Mayo 2013, 13:28 pm
Hola, tengo que hacer un método de una clase que compruebe si un valor introducido es válido o no. Ese valor proviene de un menú que tiene las opciones desde 0 hasta 6 incluidas. Con el código que pongo a continuación controlo los valores numéricos, pero no se cómo evitar que un usuario introduzca una letra por ejemplo. bool Help::isvalid(int option) { if(option < '0' || option > '6') { return false; } return true; } Espero vuesta ayuda, gracias. Cámbiala a:bool Help::isvalid(char option) { if(option >= '0' && option< '7') { return true; } return false; } Observa que opcion debe ser char, que en pricipio debía serlo porque tienes en las condiciones '1' y '6' que son caracteres y no enteros, que entonces serían en la condición 1 y 6 sin las comillas.Saluditos!. .... (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
Título: Re: Como evitar que se introduzcan valores no válidos
Publicado por: grodomio en 17 Mayo 2013, 13:39 pm
Hola leosansan,
no veo la diferencia, lo que has hecho ha sido invertir las condiciones y los returns.
Sigue aceptando caracteres no numéricos como válidas.
Título: Re: Como evitar que se introduzcan valores no válidos
Publicado por: leosansan en 17 Mayo 2013, 14:10 pm
Hola leosansan,
no veo la diferencia, lo que has hecho ha sido invertir las condiciones y los returns.
Sigue aceptando caracteres no numéricos como válidas.
Como te lo he puesto si introduces un numero fuera de 0 y 6, que retorna true es decir lo acepta, o bien introduces un caracter no numérico, al no estar entre 0 y 6 retorna false, es decir, lo rechazaría.
Pero igual estoy "nublado" como el día. :P
Por ejemplo una salida a lo que propones:
Introduzca un numero entre 0 y 6 : 3 3 es aceptado Introduzca un numero entre 0 y 6 : 6 6 es aceptado Introduzca un numero entre 0 y 6 : 8 8 es rechazado Introduzca un numero entre 0 y 6 : a a es rechazado Introduzca un numero entre 0 y 6 :
con el siguiente código de testeo: #include <stdio.h> #include <stdlib.h> int main(void) { char option; do{ printf("Introduzca un numero entre 0 y 6 :\n"); scanf(" %c",&option); if (option>='0' && option<'7') printf("%c es aceptado\n",option); else printf("%c es rechazado\n",option); }while(1); return EXIT_SUCCESS; }
Saluditos!. ... . (http://st.forocoches.com/foro/images/smilies/aaaaa.gif) [/size]
Título: Re: Como evitar que se introduzcan valores no válidos
Publicado por: Caster en 17 Mayo 2013, 14:19 pm
Yo creo que la solución sería cambiar el tipo de opción, en vez de ponerlo como int, ponlo como char.
Saludos
Título: Re: Como evitar que se introduzcan valores no válidos
Publicado por: leosansan en 17 Mayo 2013, 14:22 pm
Yo creo que la solución sería cambiar el tipo de opción, en vez de ponerlo como int, ponlo como char.
Saludos
En la función que le pase estaba como char.
Ya he reeditado el mensaje y le pongo un código de prueba que usa ese sistema y funciona O.K.
Saluditos!. ....(http://st.forocoches.com/foro/images/smilies/simba1.gif)
Título: Re: Como evitar que se introduzcan valores no válidos
Publicado por: Caster en 17 Mayo 2013, 14:26 pm
En la función que le pase estaba como char.
No me había fijado en eso, el tampoco se debió de fijar y solo copió las condiciones. Tal y como lo pusiste debería de funcionar. Saludos
Título: Re: Como evitar que se introduzcan valores no válidos
Publicado por: leosansan en 17 Mayo 2013, 14:29 pm
No me había fijado en eso, el tampoco se debió de fijar y solo copió las condiciones. Tal y como lo pusiste debería de funcionar.
Saludos
Eso creo yo, por eso le he reeditado el primer mensaje con un zoom.
¡Hasta lueguito¡ .....(http://st.forocoches.com/foro/images/smilies/simba2.gif)
Título: Re: Como evitar que se introduzcan valores no válidos
Publicado por: grodomio en 17 Mayo 2013, 15:00 pm
Perdón por no especificarlo, pero estoy programando en C++ y cout no entiende de formatos, se lo traga todo, no le importa que sea int, char, ...
Voy a probar a ver si cambiando el tipo del parámetro de entrada de entero a char se soluciona.
Ya os comento.
Y gracias a todos.
Título: Re: Como evitar que se introduzcan valores no válidos
Publicado por: grodomio en 17 Mayo 2013, 15:02 pm
Perdón por no especificarlo, pero estoy programando en C++ y cou y cin no entienden de formatos, se lo traga todo, no le importa que sea int, char, ...
Voy a probar lo que dices a ver si cambiando el tipo del parámetro de entrada de entero a char se soluciona.
Ya os comento.
Y gracias a todos
Título: Re: Como evitar que se introduzcan valores no válidos
Publicado por: DarK_FirefoX en 17 Mayo 2013, 15:28 pm
Para mi que lo que el quiere es impedir que le ESCRIBAN como tal en la consola (supongo que sea en la consola) lo que el dice...realmente en la consola no se como evitarlo, si haces una aplicacion windows form puedes usar un MaskTextBox o MaskEdit. Salu2s
Título: Re: Como evitar que se introduzcan valores no válidos
Publicado por: grodomio en 17 Mayo 2013, 15:39 pm
Efectivamente, es en la consola, os comento así por lo alto, se trata de un sistema de ayuda por consola que muestra varios bucles. En el enunciado especifica que la variable privada de la clase sea de tipo entero. He probado a pasar un char en vez de un int, pero sigue tragándose los caracteres no numéricos. Voy a poner el código que llevo hasta ahora, porque ya tengo un cacao que no veas, a ver si vosotros veis el fallo. helpclass.h #ifndef __HELPCLASS_H__ #define __HELPCLASS_H__
class Help { private: int _option; public: Help(); int getoption(); void setoption(int option); void showmenu(); bool helpon(char option); bool isvalid(char option); };
#endif helpclass.cpp #include "helpclass.h" #include <iostream> #include <cstdlib> //Para system() #include <cstdio>
using namespace std;
Help::Help() { setoption(1); }
int Help::getoption() { return _option; }
void Help::setoption(int option) { _option = option; }
void Help::showmenu() { cout << endl << "Sistema de ayuda en modo texto en la consola" << endl << endl; cout << "0.- Se mostrara la ultima ayuda" << endl; cout << "1.- if" << endl; cout << "2.- switch" << endl; cout << "3.- for" << endl; cout << "4.- while" << endl; cout << "5.- do-while" << endl; cout << "6.- Salir del programa" << endl << endl; }
bool Help::helpon(char option) { setoption(option); switch(option) { case '0': option = getoption(); break; case '1': cout << endl << "Bucle if" << endl << endl; cout << " if(condition)" << endl; cout << " {" << endl; cout << " statements;" << endl; cout << " }" << endl << endl << endl; break; case '2': cout << endl << "Bucle switch" << endl << endl; cout << " switch(expression)" << endl; cout << " {" << endl; cout << " case constant-expression:" << endl; cout << " statements;" << endl; cout << " break; //optional" << endl; cout << " case constant-expression:" << endl; cout << " statements;" << endl; cout << " break; //optional" << endl << endl; cout << " // you can have any number of case statements." << endl; cout << " default : //Optional" << endl; cout << " statements;" << endl; cout << " }" << endl << endl; break; case '3': cout << endl << "Bucle for" << endl << endl; cout << " for(init; condition; increment)" << endl; cout << " {" << endl; cout << " statements;" << endl; cout << " }" << endl << endl; break; case '4': cout << endl << "Bucle while" << endl << endl; cout << " while(condition)" << endl; cout << " {" << endl; cout << " statements;" << endl; cout << " }" << endl << endl; break; case '5': cout << endl << "Bucle do-while" << endl << endl; cout << " do" << endl; cout << " {" << endl; cout << " statements;" << endl; cout << " } while(contidion);" << endl << endl; break; default: return false; } return true; } /* bool Help::isvalid(int option) { if(option < 0 || option > 6) { return false; } //No haría falta el else, porque si se cumple bucle if, sale de la funcion //devolviendo false, si no se cumple, no entra y al final devuelve true; return true; }*/ bool Help::isvalid(char option) { if(option >= '0' || option <= '6') { cout << "TRUE" << endl; getchar(); getchar(); return true; } //No haría falta el else, porque si se cumple bucle if, sale de la funcion //devolviendo false, si no se cumple, no entra y al final devuelve true; else { cout << "FALSE" << endl; getchar(); getchar(); return false; } } y el helpmain.cpp #include "helpclass.h" #include <iostream> #include <cstdlib> //Para system() #include <cstdio> //Para getchar();
using namespace std;
int main() { Help h; char option; bool continuar = true; do { system("clear"); option = h.getoption(); cout << option << endl; //borrar h.showmenu(); cout << "Introduce opcion: "; cin >> option; if(h.isvalid(option)) { system("clear"); continuar = h.helpon(option); cout << "Pulsa ENTER para continuar ..."; getchar(); getchar(); } else { cout << "Por favor, introduzca valor valido" << endl; } } while(continuar);
return 0; } Gracias y un saludo.
Título: Re: Como evitar que se introduzcan valores no válidos
Publicado por: leosansan en 18 Mayo 2013, 01:18 am
Sólo se me ha ocurrido un sistema para evitar los caracteres no numéricos, dejando option como int en todo el sistema de archivos. Mezcla funciones usuales en C pero que las comparte el C++ y lo mejor de todo es que el sistema funciona. Por cierto, fíjate que yo uso "cls" para limpiar la pantalla, posiblemente tengas que cambiarlos a clear, están en el primer fichero:helpmain.cpp#include "helpclass.h" #include <iostream> #include <cstdlib> //Para system() #include <cstdio> //Para getchar(); using namespace std; int main() { Help h; char ch; int option,cont; bool continuar = true; do { system("cls"); option = h.getoption(); cout << option << endl; //borrar h.showmenu(); do{ cont=0; cout << "Introduce opcion de 0 a 6: "; cont=scanf("%d",&option); while( (ch = getchar()) != '\n' ); }while(cont==0); if(h.isvalid(option)) { system("cls"); continuar = h.helpon(option); cout << "Pulsa ENTER para continuar ..."; getchar(); getchar(); } else { cout << "Por favor, introduzca valor valido" << endl; } } while(continuar); return 0; }
helpclass.cpp#include "helpclass.h" #include <iostream> #include <cstdlib> //Para system() #include <cstdio> using namespace std; Help::Help() { setoption(1); } int Help::getoption() { return _option; } void Help::setoption(int option) { _option = option; } void Help::showmenu() { cout << endl << "Sistema de ayuda en modo texto en la consola" << endl << endl; cout << "0.- Se mostrara la ultima ayuda" << endl; cout << "1.- if" << endl; cout << "2.- switch" << endl; cout << "3.- for" << endl; cout << "4.- while" << endl; cout << "5.- do-while" << endl; cout << "6.- Salir del programa" << endl << endl; } bool Help::helpon(int option) { setoption(option); switch(option) { case 0: option = getoption(); break; case 1: cout << endl << "Bucle if" << endl << endl; cout << " if(condition)" << endl; cout << " {" << endl; cout << " statements;" << endl; cout << " }" << endl << endl << endl; break; case 2: cout << endl << "Bucle switch" << endl << endl; cout << " switch(expression)" << endl; cout << " {" << endl; cout << " case constant-expression:" << endl; cout << " statements;" << endl; cout << " break; //optional" << endl; cout << " case constant-expression:" << endl; cout << " statements;" << endl; cout << " break; //optional" << endl << endl; cout << " // you can have any number of case statements." << endl; cout << " default : //Optional" << endl; cout << " statements;" << endl; cout << " }" << endl << endl; break; case 3: cout << endl << "Bucle for" << endl << endl; cout << " for(init; condition; increment)" << endl; cout << " {" << endl; cout << " statements;" << endl; cout << " }" << endl << endl; break; case 4: cout << endl << "Bucle while" << endl << endl; cout << " while(condition)" << endl; cout << " {" << endl; cout << " statements;" << endl; cout << " }" << endl << endl; break; case 5: cout << endl << "Bucle do-while" << endl << endl; cout << " do" << endl; cout << " {" << endl; cout << " statements;" << endl; cout << " } while(contidion);" << endl << endl; break; default: return false; } return true; } bool Help::isvalid(int option) { if(option < 0 || option > 6) { return false; } //No haría falta el else, porque si se cumple bucle if, sale de la funcion //devolviendo false, si no se cumple, no entra y al final devuelve true; return true; }
helpclass.h#ifndef __HELPCLASS_H__ #define __HELPCLASS_H__ class Help { private: int _option; public: Help(); int getoption(); void setoption(int option); void showmenu(); bool helpon(int option); bool isvalid(int option); }; #endif
Como ves el cambio es muy sutil en el primer fichero, pero cumple con su cometido. Pruébalo y ya me diras.
Saluditos!. ....(http://st.forocoches.com/foro/images/smilies/simba1.gif)
Título: Re: Como evitar que se introduzcan valores no válidos
Publicado por: grodomio en 21 Mayo 2013, 12:04 pm
Gracias, la verdad es que funciona, se lo he enviado al profesor a ver si acepta funciones de C en estas prácticas de C++.
Gracias a todos.
|