• Sábado 20 de Abril de 2024, 01:27

Autor Tema:  Switch case que muestra 2 veces seguidas el menu  (Leído 1944 veces)

sc0tt

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Switch case que muestra 2 veces seguidas el menu
« en: Viernes 29 de Abril de 2011, 19:43 »
0
Hola amigos de este foro tan completo:
Estoy haciendo un programa para la facultad (estoy en primer curso de Ingenieria Informatica) y se me plantea este problema en todos los switch case que hago, y es que cuando elijo una opción del menú este me aparece 2 veces en lugar de solo una. No he sido capaz de identificar donde está el error, a ver si alguien es capaz. Aquí os dejo un ejemplo del código fuente que utilizo en un programa:

int main (int argc, const char * argv[])
{
    char menu[] = "n A)Nuevo altan B)Bajan C)Modificaciónn D)Búsqueda por autorn E)Búsqueda por editorialn F)Búsqueda por títulon G)Búsqueda por fechann";
    char opcion;
    struct ficha BIBLIOTECA [LIBROS]={0,0,0,0};
   
   
    do {
      printf("%s",menu);
      scanf("%c",&opcion);
      switch (opcion) {
         case 'A':
                        una_funcion_cualquiera(argumentos);
                        break;
                        case 'B':
                        otra_funcion o código
                        break;
                        case 'Q':
            printf("nnSaliendo.nn");
            break;
}
   } while ('Q' != opcion);
   printf("nnTerminación normal del programa.nn");

   
    return 0;
}

herzdark

  • Miembro activo
  • **
  • Mensajes: 38
  • Nacionalidad: ar
    • Ver Perfil
Re: Switch case que muestra 2 veces seguidas el menu
« Respuesta #1 en: Sábado 30 de Abril de 2011, 00:03 »
0
Cita de: "sc0tt"
Hola amigos de este foro tan completo:
Estoy haciendo un programa para la facultad (estoy en primer curso de Ingenieria Informatica) y se me plantea este problema en todos los switch case que hago, y es que cuando elijo una opción del menú este me aparece 2 veces en lugar de solo una. No he sido capaz de identificar donde está el error, a ver si alguien es capaz. Aquí os dejo un ejemplo del código fuente que utilizo en un programa:

int main (int argc, const char * argv[])
{
    char menu[] = "n A)Nuevo altan B)Bajan C)Modificaciónn D)Búsqueda por autorn E)Búsqueda por editorialn F)Búsqueda por títulon G)Búsqueda por fechann";
    char opcion;
    struct ficha BIBLIOTECA [LIBROS]={0,0,0,0};
   
   
    do {
      printf("%s",menu);
      scanf("%c",&opcion);
      switch (opcion) {
         case 'A':
                        una_funcion_cualquiera(argumentos);
                        break;
                        case 'B':
                        otra_funcion o código
                        break;
                        case 'Q':
            printf("nnSaliendo.nn");
            break;
}
   } while ('Q' != opcion);
   printf("nnTerminación normal del programa.nn");

   
    return 0;
}

yo n veo ningun drama en el codigo, el menu te aparece despues d q se ejecuto la funcion no?

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Switch case que muestra 2 veces seguidas el menu
« Respuesta #2 en: Sábado 30 de Abril de 2011, 04:06 »
0
El problema esta en la funcion scanf() y la manera en que se maneja el buffer de la entrada estandar.

La funcion scanf() te leera de la entrada estandar hasta que pulses la tecla de "enter", pero la tecla de "enter" cuenta tambien como caracter, y se queda en el buffer, ya que scanf("%c",&opcion); solo lee un caracter, pero en realidad estas capturando 2, la letra y el "enter" que das, es por eso que la siguiente vez que lee del teclado, encuentra en el buffer el "enter", y lo lee de nuevo, por eso aparece dos veces el menu.

Lo que tu quieres seguramente es que inmediatamente que pulses una tecla, seleccione una opcion, y desafortunadamnte no hay una manera estandar y portable de hacerlo, esto depende del compilador y de la plataforma que utilices. Existia (o existe) una biblioteca en los compildores borland llamada getch(), que estaba en la libreria conio.h, que hacia exactamente eso, pero como dije antes, solo funcionaba en los compiladores borland y no es portable.

Lo mejor que podrias hacer es limpiar el buffer de entrada despues de leer con getchar(), aunque esto no es perfecto, ya que hay algunos casos en que esto no funciona adecuadamente (creeme, lo he probado varias veces), pero bueno, ya que seguramente tu programa es sencillo, no creo que te muchos porblemas.

Te dejo el ejemplo:

Código: C++
  1.  
  2. #include <cstdio>
  3. #include <cstring>
  4.  
  5. int main (int argc, const char * argv[])
  6. {
  7.     char menu[] = "n A)Nuevo altan B)Bajan C)Modificaciónn D)Búsqueda por autorn E)Búsqueda por editorialn F)Búsqueda por títulon G)Búsqueda por fechann";
  8.     char opcion;
  9.  
  10.     do {
  11.         printf("%s",menu);
  12.         scanf ("%c", &opcion);
  13.         // Limpia el buffer de entrada despues de leer
  14.         while (getchar() != 'n');
  15.         switch (opcion)
  16.         {
  17.         case 'A':
  18.             printf("Opcion1n");
  19.             break;
  20.         case 'B':
  21.             printf("Opcion2n");
  22.             break;
  23.         case 'Q':
  24.             printf("nnSaliendo.nn");
  25.             break;
  26.         }
  27.     } while (opcion != 'Q');
  28.     printf("nnTerminación normal del programa.");
  29.  
  30.     return 0;
  31. }
  32.  
  33.  

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

sc0tt

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Switch case que muestra 2 veces seguidas el menu
« Respuesta #3 en: Lunes 2 de Mayo de 2011, 23:09 »
0
Buenas,
Perdón por haber tardado tanto en responder. Hemos estado liados con examenes parciales de cálculo y no he tenido tiempo.
He probado la condición del while que me has comentado y te digo lo que he puesto y que me sucede:
Código: C
  1.  
  2.  

do {
      printf("%s",menu);
      opcion=toupper(getchar());
                while (getchar() != 'n');
        switch (opcion) {
         case 'A':
                nueva_alta(BIBLIOTECA);
                break;
Resulta que al principio entra bien cuando marco la opción A, por ejemplo. Pero luego cuando vuelvo al menú y escojo otra opción, (la D por ejemplo) me vuelve a salir el menu y tengo que volver a pulsar la D para que me la coja y entre en la opcion D.
Salu2
PD: Como ves, he cambiado también el scanf ("%c",&opcion) por el toupper getchar para que me pase a mayúsculas la letra introducida.[code=c]