Etiquetas

Los programas C++ se ejecutan secuencialmente, es decir, las sentencias se ejecutan una a continuación de otra, en el mismo orden en que están escritas en el programa.

Sin embargo, esta secuencia puede ser interrumpida de varias maneras, mediante el uso de sentencias de salto.

Las etiquetas son la forma en que se indica al compilador en qué puntos será reanudada la ejecución de un programa cuando se produzca una ruptura del orden secuencial de ejecución.

Etiquetas de identificación

Corresponden con la siguiente sintaxis:

<identificador>: <sentencia>

Estas etiquetas sirven como puntos de entrada para la sentencia de salto goto, que veremos más abajo, y tienen el ámbito restringido a la función dentro de la cual están definidas. Veremos su uso con más detalle al analizar la sentencia goto.

Etiquetas case y default

Esta etiqueta se circunscribe al ámbito de la sentencia switch, y se verá su uso en el siguiente apartado. Sintaxis:

switch(<variable>)
{
   case <expresión_constante>: [<sentencias>][break;]
   . . . 
   [default: [<sentencias>]] 
}

Selección

Las sentencias de selección permiten controlar el flujo del programa, seleccionando distintas sentencias en función de diferentes circunstancias.

Sentencia if...else

Permite la ejecución condicional de una sentencia. Sintaxis:

if (<condición>) <sentencia1>
  [else <sentencia2>]

En C++ se pueden declarar variables dentro de la expresión de condición, que será, como en el caso de los bucles, una expresión booleana. Por ejemplo:

if(int val = func(arg))... 

En este caso, la variable val sólo será accesible dentro del ámbito de la sentencia if y, si existe, del else.

Si la condición es verdadera se ejecutará la sentencia1, si es falsa, (y si existe la parte del else), se ejecutará la sentencia2.

La claúsula else es opcional, y si se usa, no pueden insertarse sentencias entre la sentencia1 y el else.

Sentencia switch

Esta sentencia es una generalización de las sentencias if...else. En el caso de las sentencias if, la expresión que se evalúa como condición es booleana, lo que quiere decir que sólo hay dos valores posibles, y por lo tanto, sólo se puede elegir entre dos sentencias a ejecutar.

En el caso de la sentencia switch, la expresión a evaluar será entera, por lo tanto, el número de opciones es mucho mayor, y en consecuencia, también es mayor el número de diferentes sentencias que se pueden ejecutar.

Sintaxis:

switch (<expresión entera>) 
{
   [case <expresión_constante1>: [<sentencias1>]]
   [case <expresión_constante2>: [<sentencias2>]]
   ...
   [case <expresión_constanten>: [<sentenciasn>]]
   [default : [<sentencia>]]
}

Cuando se usa la sentencia switch el control se transfiere al punto etiquetado con el case cuya expresión constante coincida con el valor de la expresión entera evaluada dentro del switch. A partir de ese punto todas las sentencias serán ejecutadas hasta el final del switch, es decir hasta llegar al "}". Esto es así porque las etiquetas sólo marcan los puntos de entrada después de una ruptura de la secuencia de ejecución, pero no marcan los puntos de salida.

Esta estructura está diseñada para ejecutar cierta secuencia de instrucciones, empezando a partir de un punto diferente, en función de un valor entero y dejando sin ejecutar las anteriores a ese punto.

Veamos un ejemplo. Para hacer un pan hay que seguir (en una versión resumida), la siguiente secuencia:

  1. Conseguir las semillas de trigo
  2. Arar el campo
  3. Sembrar el trigo
  4. Esperar a que madure (No soy agricultor, pero sospecho que esta etapa es algo más complicada).
  5. Cosechar el trigo
  6. Separar el grano de la paja
  7. Moler el grano, para coseguir harina
  8. Amasar la harina junto con agua, sal y levadura. (Dejaremos de momento de lado el método para conseguir estos ingredientes).
  9. Dejar reposar la masa
  10. Encender el horno. (También dejaremos de momento los métodos para conseguir leña, construir un horno, o encenderlo).
  11. Meter el pan crudo en el horno.
  12. Esperar a que se haga el pan.
  13. Sacar el pan del horno.

A cada paso le hemos asignado un número entero. Si por ejemplo, tenemos que hacer un pan, pero ya hemos hecho los primeros siete pasos, es decir, disponemos de harina, la ejecución empezará en el paso ocho, y continuará hasta el trece. De forma análoga, si ya tenemos masa dejada a reposar, podremos entrar directamente en el nivel diez.

Esta característica también nos permite ejecutar las mismas sentencias para varias etiquetas distintas, y en el apartado siguiente veremos (aunque vamos a adelantarlo ahora) que se puede eludir la ejecución secuencial normal usando la sentencia de ruptura break para ejecutar sólo parte de las sentencias.

Si el valor de la expresión entera no satisface ningún case, es decir, si no existe un case con una expresión constante igual al valor de la expresión entera, el control parará a la sentencia etiquetada con la etiqueta default.

Todas las etiquetas son opcionales, tanto default como todos los case. Si no se satisface ningún case, ni aparece la etiqueta default, se abandonará la sentencia switch sin ejecutar ninguna sentencia.

Por ejemplo:

bool EsVocal;
char letra;
...
switch(letra) 
{ 
   case 'a': 
   case 'e': 
   case 'i': 
   case 'o': 
   case 'u': 
      EsVocal = true; 
      break; 
   default: 
      EsVocal = false; 
}

En este ejemplo letra es una variable de tipo char y EsVocal de tipo bool. Si el valor de entrada en el switch corresponde a una vocal, EsVocal saldrá con un valor verdadero, en caso contrario, saldrá con un valor falso. El ejemplo ilustra el uso del break. Si por ejemplo, letra contiene el valor 'a', se cumple el primer case, y la ejecución continúa en la siguiente sentencia: EsVocal = true, ignorando el resto de los case hasta el break, que nos hace abandonar la sentencia switch.

Otro ejemplo:

int Menor1, Menor2, Menor3, Mayor3;

Menor1 = Menor2 = Menor3 = Mayor3 = false;
switch(numero) 
{ 
   case 0:
      Menor1 = true; 
   case 1: 
      Menor2 = true;
   case 2: 
      Menor3 = true; 
      break; 
   default: 
      Mayor3 = true; 
}

Veamos qué pasa en este ejemplo si numero vale 1. Directamente se reanuda la ejecución en case 1:, con lo cual Menor2 tomará el valor true, lo mismo pasará con Menor3. Después aparece el break y se abandona la sentencia switch.

Recordemos que los tipos enumerados se consideran también como enteros, de modo que también es posible usarlos en sentencias switch, de hecho, su uso en estas sentencias es bastante frecuente.

enum estado {principio, primera, segunda, tercera, final};

estado x;

x = primera;

switch(x) {
   case principio: IniciarProceso();
   case primera:   PrimeraFase();
   case segunda:   SegundaFase();
   case tercera:   TerceraFase();
   case final:     Terminar()
}

Comentarios de los usuarios (26)

Alejandro
2011-07-26 05:05:53

Hola!, este curso es Excelente. y tengo una pequeña duda:

Por qué antes de escribir la primera llave del bloque se escribe antes una pleca invertida, disculpen si estare molestando.

switch(letra)

\{

...

}

Salvador Pozo
2011-07-26 10:43:41

Se trata de un error en el código de la página. Lo he corregido para este capítulo, pero no descarto que el mismo error aparezca en otros.

Gracias por la información.

EJMM
2011-08-31 16:20:06

Será que me puedan ayudar a cerca de swith?????

y muchas grasias

Choco
2011-10-07 19:24:00

El código:

int Menor1, Menor2, Menor3, Mayor3;

Menor1 = Menor2 = Menor3 = Mayor3 = false;
switch(numero) 
{ 
   case 0:
      Menor1 = true; 
   case 1: 
      Menor2 = true;
   case 2: 
      Menor3 = true; 
      break; 
   default: 
      Mayor3 = true; 
}

¿se puede omitir el case 2? En el caso de numero==2 entrará en default, afectando únicamente a Mayor3 (tal y como hacía el código anterior). Si es menor, igualmente afectará a Mayor3.

int Menor1, Menor2, Menor3, Mayor3;

Menor1 = Menor2 = Menor3 = Mayor3 = false;
switch(numero) 
{ 
   case 0:
      Menor1 = true; 
   case 1: 
      Menor2 = true;
   default: 
      Mayor3 = true; 
}
Steven R. Davidson
2011-10-07 20:20:31

Hola Choco,

El cambio que introduces no producirá el mismo comportamiento que el código original. El problema es que no has leído correctamente le nombre de la variable para el caso 2, que es:

   case 2: 
      Menor3 = true; 
      break; 

Es decir, hacemos esto,

Menor3 = true;

y no esto,

Mayor3 = true;

que es lo que pensabas. Por esto, el caso 3 es diferente al caso 2.

Espero haber aclarado la duda.

Steven

Ricardo Mera
2011-10-19 18:03:12

yo estoy apenas comenzando y me parece muy interesante este curso, sin embargo o comprendo mucho, me parece que esta hecho para personas que ya saben algo del tema

Steven R. Davidson
2011-10-19 21:13:14

Hola Ricardo,

Hemos intentado escribir el curso para los iniciados, partiendo de cero, pero a veces no siempre lo logramos. Si tienes dudas e inquietudes específicas, sugiero que las expongas en nuestra lista de correo-e ( http://c.conclase.net/?id=listacorreo ) que fue creada originalmente para complementar este curso de C++, pero también tratamos temas generales de informática.

También ten presente que hasta el final del siguiente capítulo, 6, no verás ejemplos completos que posiblemente te sacarán de dudas, especialmente a la típica pregunta de "¿y qué hago con todo esto?" o "¿cómo programo usando esto de las variables, sentencias, funciones, etc.?" y cuestiones semejantes.

Hasta pronto,

Steven

Carlos56
2011-10-26 21:10:51

uff muchas gracias por los cursos ahora entiendo mejor el uso de las sentencias,estaré entrando seguido a la pagina para seguir aprendiendo.

gracias de nuevo

Víctor
2012-10-23 16:25:41

Hola.

Muy bueno todo lo que leo aquí, les estoy muy agradecido.

Tengo una duda con respecto a la sentencia switch - case

si deseo verificar un rango, ¿debo poner tantos case como posibilidades?

o sea, si quisiera saber si se pulsó una letra minúscula debo poner case 'a': case 'b': ... case 'z':

¿o existe alguna forma de verificar un rango completo?

desde ya, muchas gracias

Steven R. Davidson
2012-10-23 18:05:08

Hola Víctor,

Así es. Cada 'case' es una etiqueta, adonde salta el programa. Si quieres comprobar un intervalo, entonces usa 'if'. Por ejemplo,

if( 'a' <= letra&&letra <= 'z' )
{
  // Hacemos algo si está en minúsculas
  ...
}

Espero haber aclarado la duda.

Steven

Lupin
2012-11-19 00:34:00

Hola como estan? Excelente curso!

Tengo una dudaa con switch: en el ejemplo de menor, si numero es 1 entonces entra en el case 1 y ejecuta la sentencia, mi duda es, tambien entra en el case 2? de ser afirmativa la respuesta... por que? lo que vine leyendo se decia que switch es una generalizacion de if.

Espero que entiendan mi duda.

Steven R. Davidson
2012-11-19 01:52:01

Hola Lupin,

Efectivamente, salta al caso 1 y continúa ejecutando sentencias. En este ejemplo, ejecutamos estas sentencias:

Menor2 = true;
Menor3 = true;
break;

Técnicamente, 'switch/case' se parece más a un 'if/goto'. El segundo ejemplo se podría reescribir así:

if( 0 == numero )
  goto caso0;
if( 1 == numero )
  goto caso1;
if( 2 == numero )
  goto caso2;

// default
goto por_defecto;

caso0:
  Menor1 = true;
caso1:
  Menor2 = true;
caso2:
  Menor3 = true;
  goto fuera;  // break

por_defecto:
  Mayor3 = true;

fuera:
  // Otras sentencias fuera del 'switch/case' original

Sin embargo, el uso habitual que damos a 'switch/case' se acerca más a una forma elegante de 'if/else', especialmente al usar 'break'.

La sentencia 'switch/case' implica UN SOLO salto al caso debido. A partir del único salto, se ejecutan todas las sentencias encontradas. Si nos topamos con una sentencia 'break', entonces nos salimos inmediatamente de tal sentencia 'switch'; esto se parece un poco a lo que haría 'else', ya que no ejecutamos sentencias póstumas al 'break'.

Espero haber aclarado la duda.

Steven

Lupin
2012-11-19 07:02:10

Muchisimas gracias Steven, ahora se me aclaro mucho mas. Gracias por la onda de responderme rapido. Un abrazo.

Sebastián
2013-02-02 18:37:42
signed short int x = -1;

if(x)
{
   /* Tengo entendido que un valor == 0 es tomado como false y un valor !0 es tomado como true...por lo que me nace la duda de que pasa si el valor es negativo...devuelve true o false???
}
Steven R. Davidson
2013-02-02 18:44:01

Hola Sebastián,

En una expresión condicional, 0 (cero) es siempre falso, y cualquier otro valor se considera verdadero. Por lo tanto, un número negativo se considera verdadero, ya que no es 0 (cero).

Espero haber aclarado la duda.

Steven

Pablo
2013-06-29 12:42:49

Hola, tengo dos dudas, ¿porque poner en el ultimo ejemplo del switch "estado x; x = primera; switch(x)"? si tranquilamente podria poner "switch(primera)".

Y si soy yo quien establece la expresion entera(en este caso "primera") para que habria de poner el case "IniciarProceso"?

Es decir, si ya se que cuando el switch empieze a funcionar lo voy hacer arrancar con el case primera, no hace falta el anterior. Espero se entienda mi pregunta :D

Adri
2014-12-21 23:50:06

Informacion extra:

Existe una alternativa a if...else:

(condicion)? operacion_1 : operacion_2

La cual equivale a...

if(condicion) operacion_1; else operacion_2

La ventaja esque es mas comodo de usar, y la desventaja, que

solo admite una operacion para cada caso.

Steven R. Davidson
2014-12-31 16:16:16

Hola Adri,

Hablamos de este operador (y otros) en el capítulo 18: http://c.conclase.net/curso/?cap=018

Steven

Sebastian
2015-01-04 08:03:30

Buenas,

Tengo la siguiente duda. Realice el siguiente pregrama donde se asigna un dia del mes segun el numero tipiado (de 1 a 12). El tema es que cuando lo voy a compilar el programa me larga error. He leido sobre este problema y es porque en la funcion switch no permite realizarlo con dos valores enteros. Esto es asi? En el caso que no lo fuese, como se corrige el problema??

Desde ya muchas gracias por su tiempo.-

#include <iostream>

#include <conio.h>

#include <stdio.h>

#include <string.h>

using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {

int a;

cout<<"Este Programa muestra un mes segun su numero entero con la funcion switch\n\n"<<endl;

cout<<"ingrese Numero del mes a visualizar: ";

cin>>a;

switch (a)

{

case '1': "Enero\n\n";

break;

case '2': "Febrero\n\n";

break;

case '3': "Marzo\n\n";

break;

case '4': "Abril\n\n";

break;

case '5': "Mayo\n\n";

break;

case '6': "Junio\n\n";

break;

case '7': "Julio\n\n";

break;

case '8': "Agosto\n\n";

break;

case '9': "Septiembre\n\n";

break;

case '10': "Octubre\n\n";

break;

case '11': "Noviembre\n\n";

break;

case '12': "Diciembre\n\n";

break;

default: "No existe mes para ese numero!!";

break;

}

return 0;

}

bassily
2016-03-26 14:51:25

sebastian. encontre la solucion, pero, con stdio.h ya que no me manejo con iostream.

aqui te muestro mi solucion



#include <stdio.h>

int main(){
    int a, b, c;

    printf("Este Programa muestra un mes segun su numero entero con la funcion switch\n\n");
    printf("ingrese Numero del mes a visualizar: ");
    scanf("%d",&a);
    switch (a){
        case  1 : puts("Enero");
        break;
        case  2 : puts("Febrero");
        break;
        case  3 : puts("Marzo");
        break;
        case  4 : puts("Abril");
        break;
        case  5 : puts("Mayo");
        break;
        case  6 : puts("Junio");
        break;
        case  7 : puts("Julio");
        break;
        case  8 : puts("Agosto");
        break;
        case  9 : puts("Septiembre");
        break;
        case  10 : puts("Octubre");
        break;
        case  11 : puts("Noviembre");
        break;
        case  12 : puts("Diciembre");
        break;

        default: puts("No existe mes para ese numero!!");



        }

    return 0;

}

Boris Mill
2016-08-12 14:50:41

Tengo una duda urgente.

Hay veces que en una funcion no me ejecuta los "else".

Tendrán alguna idea de por qué?

Es que necesito ordenar una lista y la funcion nunca entra en el else.

Gracias!!

Salvador Pozo
2016-08-12 17:29:49

Hola, Boris:

Lo primero que se me ocurre es que no hayas usado una expresión booleana para el "if". Asegúrate de que no has usado el operador de asignación (=) en lugar del de igualdad (==).

Hasta pronto

marcos
2017-01-13 18:41:16

Hola gracias por el curso nos es de mucha ayuda a los que estamos empezando en esto de la programación. Tengo una duda con respecto al segundo ejemplo de la estructura de control Switch: deberiamos declarar la variable numero que va dentro del switch para que nuestro programa corra bien o simplemente podemos poner cualquier expresion dentro del switch gracias por la respuesta.

Steven R. Davidson
2017-01-17 18:19:38

Hola Marcos,

El ejemplo no está completo, ya que falta la declaración de 'numero'. Sólo queríamos exponer la lógica de 'switch/case' analizando algunos valores de 'numero'. En general, 'switch' espera una expresión, por lo que puedes pasar un valor directamente o uno a calcular.

Espero haber aclarado la duda.

Steven

Angeles C
2017-03-01 20:19:39

Disculpa, como puedo introducir una cadena de caracteres y validarla con un if...else ?

Steven R. Davidson
2017-03-13 00:04:56

Hola Ángeles,

Si tienes un array de 'char', en C++, puedes usar 'cin >>' para extraer una cadena y copiarla a tal array. Por ejemplo,

char szCadena[32] = "";

cin >> szCadena;

Para validar la cadena, tienes que comprobar carácter a carácter. También puedes usar la función estándar, 'strcmp()', en <cstring>. Esto es,

if( strcmp(szCadena,"hola") == 0 )
{
  // Ambas cadenas son iguales
  ...
}
else  // Las cadenas son diferencias
{
  ...
}

Para más información acerca de mostrar cadenas a la pantalla y leerlas del teclado, consulta los ejemplos del capítulo 6 yendo a: http://c.conclase.net/curso/?cap=006p#resueltos1_6

Espero que esto te oriente,

Steven