Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: martin_poipon en 30 Junio 2011, 21:52 pm



Título: Volver al menú principal sin usar goto
Publicado por: martin_poipon en 30 Junio 2011, 21:52 pm
Hola!

Tengo este código:
Código
  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. void pMenu();
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10.    char opcion;
  11.    //Valores bucle FOR
  12.    int vInicial;
  13.    int vFinal;
  14.    int Paso;
  15.    //Valores bucle WHILE
  16.    int Y;
  17.    int Z;
  18.    //Imprimir menú
  19.    pMenu();
  20.    cin >> opcion;
  21.    switch(opcion)
  22.    {
  23.                  case '1':
  24.                       system("CLS");
  25.                       cout << "Valor inicial del bucle:\r\n";
  26.                       cin >> vInicial;
  27.                       system("CLS");
  28.                       cout << "Valor final del bucle:\r\n";
  29.                       cin >> vFinal;
  30.                       system("CLS");
  31.                       cout << "Paso: (suma)\r\n";
  32.                       cin >> Paso;
  33.                       for(int i=vInicial;i<=vFinal;i=i+Paso)
  34.                               {
  35.                                                              cout << i;
  36.                               }
  37.                       break;
  38.                  case '2':
  39.                       system("CLS");
  40.                       cout << "Mientras que Y <= Z (mientras\r\nque Y sea igual o mayor que Z), escribe el valor de Y:";
  41.                       cin >> Y;
  42.                       system("CLS");
  43.                       cout << "Escribe el valor de Z:";
  44.                       cin >> Z;
  45.                       system("CLS");
  46.                       cout << "Paso:";
  47.                       cin >> Paso;
  48.                       system("CLS");
  49.                       while(Y<=Z)
  50.                       {
  51.                                 Y+=Paso;
  52.                       }
  53.                       break;
  54.                  case '3':
  55.                       system("CLS");
  56.                       cout << "system(\"PAUSE\"); funciona así:";
  57.                       system("PAUSE");
  58.                       break;
  59.                  case '4':
  60.                       system("CLS");
  61.                       cout << "system(\"PAUSE>NUL\") funciona así: (presiona\r\n alguna tecla para salir)";
  62.                       system("PAUSE>NUL");
  63.                       break;
  64.  
  65.                  default:
  66.                          cout << "La opción seleccionada no es válida.";
  67.                          system("PAUSE");
  68.                          break;
  69.    }
  70.    return EXIT_SUCCESS;
  71. }
  72.  
  73. void pMenu()
  74. {
  75.    cout << "            BIENVENIDO            \r\n\r\n";
  76.    cout << "Escoge una opción:\r\n";
  77.    cout << "1.- Bucle \"for\" de X a Y\r\n";
  78.    cout << "2.- Bucle \"while\" de X a Y\r\n";
  79.    cout << "3.- system(\"PAUSE\")\r\n";
  80.    cout << "4.- system(\"PAUSE>NUL\")\r\n";
  81. }
  82.  

¿Cómo hago para que, después de hacer todo lo del switch, vuelva a empezar por int main()?

PD: Acepto críticas y sugerencias sobre el código, pues es mi primer código que funciona ;D


Título: Re: Volver al menú principal sin usar goto
Publicado por: madpitbull_99 en 30 Junio 2011, 22:24 pm
Creo que con algo así, serviría:

Código
  1. int main(int argc, char *argv[]) {
  2.  
  3. char continue = 'c';
  4.  
  5.  while(continue == 'c'){
  6.  
  7.      //Aqui van las instrucciones
  8.  
  9.  
  10.       system("pause");
  11.       cout << "Pasa salir pulsa X . Si deseas seguir, pulsa C : ";
  12.       cin >>continue;
  13.       //Si se introduce C, las instrucciones se vuelven a ejecutar
  14.  
  15.  }
  16. }


Si esto es lo que quieres, asegurate de cambiar system("pause") por otra cosa.


Título: Re: Volver al menú principal sin usar goto
Publicado por: Queta en 30 Junio 2011, 22:34 pm
Código
  1. #include <cstdio>
  2.  
  3. int main()
  4. {
  5. printf("Hola!");
  6.  
  7. main();
  8.  
  9. return 0;
  10. }


Título: Re: Volver al menú principal sin usar goto
Publicado por: martin_poipon en 30 Junio 2011, 23:45 pm
Lo siento, pero no funciona el return 0;
Y lo de 'C', no es eso lo que quiero, quiero que, al llegar al break; y salir del switch(), que vaya de nuevo a int main() y que empieza a leer todo de nuevo.

Gracias


Título: Re: Volver al menú principal sin usar goto
Publicado por: Queta en 1 Julio 2011, 00:06 am
Pues quita el return, da igual, pero la solución es ésta...


Título: Re: Volver al menú principal sin usar goto
Publicado por: leogtz en 1 Julio 2011, 00:08 am
Pues quita el return, da igual, pero la solución es ésta...

No es buena costumbre usar recursión con main(), los nuevos estándares no lo

¿por qué no usas un ciclo infinito?


Título: Re: Volver al menú principal sin usar goto
Publicado por: тαптяα en 1 Julio 2011, 09:38 am
return main()


Título: Re: Volver al menú principal sin usar goto
Publicado por: hari en 1 Julio 2011, 13:12 pm
Yo para los menús usaría algo así como un bucle while, en el cuál salga cuando yo quiera con un bool.

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main(){
  6.   bool salir = false;
  7.   char eleccion;
  8.  
  9.   do{ //(While (!salir)
  10.      cout << "Escoja una opción" << endl;
  11.      cin >> eleccion;
  12.      //Aquí irían todas tus opciones con un switch case ó con un if else
  13.      //Te pongo el ejemplo con un if else
  14.      if(eleccion == s)
  15.         salir == true;
  16.      else if(eleccion == p){
  17.         cout << "Has tecleado la letra P" << endl;
  18.         //Aquí podrías poner todo el código que quisieses cuando teclea P, al terminar volverá al menú
  19.         }
  20.   }while(!salir)
  21. }
  22.  
  23.  


Título: Re: Volver al menú principal sin usar goto
Publicado por: тαптяα en 1 Julio 2011, 15:13 pm
¿Has probado return main(); ?


Título: Re: Volver al menú principal sin usar goto
Publicado por: martin_poipon en 1 Julio 2011, 15:55 pm
¿Has probado return main(); ?

No funciona, tira error al intentar compilar.
Lo de quitar el return, tampoco. Lo solucioné con esto:
Código
  1. int main();
  2. Inicio:
  3. ....
  4. ....
  5. goto Inicio;


Título: Re: Volver al menú principal sin usar goto
Publicado por: тαптяα en 1 Julio 2011, 15:55 pm
No funciona, tira error al intentar compilar.
Lo de quitar el return, tampoco. Lo solucioné con esto:
Código
  1. int main();
  2. Inicio:
  3. ....
  4. ....
  5. goto Inicio;
Pues pon el error.. U_U


Título: Re: Volver al menú principal sin usar goto
Publicado por: Acermax en 1 Julio 2011, 15:59 pm
Es que eso de return main() no tiene sentido.

Te dijeron varias veces que lo mejor es un bucle con un while, y no puedes decir que lo solucionaste con un goto, cuando tu pregunta era precisamente hacer eso sin usar goto xD


Título: Re: Volver al menú principal sin usar goto
Publicado por: тαптяα en 1 Julio 2011, 16:12 pm
Es que eso de return main() no tiene sentido.

Te dijeron varias veces que lo mejor es un bucle con un while, y no puedes decir que lo solucionaste con un goto, cuando tu pregunta era precisamente hacer eso sin usar goto xD

Tu si que no tienes sentido:

Código:
#include <stdio.h>

int main(){
char st[20];
printf("Escribe la palabra: ");
scanf("%s",&st);
printf("Has escrito %s \n", st);
return main();

}


Título: Re: Volver al menú principal sin usar goto
Publicado por: Acermax en 1 Julio 2011, 16:16 pm
No voy a entrar a discutir.

Ya dijeron arriba que hacer recursión sobre el main() no es recomendable, además que en un largo uso sobrecarga la memoria...

Por supuesto que sé que eso compila, pero un programa no es perfecto por el mero hecho de compilar.

Un saludo...


Título: Re: Volver al menú principal sin usar goto
Publicado por: тαптяα en 1 Julio 2011, 16:24 pm
No voy a entrar a discutir.

Ya dijeron arriba que hacer recursión sobre el main() no es recomendable, además que en un largo uso sobrecarga la memoria...

Por supuesto que sé que eso compila, pero un programa no es perfecto por el mero hecho de compilar.

Un saludo...
Para ese programa creo qeu es una opción valida.

obviamente también puede usar while, ciclos, pero el user tiene la misma idea de programar C/C++ que de usar un F1, no sabe ni decirme el error que le tira algo que funciona correctamente. No le pidamos peras al olmo.


Título: Re: Volver al menú principal sin usar goto
Publicado por: Valkyr en 1 Julio 2011, 17:27 pm
Si existen sentencias de control como while ¿para que hacer return main();?. Sinceramente creo que es mejor hacer uso de while que, me imagino, será más eficiente. Y por muy chorra que sea el programa si una persona que está "aprendiendo" a programar se le enseña que ,en vez de pensar un poco la lógica que debe seguir un programa, haga uso de go to y cosas similares pues... sinceramente me parece erróneo.

Eso sí, cada cual que haga lo que quiera.

Saludos.


Título: Re: Volver al menú principal sin usar goto
Publicado por: martin_poipon en 1 Julio 2011, 22:18 pm
Para ese programa creo qeu es una opción valida.

obviamente también puede usar while, ciclos, pero el user tiene la misma idea de programar C/C++ que de usar un F1, no sabe ni decirme el error que le tira algo que funciona correctamente. No le pidamos peras al olmo.
:-\ :-\ :-\
Puedo usar while pero no quiero ._. a menos que sea la única opción. He puesto goto para tener una solución temporal. Y sé como dar el error, lo que pasa es que no estaba en el PC cuando respondiste.. SI sé decir el error. Es este:
Marca la llave ({) de inicio de main() y dice: too few arguments to function `int main(int, char**)'


Título: Re: Volver al menú principal sin usar goto
Publicado por: BlackZeroX en 1 Julio 2011, 23:00 pm
.
Si no quieres usar while for ni nada similar usa:

http://codepad.org/rbjReElT

Código
  1.  
  2. #include <setjmp.h>
  3. int main() {
  4.   int _i_jmp;
  5.   jmp_buf _jmpb_buf;
  6.  
  7.   _i_jmp = setjmp( _jmpb_buf );
  8.  // Mas codigo..., si _i_jmp==0 es que setjmp() a fallado....
  9.   longjmp( _jmpb_buf , 1 );
  10.   return 0;
  11. }
  12.  
  13.  

Dulces Lunas!¡.


Título: Re: Volver al menú principal sin usar goto
Publicado por: franeg95 en 3 Julio 2011, 05:53 am
¿Has probado return main(); ?


Ahí tenes un problema. Si el programa genera mucho ciclos te quedas sin stack.

Lo mejor es un while(1) si es para siempre o preguntar.

char seguir;


prinft("desea seguir ?")
seguir=getchar();


Título: Re: Volver al menú principal sin usar goto
Publicado por: leogtz en 3 Julio 2011, 09:02 am
Ahí tenes un problema. Si el programa genera mucho ciclos te quedas sin stack.

Lo mejor es un while(1) si es para siempre o preguntar.

char seguir;


prinft("desea seguir ?")
seguir=getchar();


Sí, parece que nadie vió mi respuesta sobre el ciclo infinito. :/


Título: Re: Volver al menú principal sin usar goto
Publicado por: Foxy Rider en 3 Julio 2011, 11:19 am
@BlackZeroX: Es prácticamente lo mismo que un goto sólo que es (in)portable dentro de plataformas POSIX x'D
@martin_poipon: Ampliando lo que dice franeg95 -> https://duckduckgo.com/Stack_overflow

Saludos.