====== Estructuras de control alternativas ======
También llamadas de **selección** o **condicionales**. Alteran la secuencia de ejecución según el resultado de evaluar una expresión.
===== Estructura de control if =====
**Diagrama de flujo**
{{ demo:ud:prg_ejm:ordino_if.png?nolink |}}
**Comportamiento**
Se evalúa la expresión lógica contenida entre paréntesis.
* Si es verdadera se ejecutan las sentencias.
* Si es falsa se continua con la siguiente instrucción.
**Sintaxis**
if (expresión_lógica) {
bloque_de_instrucciones;
}
{{:ico:ejemplo.png?nolink|}} //Ejemplo//
if (edad > 18) {
printf("ADULTO");
precioEntrada = 20;
}
==== Estructura de control if-else ====
**Diagrama de flujo**
{{ demo:ud:prg_ejm:ordino_ifelse.png?nolink |}}
**Comportamiento**
Se evalúa la expresión lógica contenida entre paréntesis.
* Si es verdadera se ejecuta el bloque de código asociado a ''if''.
* Si es falsa se ejecuta el bloque de código asociado a ''else''.
**Sintaxis**
if (expresión_lógica) {
bloque_instrucciones_1;
} else {
bloque_instrucciones_2;
}
{{:ico:ejemplo.png?nolink|}} //Ejemplo//
if (a > b) {
printf("A es mayor que B");
} else {
printf("A es menor o igual a B");
}
==== Estructura de control if anidada ====
**Diagrama de flujo**
{{ demo:ud:prg_ejm:ordino_ifnido.png?nolink |}}
**Comportamiento**
* Representan diferentes ejecuciones alternativas y mutuamente exclusivas.
* En caso de que todas las expresiones lógicas sean falsas se ejecutará el último bloque.
**Sintaxis**
if (expresión_lógica_1) {
bloque_instrucciones_1;
} else if(expresión_lógica_2){
bloque_instrucciones_2;
} else {
bloque_instrucciones_3;
}
{{:ico:ejemplo.png?nolink|}} //Ejemplo 1 de código//. Programa de condiciones anidadas.
#include
int main(void) {
int nota; //Variable para almacenar la nota
printf("Introduzca una nota numerica para el alumno: (0-10) \n");
scanf("%i", ¬a);
if ((nota >= 0) && (nota < 5)) { // Alternativa 1
printf("El alumno ha suspendido \n");
} else if (nota <= 10) { // Alternativa 2
printf("El alumno ha aprobado \n");
} else { // Alternativa por defecto
printf("La nota introducida es incorrecta. \n");
printf("Rango valido 0 - 10 \n");
}
return 0;
}
{{:ico:ejemplo.png?nolink|}} //Ejemplo 2 de código//. Programa de condiciones anidadas y no anidadas.
/*
En este ejemplo:
* El Bloque 1 y el Bloque 2 son excluyentes: Si se ejecuta uno el otro no.
* Los Bloques 3 y 4 son no excluyentes, ejecutándose siempre.
*/
#include
int main(void) {
int num1, num2;
printf("Introduzca el valor de los números: num1 y num2 \n");
scanf("%d", &num1);
scanf("%d", &num2);
if (num1 > num2) {
printf("Bloque 1: num1 es mayor que num2 \n");
num2 = num2+10;
printf("Bloque 1: Ahora num1 vale %d y num2 vale %d \n", num1, num2);
} else if (num2 > num1) {
printf("Bloque 2: num2 es mayor que num1 \n");
num1 = num1+10;
printf("Bloque 2: Ahora num1 vale %d y num2 vale %d \n", num1, num2);
}
if (num1 > num2) {
printf("Bloque 3: num1 es mayor que num2 \n");
num2 = num2+10;
printf("Bloque 3: Ahora num1 vale %d y num2 vale %d \n", num1, num2);
}
if (num2 > num1) {
printf("Bloque 4: num2 es mayor que num1 \n");
num1 = num1+10;
printf("Bloque 4: Ahora num1 vale %d y num2 vale %d \n", num1, num2);
}
return 0;
}
{{:ico:actividad.gif?nolink|}} //Ejercicio propuesto//
Analiza el funcionamiento del programa del ejemplo 2 anterior e indica las condiciones que se tienen que dar para que:
* a) Solo se ejecuten el Bloque1 y el Bloque3.
* b) Solo se ejecuten el Bloque1 y el Bloque4.
Pon en cada caso un ejemplo de valor para ''num1'' y para ''num2''.
{{:ico:respuesta.png?nolink|}} //Respuesta//
* En el caso (a), ''num1'' debe ser mayor que ''num2'' al menos en 20 unidades. Ejemplo: ''num1=21'' y ''num2=1''.
* En el caso (b), ''num1'' debe ser mayor que ''num2'' como mucho en 9 unidades. Ejemplo: ''num1=21'' y ''num2=20''.
===== Estructura de control switch =====
**Diagrama de flujo**
{{ demo:ud:prg_ejm:ordino_switch.png?nolink |}}
**Comportamiento**
Estructura de selección múltiple a partir de una variable selectora.
**Sintaxis**
switch (selector) {
case valor_1:
bloque_instrucciones_1;
break;
case valor_2:
bloque_instrucciones_2;
break;
...
case valor_n:
bloque_instrucciones_n;
break;
default:
bloque_instrucciones_defecto;
}
El **selector** debe ser una variable o expresión de tipo entera, lógica o carácter. No puede ser una expresión real.
Al finalizar cada bloque se debe incluir la instrucción ''break''.
* El efecto de la instrucción es dar por terminada la ejecución de la instrucción ''switch''.
* Si se omite la instrucción ''break'', se ejecutarán todas las instrucciones del ''switch'' a partir de ese punto, hasta encontrar una nueva instrucción ''break''.
Bloque ''default'': Si el valor de la variable selectora no coincide con el valor de algún bloque, se ejecuta el bloque por defecto o ''default'' si existiese.
{{:ico:ejemplo.png?nolink|}} Programa que muestra el nombre de un polígono en función del número de lados, utilizando ''switch''.
#include
int main(void) {
int numeroLados; //Variable para almacenar el valor
scanf("%i", &numeroLados); //Se lee el número de lados
switch (numeroLados) { //La variable es el selector
case 0: case 1: case 2: //Varios posibles valores agrupados
printf("no es un poligono");
break;
case 3:
printf("triangulo");
break;
case 4:
printf("rectangulo");
break;
case 5:
printf("pentagono");
}
return 0;
}
{{:ico:ejemplo.png?nolink|}} Programa para mostrar si una letra introducida por teclado es una vocal, utilizando ''switch''.
#include
int main(void) {
char c; //Se define la variable
scanf("%c",&c); // Se lee la variable
switch (c) {
case 'A':
printf("vocal A");
break;
case 'E':
printf("vocal E");
break;
case 'I':
printf("vocal I");
break;
case 'O':
printf("vocal O");
break;
case 'U':
printf("vocal U");
break;
default: //Bloque que se ejecuta si no coincide ningún valor
printf("consonante");
}
return 0;
}
{{:ico:actividad.gif?nolink|}} //Ejercicio propuesto//
Analiza el funcionamiento del programa del ejemplo 2 anterior y contesta:
* a) Comprueba si funciona para las vocales minúsculas. ¿Porqué?.
* b) Modifica el programa para que funcione tanto para minúsculas como para mayúsculas.
a) No funciona, pues 'a' y 'A' son diferentes caracteres.
b) Una posible solución sería:
#include
int main(void) {
char c; //Se define la variable
scanf("%c",&c); // Se lee la variable
switch (c) {
case 'a': case 'A':
printf ("vocal A");
break;
case 'e': case 'E':
printf ("vocal E");
break;
case 'i': case 'I':
printf ("vocal I");
break;
case 'o': case 'O':
printf ("vocal O");
break;
case 'u': case 'U':
printf ("vocal U");
break;
default: //Bloque que se ejecuta si no coincide ningún valor
printf ("consonante");
}
return 0;
}