Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

doc:demo:ud:prg_ejm:inicio [2026/01/16 12:31] – ↷ Página movida de demo:ud:prg_ejm:inicio a doc:demo:ud:prg_ejm:inicio fepgdoc:demo:ud:prg_ejm:inicio [Fecha desconocida] (actual) – editor externo (Fecha desconocida) 127.0.0.1
Línea 1: Línea 1:
 +====== 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 =====
 +
 +<grid>
 +<col xs="12" md="6">
 +**Diagrama de flujo**
 +
 +{{ doc:demo:ud:prg_ejm:ordino_if.png?nolink |}}
 +</col>
 +<col xs="12" md="6">
 +**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**
 +<code>
 +if (expresión_lógica) {
 +    bloque_de_instrucciones;
 +}
 +</code>
 +</col>
 +</grid>
 +
 +{{:ico:ejemplo.png?nolink|}} //Ejemplo//
 +
 +<file c>
 +if (edad > 18) {
 +   printf("ADULTO");
 +   precioEntrada = 20;
 +}
 +</file>
 +
 +
 +==== Estructura de control if-else ====
 +
 +<grid>
 +<col xs="12" md="6">
 +**Diagrama de flujo**
 +
 +{{ doc:demo:ud:prg_ejm:ordino_ifelse.png?nolink |}}
 +</col>
 +<col xs="12" md="6">
 +**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**
 +<code>
 +if (expresión_lógica) {
 +    bloque_instrucciones_1;
 +} else {
 +    bloque_instrucciones_2;
 +}
 +</code>
 +</col>
 +</grid>
 +
 +{{:ico:ejemplo.png?nolink|}} //Ejemplo//
 +
 +<file c>
 +if (a > b) {
 +   printf("A es mayor que B");
 +} else {
 +   printf("A es menor o igual a B");
 +}
 +</file>
 +
 +
 +==== Estructura de control if anidada ====
 +
 +<grid>
 +<col xs="12" md="6">
 +**Diagrama de flujo**
 +
 +{{ doc:demo:ud:prg_ejm:ordino_ifnido.png?nolink |}}
 +</col>
 +<col xs="12" md="6">
 +**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**
 +<code>
 +if (expresión_lógica_1) {
 +    bloque_instrucciones_1;
 +} else if(expresión_lógica_2){
 +    bloque_instrucciones_2;
 +} else {
 +    bloque_instrucciones_3;
 +}
 +</code>
 +</col>
 +</grid>
 +
 +{{:ico:ejemplo.png?nolink|}} //Ejemplo 1 de código//. Programa de condiciones anidadas.
 +<file c ejemplo_nido1.c>
 +#include <stdio.h>
 +
 +int main(void) {
 +   int nota; //Variable para almacenar la nota
 +
 +   printf("Introduzca una nota numerica para el alumno: (0-10) \n");
 +   scanf("%i", &nota);
 +
 +   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;
 +}
 +</file>
 +
 +{{:ico:ejemplo.png?nolink|}} //Ejemplo 2 de código//. Programa de condiciones anidadas y no anidadas.
 +<file c ejemplo_nido2.c>
 +/*
 +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 <stdio.h>
 +
 +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;
 +}
 +</file>
 +
 +<well>
 +{{: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''.
 +</well>
 +
 +===== Estructura de control switch =====
 +
 +<grid>
 +<col xs="12" md="6">
 +**Diagrama de flujo**
 +
 +{{ doc:demo:ud:prg_ejm:ordino_switch.png?nolink |}}
 +</col>
 +<col xs="12" md="6">
 +**Comportamiento**
 +
 +Estructura de selección múltiple a partir de una variable selectora.
 +
 +**Sintaxis**
 +<code>
 +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;
 +  }
 +</code>
 +</col>
 +</grid>
 +
 +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|}}  <button collapse="ejm_switch1" type="success" size="sm">Ejemplo 1 de código</button> Programa que muestra el nombre de un polígono en función del número de lados, utilizando ''switch''.
 +
 +<collapse id="ejm_switch1" collapsed="true">
 +<file c ejemplo_switch1.c>
 +#include <stdio.h>
 +
 +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;
 +}
 +</file>
 +</collapse>
 +
 +{{:ico:ejemplo.png?nolink|}}  <button collapse="ejm_switch2" type="success" size="sm">Ejemplo 2 de código</button> Programa para mostrar si una letra introducida por teclado es una vocal, utilizando ''switch''.
 +
 +<collapse id="ejm_switch2" collapsed="true">
 +<file c ejemplo_switch2.c>
 +#include <stdio.h>
 +
 +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;
 +}
 +</file>
 +</collapse>
 +
 +<well>
 +{{: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.
 +
 +<button collapse="ejercicio02" type="warning" size="sm">Respuesta</button>
 +
 +<collapse id="ejercicio02" collapsed="true">
 +
 +a) No funciona, pues 'a' y 'A' son diferentes caracteres.
 +
 +b) Una posible solución sería:
 +
 +<file c ejemplo_switch2b.c>
 +#include <stdio.h>
 +
 +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;
 +}
 +</file>
 +</collapse>
 +</well>
 +