Ejemplo de lenguaje C - Menú de opciones
Si en lenguaje C se quiere escribir un programa que:
1º) Muestre un menú con 4 opciones:
- 1. Calcular el doble de un número entero.
- 2. Calcular la mitad de un número entero.
- 3. Calcular el cuadrado de un número entero.
- 4. Salir.
2º) Pida por teclado la opción deseada (dato entero).
3º) Ejecute la opción del menú seleccionada.
4º) Repita los pasos 1º, 2º y 3º, mientras que, el usuario no seleccione la opción 4 (Salir) del menú.
En pantalla se verá, por ejemplo:
Solución 1: anidando una instrucción switch en un bucle do...while
/* Programa: Tabla de multiplicar de un número (Solución 1) */
#include <math.h>
#include <stdio.h>
int main()
{
int n, opcion;
do
{
printf( "\n 1. Calcular el doble de un n%cmero entero.", 163 );
printf( "\n 2. Calcular la mitad de un n%cmero entero.", 163 );
printf( "\n 3. Calcular el cuadrado de un n%cmero entero.", 163 );
printf( "\n 4. Salir." );
printf( "\n\n Introduzca opci%cn (1-4): ", 162 );
scanf( "%d", &opcion );
/* Inicio del anidamiento */
switch ( opcion )
{
case 1: printf( "\n Introduzca un n%cmero entero: ", 163 );
scanf( "%d", &n );
printf( "\n El doble de %d es %d\n\n", n, n * 2 );
break;
case 2: printf( "\n Introduzca un n%cmero entero: ", 163 );
scanf( "%d", &n );
printf( "\n La mitad de %d es %f\n\n", n, ( float ) n / 2 );
break;
case 3: printf( "\n Introduzca un n%cmero entero: ", 163 );
scanf( "%d", &n );
printf( "\n El cuadrado de %d es %d\n\n", n, ( int ) pow( n, 2 ) );
}
/* Fin del anidamiento */
} while ( opcion != 4 );
return 0;
}
- Véase que, se han realizado dos castings, ( float ) y ( int ), para cambiar, respectivamente, los tipos de datos de los valores resultantes de las expresiones n / 2 y pow( n, 2 ).
- Por otra parte, fíjese que el bucle do...while iterará, mientras que, opcion sea distinto del valor 4. Normalmente, en un menú, la opción de salir (opción 4 en este caso) no se debe contemplar en la alternativa múltiple, es decir, si el usuario introduce un 4, no se debe hacer nada. Pero, ¿qué ocurre si el usuario teclea un número mayor que 4 ó menor que 1? En pantalla se verá algo parecido a:
- Al introducir un número menor que 1 ó mayor que 4, se muestra de nuevo el menú. Para evitar que ocurra esto, es conveniente utilizar un filtro al leer la opción que introduce el usuario.
Solución 2: filtrando la opción introducida por el usuario
/* Programa: Menú de opciones (Solución 2) */
#include <math.h>
#include <stdio.h>
int main()
{
int n, opcion;
do
{
printf( "\n 1. Calcular el doble de un n%cmero entero.", 163 );
printf( "\n 2. Calcular la mitad de un n%cmero entero.", 163 );
printf( "\n 3. Calcular el cuadrado de un n%cmero entero.", 163 );
printf( "\n 4. Salir." );
/* Filtramos la opción elegida por el usuario */
do
{
printf( "\n Introduzca opci%cn (1-4): ", 162 );
scanf( "%d", &opcion );
} while ( opcion < 1 || opcion > 4 );
/* La opción sólo puede ser 1, 2, 3 ó 4 */
switch ( opcion )
{
case 1: printf( "\n Introduzca un n%cmero entero: ", 163 );
scanf( "%d", &n );
printf( "\n El doble de %d es %d\n\n", n, n * 2 );
break;
case 2: printf( "\n Introduzca un n%cmero entero: ", 163 );
scanf( "%d", &n );
printf( "\n La mitad de %d es %f\n\n", n, ( float ) n / 2 );
break;
case 3: printf( "\n Introduzca un n%cmero entero: ", 163 );
scanf( "%d", &n );
printf( "\n El cuadrado de %d es %d\n\n", n, ( int ) pow( n, 2 ) );
}
} while ( opcion != 4 );
return 0;
}
- La variable opcion, también puede ser un dato de tipo carácter, en vez de tipo entero.
Solución 3: declarando la variable opcion de tipo carácter
/* Programa: Menú de opciones (Solución 3) */
#include <math.h>
#include <stdio.h>
int main()
{
char opcion;
int n;
do
{
printf( "\n 1. Calcular el doble de un n%cmero entero.", 163 );
printf( "\n 2. Calcular la mitad de un n%cmero entero.", 163 );
printf( "\n 3. Calcular el cuadrado de un n%cmero entero.", 163 );
printf( "\n 4. Salir." );
do
{
printf( "\n Introduzca opci%cn (1-4): ", 162 );
fflush( stdin );
scanf( "%c", &opcion );
} while ( opcion < '1' || opcion > '4' );
switch ( opcion )
{
case '1': printf( "\n Introduzca un n%cmero entero: ", 163 );
scanf( "%d", &n );
printf( "\n El doble de %d es %d\n\n", n, n * 2 );
break;
case '2': printf( "\n Introduzca un n%cmero entero: ", 163 );
scanf( "%d", &n );
printf( "\n La mitad de %d es %f\n\n", n, ( float ) n / 2 );
break;
case '3': printf( "\n Introduzca un n%cmero entero: ", 163 );
scanf( "%d", &n );
printf( "\n El cuadrado de %d es %d\n\n", n, ( int ) pow( n, 2 ) );
}
} while ( opcion != '4' );
return 0;
}
- Obsérvese que, en esta tercera solución se ha utilizado la función fflush.