25/04/2024
# Tags
#C++ #Programación

Estructura switch en C++

Estructura switch en C++

El uso de interfaces de usuario (incluyendo las más primitivas) generó la necesidad de presentar la información en forma de menús de opciones, de forma que se pudiera seleccionar una opción a partir de un panel de opciones disponibles agrupadas de forma lógica. Por ejemplo, si desarrollamos un programa para conversión de unidades, podríamos estructurarlo por varios criterios, por ejemplo, primero podríamos ofrecer 3 opciones en un «menú» general, a) Sistema internacional, b) Sistema inglés y 3) Salir. Si elegimos la opción a), entonces deberemos poner por ejemplo i) Conversión de unidades de longitud, ii) Conversión de unidades de masa y iii) Regresar a menú principal.

Como puedes intuir, el uso de los «menús» le darán a tu programa coherencia y sobre todo, permitirán dirigir al usuario para interactuar de forma eficiente y práctica con tu programa indicándole el camino que «deben seguir» cuando utilicen el mismo.

La estructura switch

Estructura switch en C++
Estructura switch en C++

La estructura switch nos permite evaluar una condición, la cual puede ser una entrada del usuario o una condición dada por un proceso del programa, y de acuerdo a esta evaluación, se ejecutarán un conjunto de instrucciones.

Sintaxis

La sintaxis de la estructura switch es,

switch (expresión)
   case expresión-constante : sentencia(s)
   [default  : sentencia(s)]

en donde,

  • switch, palabra reservada que indica el inicio de la estructura de control.
  • expresión, valor de tipo entero que determina la comparación que se realizará.
  • case, palabra reservada, crea una etiqueta (la expresión constante) para una opción que se comparará con la expresión que recibe switch, es decir, evalúa un caso
  • : los dos puntos son obligatorios, indica que se pasa el control a la sentencia si la evaluación del case es verdadera.
  • default, palabra reservada que se utiliza para los casos en que ninguna de las sentencias case sean verdaderas, es opcional y puede o no existir dentro del switch.

Ejemplos con switch

El siguiente programa implementa un menú primitivo, para que te familiarices con la construcción de estructuras switch.

// cpp_40_switch01.cpp
// Este programa forma parte del tutorial de introducción al lenguaje C++
// http://a.ehack.info/leguaje-c-introduccion/
// Se ilustra la estructura switch
// 2018, Por http://about.me/carlosgbr
// Versión 1
// Compilado en https://www.onlinegdb.com/online_c++_compiler
#include <iostream>
using namespace std;
int main()
{
    int a, b, total;
    int seleccion;
    cout<<"Bienvenid@, este programa realizará operaciones aritméticas" << endl;
    cout<<"sobre 2 cantidades que escribas" << endl << endl;
    cout<<"Escribe el primer número: ";
    cin>>a;
    cout <<"Escribe el segundo número: ";
    cin>>b;
    cout<<endl<<"Indica el número de la operación que desees realizar: " <<endl;
    cout<<"(1) Suma" << endl;
    cout<<"(2) Resta" << endl;
    cout<<"(3) Producto" << endl;
    cout<<"(4) División Entera" << endl;
    cout<<"(5) Módulo" << endl;
    cin>>seleccion;
    //Para realizar la operación solicitada utilizamos una estructura switch
    //Intencionalmente se ha omitido el uso de break;
    switch (seleccion) {
        case 1: cout << "La suma es: " << a + b << endl;
        case 2: cout << "La resta es: " << a - b << endl;
        case 3: cout << "El producto es: " << a * b << endl;
        case 4: cout << "La división es: " << a / b << endl;
        case 5: cout << "El módulo es: " << a % b << endl;
        default: cout << "Opción no válida" << endl;
    } //Fin de switch
    cout<<"Gracias por utilizar este programa" << endl;
    return 0;
}

Ejecuta varias veces el programa, y selecciona distintas operaciones, notarás que si seleccionas, por ejemplo, la opción «3», el programa realizará también las operaciones «4,» y «5», si eliges la opción «1», realizará todas las operaciones, incluso mostrará la sentencia default, el cual se utiliza para los casos de selecciones no válidas. Naturalmente no es deseable esta situación, si usamos un menú de opciones es para utilizar únicamente la opción que deseamos, no la que deseamos y todas las que siguen. A continuación puedes ver una salida del programa.

Ejemplo de una salida con switch
Ejemplo de una salida con switch

La sentencia break

El comportamiento de switch en el programa anterior deja claro que todas las instrucciones se ejecutarán de forma predeterminada, a partir de la primera comparación verdadera, por lo que debemos contar con un mecanismo que nos permita salir de forma limpia del código que nos interesa una vez que haya concluido.

Para ello C++ dispone de la sentencia break. Si existen bucles o estructuras de control anidadas, break anulará la ejecución del ciclo más interno, devolviendo el control a la siguiente estructura de control más externa, de no existir, devuelve el control al programa principal.

Sintaxis

Para utilizar break la sintaxis es:

break;

en donde,

  • break, si se utiliza en bucles permite terminar la ejecución del mismo, sin importar que haya después del mismo.

Ejemplo 2

De este modo podemos re-arreglar nuestro programa para que una vez realizada la operación deseada, salga de la estructura switch, ignorando los demás casos considerados.

Cambia el código de la estructura switch en el primer programa por el siguiente, ejecútalo y ve la forma de comportarse. Prueba quitando sentencias break para que analices el resultado.

// cpp_41_switch02.cpp
// Este programa forma parte del tutorial de introducción al lenguaje C++
// http://a.ehack.info/leguaje-c-introduccion/
// Se ilustra la estructura switch y el uso de la sentencia break para salir
// 2018, Por http://about.me/carlosgbr
// Versión 1
// Compilado en https://www.onlinegdb.com/online_c++_compiler
#include <iostream>
using namespace std;
int main()
{
    int a, b, total;
    int seleccion;
    cout<<"Bienvenid@, este programa realizará operaciones aritméticas" << endl;
    cout<<"sobre 2 cantidades que escribas" << endl << endl;
    cout<<"Escribe el primer número: ";
    cin>>a;
    cout <<"Escribe el segundo número: ";
    cin>>b;
    cout<<endl<<"Indica el número de la operación que desees realizar: " <<endl;
    cout<<"(1) Suma" << endl;
    cout<<"(2) Resta" << endl;
    cout<<"(3) Producto" << endl;
    cout<<"(4) División Entera" << endl;
    cout<<"(5) Módulo" << endl;
    cin>>seleccion;
    //Para realizar la operación solicitada utilizamos una estructura switch
    //Switch impide que se ejecuten todas las sentencias case;
    switch (seleccion) {
        case 1:
            cout << "La suma es: " << a + b << endl;
            break;
        case 2: {
            cout << "La resta es: " << a - b << endl;
            break;
        }
        case 3: {
            cout << "El producto es: " << a * b << endl;
            break;
        }
        case 4: {
            cout << "La división es: " << a / b << endl;
            break;
        }
        case 5: {
            cout << "El módulo es: " << a % b << endl;
            break;
        }
        default: {
            cout << "Opción no válida" << endl;
            break;
        }
    } //Fin de switch
    cout<<"Gracias por utilizar este programa" << endl;
    return 0;
}

Como puedes comprobar, solo se ejecutará el código correspondiente a la opción elegida, una vez que se ejecuta break, el control del programa sale de la estructura switch.

En el código también puedes observar también:

  • El uso de corchetes es opcional lo puedes omitir (como se ilustra con el case 1:) o los puedes utilizar como en el resto de instrucciones. Desde mi punto de vista es preferible utilizarlos para mejorar la legibilidad del programa, además en caso de usar variables locales, delimita su alcance, esto se verá en el siguiente curso de C++
  • La sentencia default puede prescindir del break, de cualquier forma después de ejecutarse termina el ciclo.

Ejemplo 3

Puedes observar que existe un problema con nuestra estructura switch: no nos permite ejecutar otro cálculo en caso que lo deseemos. Te sugiero que intentes programar esta característica, de modo que el ciclo de control termine cuando el usuario desee y no después de una ejecución como actualmente ocurre.

A continuación te presento una posible solución, además incluye otras características que te sugiero revises.

// cpp_42_switch03.cpp
// Este programa forma parte del tutorial de introducción al lenguaje C++
// http://a.ehack.info/leguaje-c-introduccion/
// Se ilustra la repetición de la estructura switch hasta que el usuario
// teclea un valor predeterminado, así como la comprobación de errores
// 2018, Por http://about.me/carlosgbr
// Versión 1
// Compilado en https://www.onlinegdb.com/online_c++_compiler
#include <iostream>
using namespace std;
int main()
{
    int a, b, total;
    int seleccion;
    bool terminar = false;
    cout<<"Bienvenid@, este programa realizará operaciones aritméticas" << endl;
    cout<<"sobre 2 cantidades que escribas" << endl << endl;
    do  //garantizamos que al menos se ejecute una vez nuestro código
    {
        cout<<endl<<"Indica el número de la operación que desees realizar " <<endl;
        cout<<"Escribe 0 para terminar" << endl;
        cout<<"(1) Suma" << endl;
        cout<<"(2) Resta" << endl;
        cout<<"(3) Producto" << endl;
        cout<<"(4) División Entera" << endl;
        cout<<"(5) Módulo" << endl;
        cout<<"(0) Salir" << endl;
        cin>>seleccion;
        //Para realizar la operación solicitada utilizamos una estructura switch
        //Switch impide que se ejecuten todas las sentencias case;
        switch (seleccion) {
            case 1:
                cout<<"Escribe el primer número: ";
                cin>>a;
                cout <<"Escribe el segundo número: ";
                cin>>b;
                cout << "La suma es: " << a + b << endl;
                break;
            case 2: {
                cout<<"Escribe el primer número: ";
                cin>>a;
                cout <<"Escribe el segundo número: ";
                cin>>b;
                cout << "La resta es: " << a - b << endl;
                break;
            }
            case 3: {
                cout<<"Escribe el primer número: ";
                cin>>a;
                cout <<"Escribe el segundo número: ";
                cin>>b;
                cout << "El producto es: " << a * b << endl;
                break;
            }
            case 4: {
                bool valido = false;
                cout<<"Escribe el primer número: ";
                cin>>a;
                //Introducimos la comprobación de errores
                //Evitamos errores por división entre 0
                do
                {
                    cout <<"Escribe el segundo número: ";
                    cin>>b;
                    if (b == 0)
                    {
                        cout << "No puedes dividor entre 0, elige otro número" << endl;
                        valido = false;
                    }
                    else {
                        valido = true;
                    } //if
                } //while
                while (not valido);
                cout << "La división es: " << a / b << endl;
            }
            case 5: {
                cout<<"Escribe el primer número: ";
                cin>>a;
                cout <<"Escribe el segundo número: ";
                cin>>b;
                cout << "El módulo es: " << a % b << endl;
                break;
            }
            case 0: {
                terminar = true;
                break;
            }
            default: {
                cout << "Opción no válida, vuelve a intentarlo" << endl;
                break;
            }
        } //Fin de switch
    } //fin de do
    while (not terminar); //Repite el ciclo hasta presionar 0
    cout<<"Gracias por utilizar este programa" << endl;
    return 0;
}

 
El programa anterior amplía el programa original con las siguientes características:

  • Añade un bucle do-while para que el cálculo se realice de forma indefinida hasta que el usuario escribe «0» (prueba programarlo utilizando un ciclo while, en lugar de do/while)
  • Añade una comprobación en la sección de la división, para evitar dividir entre 0 y el programa termine de forma anormal por esta razón.
  • Se introduce el «0» como condición para terminar el bucle while, por tanto el programa, puedes observar que el control se realiza con una variable que al volverse verdadera, termina el ciclo. Podría utilizarse un «break» para terminar el bucle, pero no es una solución elegante ni óptima. Pero vale la pena que lo intentes, cambia el código para que utilice una sentencia break; para que termine el ciclo.

Conclusión

Hemos revisado la estructura switch que te permite ejecutar sentencias de acuerdo a una expresión (de valor entero), pero recuerda, esta estructura podría sustituirse por estructuras if/else, aunque no es una solución eficiente, hay que señalarlo. Puedes intentar reemplazar switch por if/else, es un buen ejercicio.

Se pueden programar muchas tareas con switch, pero finalmente todo se reduce a un conjunto de opciones para un valor dado, ya sea una entrada del usuario o bien, un valor devuelto por un programa o rutina.


eHack Logo

Referencias

Fuente Imágenes

  • «Todas las demás imágenes de esta sección»: by Nala Systems

Código Fuente

Licencia de Creative Commons
Estructura switch en C++ by  Roberto C. González is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.
Estructura switch en C++

Ciclo For en C++

Estructura switch en C++

Tipo de dato básicos en C++

Leave a comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *