Inicio > C/C++, Desarrollo de Aplicaciones, General > La estructura condicional switch … case en Lenguaje C [Tutorial 5]

La estructura condicional switch … case en Lenguaje C [Tutorial 5]

La estructura condicional switch … case se utiliza cuando queremos evitarnos las llamadas escaleras de decisiones. La estructura if nos puede proporcionar, únicamente, dos resultados, uno para verdadero y otro para falso. Una estructura switch … case, por su parte, nos permite elegir entre muchas opciones.

Las palabras reservadas en C para la condicional switch … case son:

  • switch
  • case
  • default

Y necesita de una instrucción más, no perteneciente a la programación estructurada en sí, pero que en este caso es necesaria para esta estructura:

  • break
int a;
switch(a)
{
case 0:
    //operaciones a realizar en caso de que a valga 0;
    break;
case 1:
    //mismo proceso
    break;
...
case n:
    //n tiene que ser una constante, o numérica {0,1,2 ....} o una definida #define n 2
    break;
default:
    //en caso de que no se de ninguna de las anteriores hacer...
}

Y esto sería equivalente a:

int a;
if(a==0)
    //operaciones para 0
else if(a==1)
    //operaciones para 1
...
else if(a==n)
    //operaciones para n
else
    //cualquier otro caso

Aunque toda la estructura del if junto con el else correspondiente equivale a una sola instrucción, por lo que las llaves podrían ser omitidas en algunos casos, pero es aconsejable colocarlas por claridad.

Haremos un programa que permita calcular el salario de un trabajador, dependiendo del nivel de antigüedad, para ello hacemo lo siguiente vamos Archivo -> Nuevo -> Proyecto:

Creamos un nuevo proyecto que sea Console Application, seleccionamos C Project y le ponemos el nombre que queramos, que en este caso es: Tutorial_5.

A continuación indicamos donde queremos guardar el proyecto que hemos creado.

Por defecto, Dev-C++ crea el archivo main.c.

Compilamos y Guardamos el main con el nombre que tu quieras, en mi caso le pongo main_Tutorial5.

Ahora borramos lo que tiene el main ya que queremos aprender a programar desde el principio.

Ahora ya podemos escribir nuestro código que seria el siguiente:

// ejemplo con un salario con la condicion switch
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main()
{
      int nivel;
      float salario, slanuevo;
      printf("Introduce el nivel de antiguedad del trabajador: ");
      scanf("%d",&nivel);
      printf("Introduce tu salario: ");
      scanf("%f",&salario);
      switch (nivel) {
        case 5:
                slanuevo=salario+(salario*.035);
                printf("\nTu salario es:%f\n",slanuevo);
                break;
        case 6:
                slanuevo=salario+(salario*.041);
                printf("\nTu salario es: %f\n",slanuevo);
                break;
        case 7:
                slanuevo=salario+(salario*.048);
                printf("\nTu salario es: %f\n",slanuevo);
                break;
        case 8:
                slanuevo=salario+(salario*.053);
                printf("\nTu salario es: %f\n",slanuevo);
                break;
        default:
                printf("\nTu salario es: %f\n",salario);
}
system("PAUSE");
return 0;
}

Compilamos y verificamos que el programa no tenga errores.

Ahora ejecutamos el programa para comprobar que todo es correcto.

El resultado es el siguiente:

Como podemos observar, el nivel de antigüedad es 7 lo cual significaría un aumento de 48%, lo que nos queda con el nuevo salario con el aumento.

Las sentencias break son muy importantes, ya que el comportamiento normal de un bloque switch es ejecutarlo todo desde la etiqueta case que corresponda hasta el final. Por ello, si no queremos que se nos ejecute más de un bloque, pondremos sentencias break al final de cada bloque excepto el último. Es decir, las etiquetas case son puntos de entrada de la ejecución, y no implican que al acabarse el bloque case la ejecución salte al final del bloque switch. Las etiquetas case siguientes a la que hemos utilizado para entrar son, sencillamente, ignoradas.

El uso de break en la estructura switch-case, si no se encuentra el break, ejecuta todas las instrucciones que se encuentran de ahí para adelante, es decir, si no insertásemos el break, el resultado del case 0: sería el resultado de todos los cases seguidos. Esto se puede aprovechar: Para este ejemplo imaginemos que teniendo una nota nos diga el estado en palabra de la asignatura del alumno:

#include <stdio.h>
main(void)
{
int nota;
printf("introduce tu nota\n");
scanf("%i",&nota);
switch(nota)
{
case 1:
case 2:
case 3: //nótese que pueden estar desordenados
case 0:
case 4:
printf("Suspenso\n");
break;
case 5:
case 6:
printf("Aprobado\n");
break;
case 9:
case 10:
printf("Sobresaliente\n");
break;
case 7:
case 8:
printf("Notable\n");
}
system("pause");
}

Compilamos y verificamos que el programa no tenga errores:

Ahora ejecutamos el programa para comprobar que todo es correcto.

El resultado es el siguiente:

Como se puede observar, el nota introducida era 5,  por lo que entraría en el case 5, pero como no tiene break, pasa al siguiente case que es el 6 e imprime Aprobado, y apenas se encuentra con el break se sale del switch.

En el siguiente ejemplo, pondremos el día de la semana correspondiente a los planetas del sistema solar:

#include <stdio.h>
int dia = 0;
main(void) {
printf("Elige un Dia a la Semana\n\n");
printf("1. Lunes\n");
printf("2. Martes\n");
printf("3. Miercoles\n");
printf("4. Jueves\n");
printf("5. Viernes\n");
printf("6. Sábado\n");
printf("7. Domingo\n");
printf("Que numero de dia de la semana escoges: ");
scanf("%i",&dia);

switch(dia) {
case 1 :
printf("Lunes es, Luna\n");
break;
case 2 :
printf("Martes es, Marte\n");
break;
case 3 :
printf("Miercoles es, Mercurio\n");
break;
case 4 :
printf("Jueves es, Jupiter\n");
break;
case 5 :
printf("Viernes es, Venus\n");
break;
case 6 :
printf("Sábado es, Saturno\n");
break;
case 7 :
printf("Domingo es, Sol\n");
break;
default :
printf("No existe\n");
}
system ("PAUSE");
}

Compilamos y verificamos que el programa no tenga errores:

Ahora ejecutamos el programa para comprobar que todo es correcto.

El resultado es el siguiente:

La estructura anterior, de realizarse con sentencias if, necesitaría cuatro de ellas, resultando un enorme bloque muy difícil de leer. En la mayoría de los casos, además, la sentencia switch proporciona una ganancia en velocidad del código, pues permite al compilador trabajar en base a que se trata de una decisión múltiple para una única variable, cosa que con sentencias if el compilador no tiene por qué detectar.

Como vemos, para cada valor de la variable se ejecuta un bloque de sentencias distinto, en el que no necesitamos llaves. Hay un caso especial, default, que se ejecuta si ningún otro corresponde, y que no es necesario poner. Es, en todo, equivalente al bloque else de una sentencia if.

Ahora escribiremos un programa en Lenguaje C que solicite el ingreso de dos números enteros y que luego permita seleccionar si se sumarán, restarán dividirán o multiplicarán y muestre el resultado por pantalla.

#include <stdio.h>
main(void)
{
	int opcion,a,b,resultado;
	printf("Ingrese un numero entero [a]: ");
	scanf("%d",&a); 
 printf("Ingrese un numero entero [b]: ");
 scanf("%d",&b); 	
 printf("Menu\n"); 
 printf("1. Sumar\n"); 
 printf("2. Restar\n");
 printf("3. Dividir\n"); 
 printf("4. Multiplicar\n");
	printf("Elija una operacion: ");
	scanf("%d",&opcion);
	switch(opcion)
	{
		case 1: 			
                        resultado=a+b;
			printf("%d + %d = %d\n",a,b,resultado);
			break;
		case 2: 			
                        resultado=a-b;
			printf("%d - %d = %d\n",a,b,resultado);
			break;
		case 3:
			resultado=a/b;
			printf("%d / %d = %d\n",a,b,resultado);
			break;
		case 4:
			resultado=a*b;
			printf("%d x %d = %d\n",a,b,resultado);
			break;
		defalut:
			printf("Opcion no valida\n"); 
	}
        system ("PAUSE");
}

Compilamos y verificamos que el programa no tenga errores:

Ahora ejecutamos el programa para comprobar que todo es correcto.

El resultado es el siguiente:

Como se puede observar, los numero introducido eran 2 y 5,  y la operación es la de multiplicar fíjense como da el resultado.

Bien este es todo el Tutorial, nos veremos en la proxima entrega… Chao =)

  1. marzo 24, 2013 a las 8:16 AM

    You want to study anything beyond what they have provided to you.

    This device has taken the tech planet by storm, and for superior purpose.

  2. May 31, 2013 a las 3:40 AM

    My programmer is trying to convince me to move to .net from PHP.

    I have always disliked the idea because of the costs.
    But he’s tryiong none the less. I’ve been using WordPress on various websites for about a
    year and am concerned about switching to another platform.

    I have heard very good things about blogengine.

    net. Is there a way I can import all my wordpress content into it?
    Any kind of help would be greatly appreciated!

  3. juan
    agosto 4, 2014 a las 11:13 PM

    Nomamen no entiendo nada 😥

    • enero 30, 2015 a las 12:31 PM

      Hermano no entiendes que? puede ser mas explicito, Gracias

  4. Victor Duque
    octubre 29, 2014 a las 10:42 PM

    Muy buenos tus aportes. Gracias!

  5. daniel padher
    marzo 25, 2015 a las 2:33 AM

    buenisimo ya visite muchisimas paginas y ninguna me avia dado la explicacion que queria muchas gracias

  6. Nicolas Valencia
    abril 3, 2015 a las 6:52 PM

    Muchas gracias, me ha sido de mucha ayuda, 🙂

  7. gamboamorales4
    May 21, 2015 a las 4:13 AM

    ¡excelente! muchas gracias Alfredo

  8. junio 4, 2015 a las 4:54 PM

    nel ni mergas

  9. Xavier Rosales
    noviembre 9, 2015 a las 3:07 AM

    muy bueno muchas gracias por el aporte

  10. José
    noviembre 12, 2015 a las 1:02 PM

    Excelente!
    igual uso Dev C++

  11. ANTONIO HUERTA CORONA
    marzo 22, 2016 a las 6:13 PM

    muchas gracias me sirvió de gran ayuda sigue así.

  12. dag
    junio 5, 2016 a las 5:00 PM

    puchas

    • dag
      junio 5, 2016 a las 5:01 PM

      hamehamehaaaaaaaaa

  13. melecio
    octubre 14, 2016 a las 2:09 AM

    como le ago para que al presionar una tecla cualquiera en default me cierre el programa automáticamente sin tener que dar enter para continuar?

  14. May 31, 2017 a las 6:53 AM

    最近では、太陽光発電も容易に一括見積もりができるサイトが増えています。一括見積もり依頼のやり方や本当の導入時のスタイルも様々ですが、見積もりサイトの特徴を、私なりに調べてみました。

    大きくわけて、地域をカバーしている複数の施工業者に一度に、見積もりお願いをする「見積もり一括型」と施工をする会社に直接見積もりお願いをする「直接見積もり型」になります。そうしたサービスからあなたに合う最もいいサービスを選ぶ手助けができたらと思います。

    ソーラーパネルは、ただ単に、安く設置すればよいというものではなく、発電するときの効率も重要です。
    発電するときの効率が低ければ、電気を売る時の回収も低くなり、せっかく安くに設置しても無駄になってしまいます。

    また、自分の立地等の色々な条件によって適切なパネル設置面積やソーラーパネルメーカーの選びが費用対効果を最大限にする重要な点です。

  15. andres manjarrez
    junio 14, 2017 a las 10:55 PM

    genial tu explicacion !!

  16. agosto 21, 2017 a las 5:42 AM

    I think everything wrote was very reasonable. But, think on this, what if
    you added a little information? I mean, I don’t wish to
    tell you how to run your website, however suppose you added a post title to maybe get a person’s attention? I mean La estructura condicional switch … case en Lenguaje C [Tutorial 5] | adolfredobelizario weblog
    is a little vanilla. You ought to look at Yahoo’s front page and see how they create news headlines to get viewers to open the links.

    You might add a related video or a pic or two to grab readers excited about what you’ve got to say.
    Just my opinion, it would bring your posts a little bit more interesting.

  17. junio 19, 2018 a las 5:40 AM

    Very nice blog post. I certainly love this site. Thanks!

  18. agosto 3, 2018 a las 6:03 AM

    I really like this fishfinder. Superb job. All in one app.

  19. enero 5, 2019 a las 9:27 AM

    This website was… how do I say it? Relevant!! Finally I’ve found something that
    helped me. Thanks a lot!

  20. enero 24, 2019 a las 4:20 AM

    Awesome post.

  21. May 24, 2019 a las 8:05 PM

    I think what you published made a bunch of sense.
    However, consider this, suppose you added a little information? I am not suggesting your content isn’t good,
    but what if you added something that makes people desire more?
    I mean La estructura condicional switch … case en Lenguaje C [Tutorial 5] | adolfredobelizario weblog is kinda boring.
    You ought to glance at Yahoo’s home page and see how they create post titles to get viewers interested.
    You might add a related video or a picture or two to grab readers excited about everything’ve got to say.
    Just my opinion, it would make your posts a little bit more interesting.

  22. www
    junio 29, 2019 a las 11:16 AM

    You actually make it appear really easy together with your
    presentation however I to find this matter to be actually something that I think I might
    never understand. It sort of feels too complex and extremely wide
    for me. I am looking forward on your next post, I will try to get the hold of it!

  23. julio 1, 2019 a las 8:34 AM

    It’s remarkable to visit this web site and reading the views of
    all colleagues concerning this article, while I am
    also keen of getting familiarity.

  24. enero 24, 2020 a las 8:56 PM

    It’s nearly impossible to find well-informed people on this topic, however, you sound like
    you know what you’re talking about! Thanks

  25. marzo 2, 2020 a las 6:36 AM

    Awesome article.

  26. marzo 18, 2020 a las 3:56 AM

    I was suggested this web site via my cousin. I’m not sure whether this publish is written via him as no one else know
    such certain approximately my problem. You’re wonderful!
    Thank you!

  27. Alphaville
    abril 3, 2022 a las 1:49 PM

    Gracias por aporte, desempolvando viejos conocimientos.

  1. May 20, 2014 a las 8:36 AM
  2. agosto 4, 2014 a las 1:20 AM
  3. agosto 13, 2014 a las 12:33 PM
  4. septiembre 15, 2014 a las 2:30 PM
  5. octubre 17, 2014 a las 1:30 AM
  6. May 6, 2015 a las 12:32 PM
  7. junio 15, 2016 a las 1:46 AM
  8. abril 11, 2017 a las 6:15 PM
  9. julio 31, 2018 a las 6:56 AM
  10. julio 31, 2018 a las 6:58 AM
  11. agosto 23, 2018 a las 5:09 PM
  12. agosto 27, 2018 a las 2:49 AM
  13. septiembre 3, 2018 a las 2:19 PM
  14. octubre 3, 2018 a las 8:35 AM
  15. abril 8, 2020 a las 12:51 AM
  16. noviembre 2, 2020 a las 1:25 PM

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.