• Lunes 16 de Diciembre de 2024, 04:45

Autor Tema:  duda con un switch  (Leído 1589 veces)

SkullFlower

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
duda con un switch
« en: Viernes 1 de Octubre de 2010, 03:17 »
0
Hola,

bueno estoy usando un switch pero por ejemplo al poner un numero diferente al 1, 2 o 3 como el 5 u otro numero que no este dentro de las opciones, sale el mensaje ese de "opción no valida" y luego llama a main para que se empiece la ejecución del programa de nuevo para que elija una opción de las que se le muestran pero si ponen varias veces 5 u otro numero y después seleccionan una opción de las que se muestran requiere de que presione varias veces enter para que termine la ejecución del programa  :wacko:

por que pasa eso?
y otra cosa, es correcto eso que estoy haciendo en default? eso de llamar a main xD

Código: C
  1. #include<stdio.h>
  2. int main(){
  3.     int op;
  4.     char buffer[3];
  5.     printf("1. n2. n3. n"
  6.     "Seleccione una opcion: ");
  7.     fgets(buffer, sizeof(buffer), stdin);
  8.     sscanf(buffer, "%d", &op);
  9.     switch(op){
  10.         case 1:
  11.             printf("1n");
  12.             break;
  13.         case 2:
  14.             printf("2n");
  15.             break;
  16.         case 3:
  17.             printf("3n");
  18.             break;
  19.         default:
  20.             printf("Opcion no validan");
  21.             main();
  22.     }
  23.     getchar();
  24.     return 0;
  25. }
  26.  

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: duda con un switch
« Respuesta #1 en: Viernes 1 de Octubre de 2010, 04:09 »
0
Lo que sucede es que cuando llamas a main() dentro de default, estas usando algo que de llama recursion, o sea, que estas llamando una nueva version de main(), entonces cuando termina la ejecucion del main mas interno, regresa al main mas externo, y como dentro de cada main() tienes un getchar(), entonces llamaras a getchar() tantas veces como funciones main() hayas llamado.

Entonces ahi tambien esta la respuesta a tu segunda pregunta tambien, no, no es correcto llamar a main() en default, lo correcto seria que utilizaras un ciclo do..while para hacer la validacion de la opcion del menu y regresar al inicio.

Hay ocasiones en que la recursion si es util para ciertas aplicaciones, pero este no es el caso.

Por ejemplo, un ejemplo de una funcion en que pudiera ser util la recursion es para el calculo del factorial,, es mas, te aconsejo que busques informacion de como se calcula el factorial de manera recursiva, para que te des mejor cuenta del uso de la recursion.

Saludos :)

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

alb

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: duda con un switch
« Respuesta #2 en: Sábado 2 de Octubre de 2010, 09:52 »
0
Holà,
Llamar main en el codigo es algo bastante raro. main no es una funcion como las otras.
A mi me parece que utilizar la recursion en este caso no es muy apropiado porque solo te interesa la primera respuesta valida. Me paracer que usar un do...while es mas apropiado, no ?

SkullFlower

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: duda con un switch
« Respuesta #3 en: Domingo 3 de Octubre de 2010, 00:45 »
0
Bueno ya cambie el codigo:

que les parece?  :o

Código: C
  1. #include<stdio.h>
  2. int main(){
  3.         int op;
  4.         char buffer[5];
  5.         printf("1. n2. n3. n"
  6.         "Seleccione una opcion: ");
  7.         fgets(buffer, sizeof(buffer), stdin);
  8.         sscanf(buffer, "%d", &op);
  9.         while(op>3 || op<1){
  10.                 printf("Opcion invalida, seleccione otra opcion: ");
  11.                 fgets(buffer, sizeof(buffer), stdin);
  12.                 sscanf(buffer, "%d", &op);
  13.         }
  14.         switch(op){
  15.                 case 1:
  16.                         printf("1n");
  17.                         break;
  18.                 case 2:
  19.                         printf("2n");
  20.                         break;
  21.                 case 3:
  22.                         printf("3n");
  23.                         break;
  24.         }
  25.         getchar();
  26.         return 0;
  27. }
  28.