Páginas: [1] 2
|
 |
|
Autor
|
Tema: Inconveniente con la instrucción switch en C++ (Leído 852 veces)
|
DanielC++
Desconectado
Mensajes: 11
|
Hola a todos Como verán estoy continuamente haciendo post, lo que pasa es que hay cosas que por mas que leo tutorías y recorro los foros no logro solucionar.- El caso es que en el siguiente programa si ingreso un entero para la opción va todo muy bien, pero si ingreso una letra el programa no funciona mas, e intentado con el tipo string pero me ocurre lo mismo, se los presento para que me den una mano.- #include <cstdlib> #include <iostream> #include <iomanip> #include <windows.h> #include <string>
void noDesarrollado(std::string, int); void dibujo();
int main(int argc, char *argv[]) { SetConsoleTitle(" Clientes "); using namespace std; int opcion = 0; while(1) { dibujo(); cout << " Que deseas hacer..?\n"; cout << " \n [1]-alta\n"; cout << " [2]-Baja\n"; cout << " [3]-Modificaci\xa2n\n"; cout << " [4]-B\xa3squeda\n"; cout << " [5]-Listado\n"; cout << " [6]-Salir\n"; cout << " \n Seleccione: "; cin >> opcion; switch(opcion) { case 1: noDesarrollado("Ok", opcion); break; case 2: noDesarrollado("Ok", opcion); break; case 3: noDesarrollado("Ok", opcion); break; case 4: noDesarrollado("Ok", opcion); break; case 5: noDesarrollado("Ok", opcion); break; case 6: exit(0); default: noDesarrollado("No", opcion); }
}
system("PAUSE>nul"); return EXIT_SUCCESS; }
void noDesarrollado(std::string cual, int opcion) { if(cual == "Ok") { std::cout << " No desarrollado... \n Apriete cualquier tecla para continuar..."; } else { std::cout << " La opci\xA2n " << opcion << " No existe... \n Apriete cualquier tecla para continuar..."; } system("PAUSE>nul"); system("CLS"); void dibujo(); }
void dibujo() { using namespace std; cout << "" << endl; cout << setw(45) << setfill('-') << " Clientes "; cout << setw(34) << setfill('-') << " " << endl << endl; cout << setw(63) << setfill('-') << " Alta - Baja - Modificaci\xa2n - B\xa3squeda - Listado "; cout << setw(16) << setfill('-') << " " << endl << endl; } Desde ya muchas gracias.- Un gran abrazo El autodidacta Daniel C++
|
|
|
|
|
En línea
|
Abraza las cosas y personas malas como si fueran tu mas preciada joya.- Son tus mas grandes maestros de paciencia sabiduría y amor y cuando los abrazas... dejan de causar dolor.-
|
|
|
Nakp
Desconectado
Mensajes: 2.650
The sound of music ñ_ñ
|
naturalmente... si ingresas A por ejemplo... el valor entero es 65 y no es una opción, obviamente no funcionaria
si quieres usar letras, empieza definiendo opcion como char, después cambiando case 1 por case 'letra' y asi...
salu2
|
|
|
|
|
En línea
|
|
|
|
PsyAcCes
Desconectado
Mensajes: 8
..:::Psycho:::..
|
tmbn cuando declares char tus variables, como lo dijo el q posteo anterirormente... puedes poner un fflush(stdin); entre cada vuelta, para q si estas intercalando infirmacion entre enteros y char...esta t limpia lo q has ingresado en el tclado y t evita pedos... esta en la libreria stdlib.h
suerte
|
|
|
|
|
En línea
|
OnE_NaTiOn_UnDeR_TrAnCe
|
|
|
DanielC++
Desconectado
Mensajes: 11
|
Hola Nakp No me supe explicar lo suficiente, no es que quiera ingresar letras en las opciones (cout << " [al]-Alta\n";cout << " [ba]-Baja\n"  lo quiero hacer con enteros, pero lo que deseo solucionar es que pasa si el operario ingresa un dígito que no sea un número(a,b,w#,ñ,+)...? PsyAcCes, muchas gracias por tú respuesta (voy a tratar de hace una función con "fflush(stdin);" para ver si me funciona).- Un gran saludo El autodidacta Daniel C++
|
|
|
|
|
En línea
|
Abraza las cosas y personas malas como si fueran tu mas preciada joya.- Son tus mas grandes maestros de paciencia sabiduría y amor y cuando los abrazas... dejan de causar dolor.-
|
|
|
HJZR4
Desconectado
Mensajes: 96
C0N0C1M13NT0
|
Ya te lo han explicado anteriormente, char caracter;
/* TATATATATARAara ... */ switch(caracter) { case 'a': /* Bdslakfasdlkasd */ case 'b': /* asdaefeff 4etw4tw*/ }
|
|
|
|
|
En línea
|
Para aprender solo hay una solución: LeeR y Preguntar
|
|
|
43H4FH44H45H4CH49H56H45H
Desconectado
Mensajes: 68
|
no es que quiera ingresar letras en las opciones (cout << " [al]-Alta\n";cout << " [ba]-Baja\n"  lo quiero hacer con enteros, pero lo que deseo solucionar es que pasa si el operario ingresa un dígito que no sea un número(a,b,w#,ñ,+)...? En la libreria ctype existen macros como "isdigit" que sirven para tu objetivo.
|
|
|
|
« Última modificación: 12 Junio 2008, 16:07 por 43H4FH44H45H4CH49H56H45H »
|
En línea
|
 -R IP :0100 -A 100 2826:0100 MOV AH,09 2826:0102 MOV DX,109 2826:0105 INT 21 2826:0105 MOV AH,08 2826:0105 INT 21 2826:0107 INT 20 2826:0109 DB 'MI NICK ES CODELIVE.$' 2826:0127 -R BX :0000 -R CX :20 -N CODELIVE.COM -W
|
|
|
DanielC++
Desconectado
Mensajes: 11
|
Hola 43H4FH44H45H4CH49H56H45H De acuerdo lo de "isdigit" lo había leído solo que como soy muy novato en C++ y autodidacta, por hay se les escapada un pequeño ejemplo, porque no es solo la comprobación de lo ingresado sino como limpio la variable.- Muchas gracias por el tiempo empleado.- El autodidacta Daniel C++ 
|
|
|
|
|
En línea
|
Abraza las cosas y personas malas como si fueran tu mas preciada joya.- Son tus mas grandes maestros de paciencia sabiduría y amor y cuando los abrazas... dejan de causar dolor.-
|
|
|
Nakp
Desconectado
Mensajes: 2.650
The sound of music ñ_ñ
|
seria algo asi... incluyendo una bandera de salida del programa do{ if(isdigit(opcion)){ //si es un numero hace la operacion.. si no lo es pregunta si deseo salir o volver a pedir un numero :P metes el switch } printf("salir? 1/0: ") s=gechar(); } while(s!=1) return EXIT_SUCCESS;
|
|
|
|
|
En línea
|
|
|
|
|
HappyLellow
|
Buenas, En mi opinión puedes utilizar la opción de lectura adelantada que quizá queda más "elegante" y además te ahorras que una entrada inesperada provoque la salida del programa si no es lo que busca el usuario. La lectura adelantada funciona cuando tú pides una primera vez la opción por teclado y mientras no sea un dígito sigues mostrando el menú y leyendo la entrada. Obviamente si modularizas también el menú y la lectura mucho mejor. En pseudocódigo es algo así: MostrarMenú Leer(respuesta)
Mientras (respuesta = incorrecta) { MostrarMenú Leer(respuesta) } Creo que más o menos es la idea que tenías para hacer pero si te fijas al introducir el switch dentro del while "infinito" no te aseguras que a este llegue una entrada correcta. Un saludo.
|
|
|
|
« Última modificación: 12 Junio 2008, 18:52 por HappyLellow »
|
En línea
|
Whatever stops you from dreamin' Whatever trys to stop you from livin' Flip it
|
|
|
DanielC++
Desconectado
Mensajes: 11
|
Hola HappyLellow Lo tuyo me parece muy interesante pero no estoy seguro de poder implementarlo ya que hace tan solo un par de meses que me inicie con C++ y como lo dije anteriormente soy autodidacta.- Que significa "modularizas..." en programación o en C++, tal vez me esté perdiendo algo importante dado que no logro descifrar que es "hacer un modulo".- Muchas gracias por tú tiempo El autodidacta Daniel C++ 
|
|
|
|
|
En línea
|
Abraza las cosas y personas malas como si fueran tu mas preciada joya.- Son tus mas grandes maestros de paciencia sabiduría y amor y cuando los abrazas... dejan de causar dolor.-
|
|
|
ҒrεακΠιи∂
Desconectado
Mensajes: 104
|
Buenas 1) El do-while hace lo mismo y son menos lineas: do{ MostrarMenu() Leer(respuesta); }while(respuesta = incorrecta); 2) El system("PAUSE>nul"); return EXIT_SUCCESS; fuera de un while(1) es innecesario ya que nunca vas a salir del while. Saludos, FreakMind
|
|
|
|
|
En línea
|
Connoisseurs of C semantics find C++ inferior to ++C 
|
|
|
|
HappyLellow
|
Hola HappyLellow Lo tuyo me parece muy interesante pero no estoy seguro de poder implementarlo ya que hace tan solo un par de meses que me inicie con C++ y como lo dije anteriormente soy autodidacta.- Que significa "modularizas..." en programación o en C++, tal vez me esté perdiendo algo importante dado que no logro descifrar que es "hacer un modulo".- Muchas gracias por tú tiempo El autodidacta Daniel C++  Hola! Lo primero que te quería comentar es que ҒrεακΠιи∂ tiene razón en lo que te ha dicho del bucle Do While pero a mí en su día me aconsejaron utilizarlo con pies de plomo sobretodo ahora que estás aprendiendo y puedes cometer errores de bulto sin darte cuenta. Ten en cuenta que ese bucle se va a ejecutar siempre al menos una vez... y eso según cuándo puede tener más inconvenientes que ventajas. De todas formas, como ya te digo, en este caso particular te sirve. Sobre la programación modular te aconsejo que aprendas y la utilices con la mayor soltura posible porque te va a dar un millón de ventajas. Básicamente consiste en dividir tu programa en partes lo más pequeñas, independientes y estancas posibles. ¿Qué consigues así?: 1. Legibilidad y sencillez. ¿Te imaginas un programita de 500 líneas todo en el main? La idea es que tarde o temprano tus programas crezcan en tamaño y dificultad y es imposible que no te vuelvas loco si no estructuras. 2. Portabilidad. El módulo de Mostrar, por ejemplo, ahora lo puedes utilizar en cualquier parte simplemente con llamarlo: en ese mismo programa, en otros si lo incluyes en una libreria, etc. 3. Seguridad. Tu programa se vuelve más estable si haces esas partes o módulos estancas y controlas dentro de ellas los errores. Cada módulo se encarga sólo de una tarea y es el main o programa principal quien va encauzando qué se ejecuta cuándo. Como comentario extra a la seguridad al modular y en las variables en general acostumbrarte a utilizar bien los entornos, me refiero a la declaración que haces de noDesarrollado y dibujo... si sólo se llaman desde ese main es mejor que no sean globales  . Si lees un poquito sobre el tema verás que hay dos tipos de módulo: los procedimientos y las funciones. Práctica que es sobretodo un tema de algorítmica o de "aprender a pensar" y ya verás cuantas puertas te abre  . Cualquier duda que tengas ya sabes, saludos!
|
|
|
|
|
En línea
|
Whatever stops you from dreamin' Whatever trys to stop you from livin' Flip it
|
|
|
DanielC++
Desconectado
Mensajes: 11
|
Hola HappyLellow Muchas gracias lo posteado me aclara muchas cosas, te dejo mi código que según mi practica tiene un solo error que ya sobre solucionar, es para que me digas en que puedo mejorarlo y me des un pequeño ej. como hacerlo con Do While ya que no me sale.- #include <iostream> #include <windows.h> #include <iomanip> #include <cstdlib>
void noDesarrollado() { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); std::cout << " No desarrollado" << std::endl; std::cout << " Apriete cualquier tecla para continuar..."; system("PAUSE>nul"); system("cls"); }
void ingInvalido() { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); std::cout << " Ingreso incorrecto" << std::endl; std::cout << " Apriete cualquier tecla para continuar..."; system("PAUSE>nul"); system("cls"); }
void dibujo() { std::cout << "" << std::endl; std::cout.width(40); std::cout << " Clientes " << std::endl << std::endl; std::cout << " Alta - Baja - Modificaci\xa2n - B\xa3squeda - Listado" << std::endl << std::endl; }
int main(int argc, char *argv[]) { SetConsoleTitle(" Clientes "); using namespace std; int opcion = 0; while(1) { dibujo(); cout << " Que deseas hacer..?\n"; cout << " \n [1]-alta\n"; cout << " [2]-Baja\n"; cout << " [3]-Modificaci\xa2n\n"; cout << " [4]-B\xa3squeda\n"; cout << " [5]-Listado\n"; cout << " [6]-Salir\n"; cout << " \n Seleccione: "; cin >> opcion; switch(opcion) { case 1: noDesarrollado(); break; case 2: noDesarrollado(); break; case 3: noDesarrollado(); break; case 4: noDesarrollado(); break; case 5: noDesarrollado(); break; case 6: exit(0); default: ingInvalido(); } } return EXIT_SUCCESS; } Un gran saludo El autodidacta Daniel C++ 
|
|
|
|
|
En línea
|
Abraza las cosas y personas malas como si fueran tu mas preciada joya.- Son tus mas grandes maestros de paciencia sabiduría y amor y cuando los abrazas... dejan de causar dolor.-
|
|
|
43H4FH44H45H4CH49H56H45H
Desconectado
Mensajes: 68
|
Hola 43H4FH44H45H4CH49H56H45H De acuerdo lo de "isdigit" lo había leído solo que como soy muy novato en C++ y autodidacta, por hay se les escapada un pequeño ejemplo, porque no es solo la comprobación de lo ingresado sino como limpio la variable.-
Bueno de pasadita: #include <cstdlib> #include <iostream> #include <ctype.h> #include <string.h>
using namespace std;
int main() { char yo[1]; int tu; do{ system("cls"); cout<<"******MENU******"<<endl<<endl; cout<<"1.- Ver Numero 1"<<endl<<endl; cout<<"2.- Ver Numero 2"<<endl<<endl;
cout<<"Introduce Opcion: "<<endl; cin>>yo; tu=strlen(yo); }while(tu>1||isdigit(yo[0])==0); switch(atoi(yo)) { case 1: cout<<"El numero es uno"<<endl; break; case 2: cout<<"El numero es dos"<<endl; break; default: cout<<"Fuera de rango ninguno"<<endl; break; } system("PAUSE"); return 0; }
Se puede mejorar de muchas formas(te lo dejo a voz), espero te sirva.
|
|
|
|
|
En línea
|
 -R IP :0100 -A 100 2826:0100 MOV AH,09 2826:0102 MOV DX,109 2826:0105 INT 21 2826:0105 MOV AH,08 2826:0105 INT 21 2826:0107 INT 20 2826:0109 DB 'MI NICK ES CODELIVE.$' 2826:0127 -R BX :0000 -R CX :20 -N CODELIVE.COM -W
|
|
|
|
HappyLellow
|
Hola HappyLellow Muchas gracias lo posteado me aclara muchas cosas, te dejo mi código que según mi practica tiene un solo error que ya sobre solucionar, es para que me digas en que puedo mejorarlo y me des un pequeño ej. como hacerlo con Do While ya que no me sale.- Hola! Te dejo tu código revisado de todas formas quiero que tengas una cosa en cuenta y es que la programación es algo creativo por lo que puede haber muchas soluciones para un mismo problema que son perfectamente válidas. También es un tema personal donde las manías o los gustos personales influyen mucho -y son casi imposibles de quitar xD- así que aunque alguien te corrija o te oriente mantén tu estilo y tu forma de hacer las cosas  #include <iostream> #include <windows.h> #include <iomanip> #include <cstdlib>
/* 1. Yo siempre hago la definición de los subprogramas después del main así cuando los veas ya vas con un contexto de lo que van a hacer. 2. Veo que has tenido en cuenta el entorno en la declaración, muy bien */
int main(int argc, char *argv[]) { SetConsoleTitle(" Clientes "); using namespace std; char opcion;
/* 3. Funcionamiento del Do While: como te comenté tienes que asignar valor por primera vez al dato -en este caso a la opción que el usuario te marca- porque a diferencia del búcle While que siempre se ejecutará una vez en este puede que no llegues a entrar. */
dibujo(); MenuOpciones(); cin >> opcion;
/* 4. Te he modificado el tipo de la variable opción porque me parece mejor que almacenes un caracter y compruebes, a través de su valor ASCII si está entre el 1 y el 6 que son tus entradas válidas .*/
while(/* 5. Lo bueno de modular empieza por ejemplo aquí... ¿por qué no crear una función que reciba tres parámetros: uno un valor de entrada y otros dos los límites de un rango y retorne un boolean que te diga si está entre ellos? Es simplemente un ejemplo y podrías usarlo aquí para evaluar si la opción introducida te vale. Si lo haces así ten ojo con los casting entre tipos de datos ;) */) { /* 6. Fíjate que también modulo el menú y así consigo no duplicar código dentro del búcle. 7. Si aprendes a pensar... fíjate, ¿cuándo entrarías aquí? Cuando te han dado una entrada erronea así que sería el momento de advertir de ello al usuario y sobraría por tanto el case 6 del switch */ MenuOpciones(); cin >> opcion; }
/* 7. Modulo la evaluación de la entrada, una vez que sé que ha sido correcta. */ EvaluarOpcion(opcion); return EXIT_SUCCESS; }
void MenuOpciones() { cout << " Que deseas hacer..?\n"; cout << " \n [1]-alta\n"; cout << " [2]-Baja\n"; cout << " [3]-Modificaci\xa2n\n"; cout << " [4]-B\xa3squeda\n"; cout << " [5]-Listado\n"; cout << " [6]-Salir\n"; cout << " \n Seleccione: "; }
void EvaluarOpcion(char opcion) { switch(opcion) { case 1: noDesarrollado(); break; case 2: noDesarrollado(); break; case 3: noDesarrollado(); break; case 4: noDesarrollado(); break; case 5: noDesarrollado(); break; }
}
void noDesarrollado() { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); std::cout << " No desarrollado" << std::endl; std::cout << " Apriete cualquier tecla para continuar..."; system("PAUSE>nul"); system("cls"); }
void ingInvalido() /* 8. Como te he comentado más arriba podrías prescindir de esto */ { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); std::cout << " Ingreso incorrecto" << std::endl; std::cout << " Apriete cualquier tecla para continuar..."; system("PAUSE>nul"); system("cls"); }
void dibujo() { std::cout << "" << std::endl; std::cout.width(40); std::cout << " Clientes " << std::endl << std::endl; std::cout << " Alta - Baja - Modificaci\xa2n - B\xa3squeda - Listado" << std::endl << std::endl; } Espero haberte ayudado, saludos!
|
|
|
|
« Última modificación: 13 Junio 2008, 13:03 por HappyLellow »
|
En línea
|
Whatever stops you from dreamin' Whatever trys to stop you from livin' Flip it
|
|
|
|
Páginas: [1] 2
|
|
|
|