elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
29 Agosto 2008, 06:19  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderador: ®®)
| | |-+  Inconveniente con la instrucción switch en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Imprimir
Autor Tema: Inconveniente con la instrucción switch en C++  (Leído 852 veces)
DanielC++

Desconectado Desconectado

Mensajes: 11



Ver Perfil
Inconveniente con la instrucción switch en C++
« en: 12 Junio 2008, 03:55 »

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.-

Código:
#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++ :D     
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 Desconectado

Mensajes: 2.650


The sound of music ñ_ñ


Ver Perfil WWW
Re: Inconveniente con la instrucción switch en C++
« Respuesta #1 en: 12 Junio 2008, 05:53 »

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



Mi blog

15 días que?? :P
YOU will love me ;)
PsyAcCes

Desconectado Desconectado

Mensajes: 8


..:::Psycho:::..


Ver Perfil
Re: Inconveniente con la instrucción switch en C++
« Respuesta #2 en: 12 Junio 2008, 06:27 »

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 Desconectado

Mensajes: 11



Ver Perfil
Re: Inconveniente con la instrucción switch en C++
« Respuesta #3 en: 12 Junio 2008, 15:08 »

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++ :D
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 Desconectado

Mensajes: 96


C0N0C1M13NT0


Ver Perfil
Re: Inconveniente con la instrucción switch en C++
« Respuesta #4 en: 12 Junio 2008, 15:47 »

Ya te lo han explicado anteriormente,

Código:
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 Desconectado

Mensajes: 68



Ver Perfil
Re: Inconveniente con la instrucción switch en C++
« Respuesta #5 en: 12 Junio 2008, 16:05 »

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 Desconectado

Mensajes: 11



Ver Perfil
Re: Inconveniente con la instrucción switch en C++
« Respuesta #6 en: 12 Junio 2008, 16:58 »

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++ :D
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 Desconectado

Mensajes: 2.650


The sound of music ñ_ñ


Ver Perfil WWW
Re: Inconveniente con la instrucción switch en C++
« Respuesta #7 en: 12 Junio 2008, 17:05 »

seria algo asi... incluyendo una bandera de salida del programa

Código
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



Mi blog

15 días que?? :P
YOU will love me ;)
HappyLellow

Desconectado Desconectado

Mensajes: 6



Ver Perfil WWW
Re: Inconveniente con la instrucción switch en C++
« Respuesta #8 en: 12 Junio 2008, 18:45 »

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í:
Código:
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 Desconectado

Mensajes: 11



Ver Perfil
Re: Inconveniente con la instrucción switch en C++
« Respuesta #9 en: 12 Junio 2008, 19:21 »

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++ :D
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 Desconectado

Mensajes: 104



Ver Perfil
Re: Inconveniente con la instrucción switch en C++
« Respuesta #10 en: 12 Junio 2008, 19:25 »

Buenas

1) El do-while hace lo mismo y son menos lineas:
Código:
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

Desconectado Desconectado

Mensajes: 6



Ver Perfil WWW
Re: Inconveniente con la instrucción switch en C++
« Respuesta #11 en: 12 Junio 2008, 22:48 »

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++ :D
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 Desconectado

Mensajes: 11



Ver Perfil
Re: Inconveniente con la instrucción switch en C++
« Respuesta #12 en: 13 Junio 2008, 03:06 »

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.-

Código:
#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++ :D
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 Desconectado

Mensajes: 68



Ver Perfil
Re: Inconveniente con la instrucción switch en C++
« Respuesta #13 en: 13 Junio 2008, 03:48 »

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:
Código:
#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

Desconectado Desconectado

Mensajes: 6



Ver Perfil WWW
Re: Inconveniente con la instrucción switch en C++
« Respuesta #14 en: 13 Junio 2008, 13:00 »

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 ;)


Código:
#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 Ir Arriba Imprimir 
Ir a:  





Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.5 | SMF © 2006-2008, Simple Machines LLC