Duda sobre lenguaje C

Hola, tengo una duda (supongo que muy tonta) sobre lenguaje C, resulta que tengo que hacer un programa, que me muestre un menú, y dependiendo de la opción que elija, que me haga una llamada a una función, que ejecute esa funcion y una vez acabe, pulsando cualquier tecla que me vuelva a aparecer el menu. Lo que no sé hacer es esto último, como hacer que después de la función me vuelva al menú, este es el código que he hecho:

#include <stdio.h>

void tabla ()
{
   int numero, i;
   printf("Introduce el numero del que quieres ver su tabla de multiplicar: \n");
   scanf("%d", &numero);
   printf("Tabla de multiplicar del %d\n", numero);
   printf("============================\n");
   for (i=1; i<=10; i++)
      printf("%d * %d = %d\n", numero, i, numero*i);
}

main()
{
   int opcion;
   do
   {
      printf("1.- Tabla de multiplicar\n");
      printf("2.- Mayusculas/Minusculas\n");
      printf("3.- Salir\n");
      
      scanf("%d", &opcion);
   }
   while (opcion<1 || opcion>3);

   switch (opcion){

      case 1: tabla();
            break;
      //case 2: cambio();
              //break;
      //case 3: break;
   }
}


Lo he estado probando sólo para la opcion 1, a ver si alguien puede explicarme como podría hacerlo.

Gracias

P.D: No sabía donde poner el mensaje, si no está bien aquí que algún mod lo mueva o algo ;)
La etiqueta code está para poner código.

Si sólo quieres que se muestre el menú tras terminar:

procedimiento menu
   imprime menú
   recoge opción
   case opción
      valor1 -> acción1
      ...
      valorn -> acciónn
   fin
fin

principio
   MientrasQue cierto
      menu
   finMQ
fin


Claro que eso es bucle infinito. Es una forma, puedes tenerlo todo dentro del main, mover las acciones al main, etc.

Una solución mejor sería añadir una opción para terminar.

función menu
   imprime menú_opción0
   recoge opción
   devuelve opcion
fin

principio
   opción <- menu
   MientrasQue opción distinto de 0
      case opción
         valor1 -> acción1
         ...
         valorn -> acciónn
      fin
      opción <-menu
   finMQ
fin


Aparece el menú, pide una opción, si no es 0, ejecuta la acción y vuelve a mostrar el menú, se repite hasta que se elige la opción 0, se sale del bucle y se termina.
amuchamu escribió:La etiqueta code está para poner código.

Si sólo quieres que se muestre el menú tras terminar:

procedimiento menu
   imprime menú
   recoge opción
   case opción
      valor1 -> acción1
      ...
      valorn -> acciónn
   fin
fin

principio
   MientrasQue cierto
      menu
   finMQ
fin


Claro que eso es bucle infinito. Es una forma, puedes tenerlo todo dentro del main, mover las acciones al main, etc.

Una solución mejor sería añadir una opción para terminar.

función menu
   imprime menú_opción0
   recoge opción
   devuelve opcion
fin

principio
   opcion <- menu
   MientrasQue opcion distinto de 0
      case opción
         valor1 -> acción1
         ...
         valorn -> acciónn
      fin
      menu
   finMQ
fin


Aparece el menú, pide una opción, si no es 0, ejecuta la acción y vuelve a mostrar el menú, se repite hasta que se elige la opción 0, se sale del bucle y se termina.

No sabía lo de la etiqueta code, sorry.

En cuanto a lo que me has explicado, no me he enterado mucho, pero gracias de todas formas ;)
De forma muy simple puedes hacer lo siguiente:

Mete el menú dentro de un bucle WHILE que finalicé unicamente cuando se introduzca el valor asignado para que termine (por ejemplo, si en el menú tienes puesto "introduce 9 para salir" pues dentro del SWITCH del menú haces un CASE (9) y pones la variable que controla el WHILE a falso. De este modo, hasta que el usuario no introduzca el valor preciso para salir, el bucle se repetirá una y otra vez mostrando el menú.

En modo esquema (y suponiendo el 9 para salir):
main(){
    bool condicion=true;
    while(condicion){
        printf("te enseño la linea1 de mi menu\n");
        printf("te enseño la linea2 de mi menu\n");
        //Aquí coges los datos que le pides al usuario

        switch(datoCogido){
            case 0: funcion1(); break;
            case 1: funcion2(); break;
            case 9: condicion=false; break;  //<-- Con este indica al bucle while que finalice
            default: break;
        }
    }
   return 0;
}

krausen escribió:De forma muy simple puedes hacer lo siguiente:

Mete el menú dentro de un bucle WHILE que finalicé unicamente cuando se introduzca el valor asignado para que termine (por ejemplo, si en el menú tienes puesto "introduce 9 para salir" pues dentro del SWITCH del menú haces un CASE (9) y pones la variable que controla el WHILE a falso. De este modo, hasta que el usuario no introduzca el valor preciso para salir, el bucle se repetirá una y otra vez mostrando el menú.

En modo esquema (y suponiendo el 9 para salir):
main(){
    bool condicion=true;
    while(condicion){
        printf("te enseño la linea1 de mi menu\n");
        printf("te enseño la linea2 de mi menu\n");
        //Aquí coges los datos que le pides al usuario

        switch(datoCogido){
            case 0: funcion1(); break;
            case 1: funcion2(); break;
            case 9: condicion=false; break;  //<-- Con este indica al bucle while que finalice
            default: break;
        }
    }
   return 0;
}


Ahora lo he entendido mejor, muchas gracias, mañana me pondre con ello.

Un saludo
En tu código: swicht sin los break dentro del do while, y que se repita siempre que opción no sea 3.

salu2
Barracuda escribió:En tu código: swicht sin los break dentro del do while, y que se repita siempre que opción no sea 3.

salu2

Tambien es buena idea ;) gracias.

Siento molestar de nuevo pero lo he hecho con variable bool y me da error como si no reconociera la varaible bool:

#include <stdio.h>

void tabla ()
{
   int numero, i;
   printf("Introduce el numero del que quieres ver su tabla de multiplicar: \n");
   scanf("%d", &numero);
   printf("Tabla de multiplicar del %d\n", numero);
   printf("============================\n");
   for (i=1; i<=10; i++)
      printf("%d * %d = %d\n", numero, i, numero*i);
}
main()
{
   int opcion;
   bool salir = false;

   do
   {
      printf("1.- Tabla de multiplicar\n");
      printf("2.- Mayusculas/Minusculas\n");
      printf("3.- Salir\n");
      
      scanf("%d", &opcion);
      
      switch (opcion)
      {
         case 1: tabla();
            break;
         case 2: //cambio();
            break;
         case 3: salir=true;
      }
   }
   while (!salir);


}


Y uno de los errores que me da es: error C2065: 'bool' : undeclared identifier
Qué estoy haciendo mal?

Gracias
nebb_5 escribió:Y uno de los errores que me da es: error C2065: 'bool' : undeclared identifier

Es que C puro (ANSI) no tiene el tipo de dato booleano.

Prueba añadiendo un #include <stdbool.h>
nebb_5 escribió:Y uno de los errores que me da es: error C2065: 'bool' : undeclared identifier
Qué estoy haciendo mal?

Gracias


Tan sencillo como usar un entero en vez de un booleano:

int interruptor=X; (X = el número entero que quieras)
while (interruptor==X){
.
.
.
}

En el switch cambias el valor de la variable interruptor y solucionado el problema.


Por cierto, no sabia que el C estricto no tenía booleanos, que curioso :)
ANSi C no tiene, pero C99 si.

salu2
Razorblade escribió:
nebb_5 escribió:Y uno de los errores que me da es: error C2065: 'bool' : undeclared identifier

Es que C puro (ANSI) no tiene el tipo de dato booleano.

Prueba añadiendo un #include <stdbool.h>

Hola! no me funciona con el stdbool, parece que no lo reconoce.

krausen escribió:Tan sencillo como usar un entero en vez de un booleano:
...
Por cierto, no sabia que el C estricto no tenía booleanos, que curioso :)

Sí, finalmente utilizaré una variable int y a correr.

Por cierto, como puedo hacer para que una vez termine la llamada a una función, el programa se quede esperando a que pulse cualquier tecla para continuar? En java creo que utilizaba el .nextLine(), he probado a utilizar scanf() pero me pide que le pase argumentos, entonces entiendo que debería de crear una variable...hay otra forma de hacerlo?

Gracias a todos por contestar ;)
Para lo de la tecla, ¿has probado la función getchar() de stdio.h ?
kachorro escribió:Para lo de la tecla, ¿has probado la función getchar() de stdio.h ?

Hola, he probado así:

main()
{
   int opcion;
   do
   {
      printf("1.- Tabla de multiplicar\n");
      printf("2.- Mayusculas/Minusculas\n");
      printf("3.- Salir\n");
      
      scanf("%d", &opcion);
      
      switch (opcion)
      {
         case 1: tabla();
            break;
         case 2: cambio();
            break;
         case 3: break;
      }
      getchar();
   }
   while (opcion!=3);


}

Pero no me hace nada :-?
No estoy seguro pero esto debería de funcionar:

main()
{
char ch; 
int opcion;
ch=0;
   do
   {
      printf("1.- Tabla de multiplicar\n");
      printf("2.- Mayusculas/Minusculas\n");
      printf("3.- Salir\n");
     
      scanf("%d", &opcion);
     
      switch (opcion)
      {
         case 1: tabla();
            break;
         case 2: cambio();
            break;
         case 3: break;
      }
      while(ch==0)ch=getchar();
      ch=0;
   }
   while (opcion!=3);


}
nebb_5 escribió:Por cierto, como puedo hacer para que una vez termine la llamada a una función, el programa se quede esperando a que pulse cualquier tecla para continuar? En java creo que utilizaba el .nextLine(), he probado a utilizar scanf() pero me pide que le pase argumentos, entonces entiendo que debería de crear una variable...hay otra forma de hacerlo?


Prueba con la función:
    getch();

Esta función pertenece a la libreria conio por lo que antes te tocará hacer un include:

    #include <conio.h>


Si ves que te compila pero que sigue sin pararse cuando sale el texto de "pulsa cualquier tecla" prueba a poner 2 seguidos.


Si no te queda claro el asunto aquí tienes un ejemplo:
http://www.conclase.net/c/Borland/funcion.php?fun=getch
Gracias por contestar, cuando lo pruebe comento.

Muchas gracias
nebb_5 escribió:Gracias por contestar, cuando lo pruebe comento.

Muchas gracias


Pues escribo algo aquí para que no tengas que esperar los 5 días de rigor para poder responder despues de otra respuesta tuya. [toctoc]
Prueba a poner getc(stdin), que está en <stdio.h>.

Otra cosa que puedes hacer es system("PAUSE") de <stdlib.h>, pero hay el problema que solo funciona en Windows.

Por cierto, lo de <conio.h> no lo recomiendo porque no es estándar, y lo de dos veces seguidas... no veo porque tenga que funcionar a la segunda si no lo hace a la primera [+risas]
GameZelda escribió:Prueba a poner getc(stdin), que está en <stdio.h>.

Otra cosa que puedes hacer es system("PAUSE") de <stdlib.h>, pero hay el problema que solo funciona en Windows.

Por cierto, lo de <conio.h> no lo recomiendo porque no es estándar, y lo de dos veces seguidas... no veo porque tenga que funcionar a la segunda si no lo hace a la primera [+risas]

Con el getc(stdin) sí que me funciona, pero he estado haciendo pruebas y no entiendo muy bien, a ver si me puedes explicar ;):

Así funciona perfecto
main()
{
   int opcion;
   do
   {
      printf("\n1.- Tabla de multiplicar\n");
      printf("2.- Mayusculas/Minusculas\n");
      printf("3.- Salir\n");
      
      scanf("%d", &opcion);
      
      switch (opcion)
      {
      case 1: tabla(); getc(stdin);
         break;         
      case 2: cambio(); getc(stdin);
            break;
         case 3: break;
      }
   getc(stdin);
   }
   while (opcion!=3);
}

Pero de estas dos formas, no funciona y no lo entiendo:
main()
{
   int opcion;
   do
   {
      printf("\n1.- Tabla de multiplicar\n");
      printf("2.- Mayusculas/Minusculas\n");
      printf("3.- Salir\n");
      
      scanf("%d", &opcion);
      
      switch (opcion)
      {
      case 1: tabla(); //getc(stdin);
         break;         
      case 2: cambio(); //getc(stdin);
            break;
         case 3: break;
      }
   getc(stdin);
   }
   while (opcion!=3);
}

main()
{
   int opcion;
   do
   {
      printf("\n1.- Tabla de multiplicar\n");
      printf("2.- Mayusculas/Minusculas\n");
      printf("3.- Salir\n");
      
      scanf("%d", &opcion);
      
      switch (opcion)
      {
      case 1: tabla(); getc(stdin);
         break;         
      case 2: cambio(); getc(stdin);
            break;
         case 3: break;
      }
   //getc(stdin);
   }
   while (opcion!=3);
}


Por que entiendo que poniendo el getc(stdin) únicamente después del switch, debería de funcionar, no?

Gracias
GameZelda escribió:Por cierto, lo de <conio.h> no lo recomiendo porque no es estándar, y lo de dos veces seguidas... no veo porque tenga que funcionar a la segunda si no lo hace a la primera [+risas]


Lo del getch() 2 veces () es por lo siguiente:

Imagina que antes del getch() insertas datos y pulsas INTRO manteniendo la tecla durante un poquito más de tiempo de lo habitual. En este caso el INTRO no solo se lo come el scanf (cin en C++) sino también podria pasar que el primer getch() se lo comiera. De ahí lo de poner un segundo.

De todas formas esto me pasaba hace años con versiones (comparadas con las actuales) bastante antiguas del GCC por lo que ignoro si seguirá ocurriendo (no lo he probado con las actuales).

1saludo :)
19 respuestas