57 - Estructura condicional switch


Hasta ahora siempre que se presentan bifurcaciones en un programa lo resolvemos con una estructura condicional if, también vimos en un concepto anterior el operador condicional ?:

Ahora veremos que en el lenguaje C existe una estructura condicional que nos permite seleccionar un camino de un conjunto de caminos dependiendo de una condición.

La estructura switch remplaza en muchas situaciones, si bien no en todas, a un conjunto de if.

Veremos varios ejemplos y la sintaxis propuesta del switch.

Problema 1:

Ingresar por teclado un valor entero comprendido entre 1 y 5. Mostrar en castellano el valor ingresado o un mensaje indicando que se cargó un valor fuera de rango.

Programa: programa190.c

Ver video

#include<stdio.h>
#include<conio.h>

int main()
{
    int valor;
    printf("Ingrese un valor entre 1 y 5:");
    scanf("%i",&valor);
    switch (valor) {
        case 1:printf("Uno");
               break;
        case 2:printf("Dos");
               break;
        case 3:printf("Tres");
               break;
        case 4:printf("Cuatro");
               break;
        case 5:printf("Cinco");
               break;
        default:
            printf("El valor esta fuera de rango");
    }
    getch();
    return 0;
}

La estructura comienza con la palabra clave switch seguida entre paréntesis por una variable de tipo entera (puede ser char, short int, int, long int y long long int)

Luego entre llaves indicamos los distintos valores que puede tomar la variable y que hacer ante dichos valores.
La palabra clave case le sigue el valor en particular a analizar, por ejemplo si la variable valor tiene almacenado un 3 luego entra por el "case 3" y pasa a ejecutar todas las instrucciones seguidas después de los dos puntos.

La palabra break indica salir del switch.

Si ninguno de los case se verifica verdadero luego ejecuta las instrucciones que indicamos luego de la palabra clave defalut:

El bloque del default es opcional en un switch similar a un else en un if.

Este problema lo veníamos resolviendo con una serie de if anidados:

#include<stdio.h>
#include<conio.h>

int main()
{
    int valor;
    printf("Ingrese un valor entre 1 y 5:");
    scanf("%i",&valor);
    if (valor==1)
    {
        printf("Uno");
    }
    else
    {
        if (valor==2)
        {
            printf("Dos");
        }
        else
        {
            if (valor==3)
            {
                printf("Tres");
            }
            else
            {
                if (valor==4)
                {
                    printf("Cuatro");
                }
                else
                {
                    if (valor==5)
                    {
                        printf("Cinco");
                    }
                    else
                    {
                        printf("El valor esta fuera de rango");
                    }
                }
            }
        }
    }
    getch();
    return 0;
}

Podemos ver que el empleo del switch nos genera un algoritmo mucho más compacto.

Problema 2:

Ingresar por teclado dos valores enteros. Seguidamente solicitar el ingreso de un caracter '+','-','*' o '/'. Dependiendo del operador ingresado sumar, restar, multiplicar o dividir los valores ingresados. Si no se ingresa un operador válido no hacer nada.

Programa: programa191.c

Ver video

#include<stdio.h>
#include<conio.h>

int main()
{
    int valor1,valor2;
    char operacion;
    int resultado;
    printf("Ingrese primer valor:");
    scanf("%i",&valor1);
    printf("Ingrese segundo valor:");
    scanf("%i",&valor2);
    printf("Ingrese la operacion quiere hacer: +,-,*,/ :");
    scanf(" %c",&operacion);
    switch (operacion) {
        case '+':resultado=valor1+valor2;
                 printf("La suma es:%i",resultado);
                 break;
        case '-':resultado=valor1-valor2;
                 printf("La resta es:%i",resultado);
                 break;
        case '*':resultado=valor1*valor2;
                 printf("El producto es:%i",resultado);
                 break;
        case '/':resultado=valor1/valor2;
                 printf("La division es:%i",resultado);
                 break;
    }
    getch();
    return 0;
}

En este problema ingresamos por teclado un caracter y dependiendo de este tenemos que sumar, restar, multiplicar o dividir los dos valores ingresados:

    switch (operacion) {
        case '+':resultado=valor1+valor2;
                 printf("La suma es:%i",resultado);
                 break;
        case '-':resultado=valor1-valor2;
                 printf("La resta es:%i",resultado);
                 break;
        case '*':resultado=valor1*valor2;
                 printf("El producto es:%i",resultado);
                 break;
        case '/':resultado=valor1/valor2;
                 printf("La division es:%i",resultado);
                 break;
    }

El comando break en cada caso es fundamental para el correcto funcionamiento de este problema, puede probar de borrar todos los break y luego ejecutar el programa, cargar dos enteros y solicitar que se sumen, veremos que nos muestran la suma, resta, multiplicación y división.

Si no se disponen los break luego que un case es verdadero todos los otros case se ejecutan sin analizar los otros case.

Problema 3:

Ingresar por teclado una palabra en minúsculas y luego contar la cantidad de vocales y consonantes que tiene.

Programa: programa192.c

Ver video

#include<stdio.h>
#include<string.h>
#include<conio.h>

int main()
{
    char palabra[50];
    int f;
    int vocales=0;
    int consonantes=0;
    printf("Ingrese una palabra:");
    gets(palabra);
    for(f=0;f<strlen(palabra);f++)
    {
        switch (palabra[f]) {
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'u':vocales++;
                     break;
            default: consonantes++;
        }
    }
    printf("La cantidad de vocales que tiene la palabra son:%i\n",vocales);
    printf("La cantidad de consonantes que tiene la palabra son:%i",consonantes);
    getch();
    return 0;
}

Este problema muestra que en ciertas circunstancias es conveniente no disponer break en case. Si la letra que estamos analizando es una vocal luego uno de los cinco case se verifica verdadero por lo que se ejecutan todos los case inclusive el case 'u' donde se incrementa el contador "vocales".

También podemos ver que un case puede tener un bloque de instrucciones a ejecutar vacío.

Para ver que se utiliza esta estructura condicional podemos mostramos una de las tantas función del código fuente del sistema operativo Linux donde la implementa:

switch en el código fuente de Linux

Problema propuesto

Solución

programa193.c

#include<stdio.h>
#include<conio.h>

#define CANT 5


void cargar(int vec[CANT])
{
    int f;
    for(f=0;f<CANT;f++)
    {
        printf("Ingrese elemento:");
        scanf("%i",&vec[f]);
    }
}

void listar(int vec[CANT])
{
    int f;
    for(f=0;f<CANT;f++)
    {
        printf("%i ",vec[f]);
    }
    printf("\n\n");
}

void mostrarMayor(int vec[CANT])
{
    int f;
    int may=vec[0];
    for(f=1;f<CANT;f++)
    {
        if (vec[f]>may)
        {
            may=vec[f];
        }
    }
    printf("Mayor elemento del vector:%i\n\n",may);
}

void mostrarMenor(int vec[CANT])
{
    int f;
    int men=vec[0];
    for(f=0;f<CANT;f++)
    {
        if (vec[f]<men)
        {
            men=vec[f];
        }
    }
    printf("Menor elemento del vector:%i\n\n",men);
}


int main()
{
    int vec[CANT];
    int opcion;
    do {
        printf("1-Cargar el vector.\n");
        printf("2-Imprimir el vector.\n");
        printf("3-Imprimir el mayor elemento del vector.\n");
        printf("4-Imprimir el menor elemento del vector.\n");
        printf("5-Salir.\n");
        printf("Ingrese su opcion:");
        scanf("%i",&opcion);
        switch(opcion) {
            case 1:cargar(vec);
                   break;
            case 2:listar(vec);
                   break;
            case 3:mostrarMayor(vec);
                   break;
            case 4:mostrarMenor(vec);
                   break;
        }
    } while (opcion!=5);
    return 0;
}

Retornar