Resumen: Entrega nº32 del tutorial "Curso básico de programación en lenguaje C desde cero".
Codificación aprenderaprogramar.com: CU00532F

 

 

CONDICIONAL SWITCH

El condicional switch permite elegir entre varias opciones posibles. En realidad, este condicional puede ser expresado también usando condicionales if, por lo que podríamos decir que no es estrictamente necesario. Sin embargo, en algunos casos resulta más claro usar el condicional switch y resulta útil.

logo lenguaje programacion C

 

La sintaxis a emplear con C es la siguiente:

switch (selector) {

case [valor selector 1]:
Instrucción 1;
Instrucción 2;

case [valor selector 2]:
Instrucción 3;
Instrucción 4;
.
.
.
case [valor selector n]:
Instrucción j;
Instrucción k;

default:
Instrucción x;
Instrucción y;

}

 

 

La variable a evaluar o selector ha de ser un valor con equivalencia ordinal (equivalencia numérica entera). Por ejemplo puede ser una variable tipo int ó char (ya que cada char lleva un número entero asociado), pero no puede ser un double ni un float ni una cadena de caracteres (string). Sólo se puede evaluar una expresión y no múltiples expresiones.

Las sentencias break; hacen que una vez verificado que se cumple una opción dentro del switch, se salga del mismo y se continúe la ejecución en la siguiente instrucción después del switch. El uso de break; es opcional, pero es habitual incluir un break; después de cada evaluación. En caso de no hacerlo, se ejecutarán todas las instrucciones dentro de cualquier case (incluso aunque no se verifique) después del que ha verificado la condición hasta encontrar una sentencia break; o terminar la ejecución del switch. Esto puede generar resultados contradictorios o no esperados, de ahí que en general siempre se incluyan sentencias break;.

La cláusula default hace que se ejecuten las instrucciones a continuación de ella en caso de que la ejecución del programa llegue a alcanzarla. Si se usan las sentencias break; en cada evaluación, sólo se ejecutará lo indicado en default si no se ha encontrado una coincidencia previa.

La evaluación de expresiones es de coincidencia entre la variable evaluada y el valor indicado en case. Por ejemplo, case 12 indicaría que si la expresión evaluada vale 12 se ejecutarán las instrucciones anexas. También se puede usar case empleando constantes simbólicas (pero no con constantes definidas con const). Veamos un ejemplo:

#include <stdio.h>
#include <stdlib.h>
#define MAXIMOBARCOS 7
// Ejemplo aprenderaprogramar.com
int main() {
    int barcos = 8;
    switch (barcos) {
    case 1:
        printf ("El numero de barcos es 1");
        break;
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
        printf ("El numero de barcos esta entre 2 y 6");
        break;

    case MAXIMOBARCOS:
        printf ("El numero de barcos es el maximo, 7");
        break;

    default:
        printf ("El numero de barcos no esta entre 1 y el maximo");
    }
    return 0;
}

 

 

Aprovechando que en ausencia de break; se ejecutan todas las instrucciones después de cualquier case hasta encontrar break;, en el programa anterior se simula una evaluación de un intervalo dejando varias sentencias case vacías, de modo que en caso de cumplirse cualquiera de ellas se ejecuta el código previsto para el primer case con break; que aparece en la secuencia.

Si no existen las sentencias break; se puede ejecutar además de las sentencias en cases las sentencias de default. Esto debemos tenerlo muy en cuenta, ya que si pretendemos que default sólo se ejecute cuando no haya habido ninguna coincidencia en los case, debemos incluir los break; obligatoriamente. Si pretendemos realizar evaluaciones más complejas (por ejemplo de pertenencia de un valor a un intervalo numérico amplio) deberemos hacerlo a través de la instrucción if en vez de a través de switch.

Las instrucciones switch se pueden anidar, aunque en principio no puede considerarse algo aconsejable debido a que puede suponer una mala legibilidad del código. Cada instrucción switch debe tener su correspondiente llave de apertura y cierre

La instrucción switch presenta similitudes marcadas con la instrucción if. Por ello, en general podremos conseguir resultados similares con ambas instrucciones y elegir usar una u otra dependerá de nuestro gusto y de cuál se adapte mejor a nuestros intereses, que en general serán ahorrar código y conseguir claridad para cumplir el objetivo. Otras veces será interesante anidar o trabajar simultáneamente con ambas instrucciones.

 

 

EJERCICIO RESUELTO: ENUNCIADO

Transformar en código el siguiente pseudocódigo y razonar para comprender su lógica. Se trata de crearun programa que pida al usuario un número de día y un número de mes, evalúe si la entrada es correcta y en caso de que así sea calcule el día del año que es, considerando un año no bisiesto.

1.  Inicio [Cálculo del día del año - Pseudocódigo aprenderaprogramar.com]

2.  Mostrar “Introduzca el número del día y número del mes”

3.  Pedir nDia, nMes

4.  Si nDia>= 1 y  nDia <= 31 y nMes >= 1 y nMes <= 12 Entonces

Según nMes Hacer

Caso, = 1

DDA = nDia [DDA es día del año]

Caso, = 2

DDA = nDia + 31

Caso, = 3

DDA = nDia + 59

Caso, = 4

DDA = nDia + 90

Caso, = 5

DDA = nDia + 120

Caso, = 6

DDA = nDia + 151

Caso, = 7

DDA = nDia + 181

Caso, = 8

DDA = nDia + 212

Caso, = 9

DDA = nDia + 243

Caso, = 10

DDA = nDia + 273

Caso, = 11

DDA = nDia + 304

Caso, = 12

DDA = nDia + 334

FinSegún

Mostrar “El”, nDia, “del”, nMes, “es el día”, DDA, “del año”

SiNo

Mostrar “Datos proporcionados no válidos”

FinSi

5.  Fin

 

 

 

EJERCICIO RESUELTO: SOLUCIÓN

/* CALCULO DEL DIA DEL AÑO */

#include <stdio.h>
#include <stdlib.h>

#define MAXDIA 31
#define MAXMES 12
// Ejercicios resueltos aprenderaprogramar.com
int main() {

    int nDia = 0; int nMes = 0; int diaDelAnyo = 0;

    printf("Calculo del dia del a%co (no bisiesto)\n", 164);
    puts ("");
    printf ("Introduzca el numero del dia: ");
    scanf("%d", &nDia);
    printf ("Introduzca el numero del mes: ");
    scanf("%d", &nMes);

    if ( nDia >= 1 && nDia <= MAXDIA && nMes >= 1 && nMes <= MAXMES) {

        switch (nMes) {

        case 1: diaDelAnyo = nDia; break;
        case 2: diaDelAnyo = nDia + 31; break;
        case 3: diaDelAnyo = nDia + 59; break;
        case 4: diaDelAnyo = nDia + 90; break;
        case 5: diaDelAnyo = nDia + 120; break;
        case 6: diaDelAnyo = nDia + 151; break;
        case 7: diaDelAnyo = nDia + 181; break;
        case 8: diaDelAnyo = nDia + 212; break;
        case 9: diaDelAnyo = nDia + 243; break;
        case 10: diaDelAnyo = nDia + 273; break;
        case 11: diaDelAnyo = nDia + 304; break;
        case 12: diaDelAnyo = nDia + 334; break;
        default: puts ("Datos no validos");

        }
    }
    if (diaDelAnyo !=0) {
        printf ("El %d del %d es el dia %d del a%co\n", nDia, nMes, diaDelAnyo, 164);
    } else {
        puts ("Los datos no son validos");
    }
    return 0;
}

 

 

Un resultado de ejecución podría ser este:

Calculo del dia del año

Introduzca el numero del dia: 16

Introduzca el numero del mes: 3

El 16 del 3 es el dia 75 del año

 

 

EJERCICIO 1

Crea un programa donde se solicite al usuario que introduzca el tipo de bomba para una máquina, pudiendo introducir valores enteros comprendidos entre 0 y 4. Según el valor introducido por el usuario debe mostrarse el siguiente resultado usando un condicional switch:

a) Si el tipo de bomba es 0, mostrar un mensaje por consola indicando “No hay establecido un valor definido para el tipo de bomba”.

b) Si el tipo de bomba es 1, mostrar un mensaje por consola indicando “La bomba es una bomba de agua”.

c) Si el tipo de bomba es 2, mostrar un mensaje por consola indicando “La bomba es una bomba de gasolina”.

d) Si el tipo de bomba es 3, mostrar un mensaje por consola indicando “La bomba es una bomba de hormigón”.

e) Si el tipo de bomba es 4,mostrar un mensaje por consola indicando “La bomba es una bomba de pasta alimenticia”.

f) Si no se cumple ninguno de los valores anteriores mostrar el mensaje “No existe un valor válido para tipo de bomba”.

 

Para comprobar si tus respuestas son correctas puedes consultar en los foros aprenderaprogramar.com.

 

 

EJERCICIO 2

Reescribe el programa anterior usando condicionales if (es decir, en lugar de switch nos basaremos exclusivamente en if).

Para comprobar si tus respuestas son correctas puedes consultar en los foros aprenderaprogramar.com.

 

 

 

 

 

 

Para acceder a la información general sobre este curso y al listado completo de entregas pulsa en este link:  Ver curso completo.

 

Para  hacer un comentario o consulta utiliza los foros aprenderaprogramar.com, abiertos a cualquier persona independientemente de su nivel de conocimiento.

 

Descargar archivo: