3.-Control de Flujo
3.-Control de Flujo
3.-Control de Flujo
-CONTROL DE FLUJO
1.-INTRODUCCIÓN A LAS ESTRUCTURAS DE
CONTROL DE FLUJO
Las estructuras de control de flujo en el lenguaje C son herramientas fundamentales que permiten
dirigir el camino que toma la ejecución de un programa. Estas estructuras determinan cómo y
cuándo se ejecutan ciertas partes del código en función de condiciones o la repetición de bloques
de código hasta que se cumpla una condición específica. Las estructuras de control de flujo se
dividen principalmente en tres categorías: decisiones, bucles y control de salto.
Decisiones: Permiten que el programa tome decisiones y ejecute bloques de código específicos
basándose en ciertas condiciones. Las estructuras de decisión en C incluyen:
if : Ejecuta un bloque de código si, y solo si, una condición específica es verdadera.
switch : Facilita la selección entre múltiples alternativas basándose en el valor de una variable,
simplificando múltiples if-else anidados cuando se trata de comparar la misma variable contra
diferentes valores.
Bucles (Ciclos): Facilitan la ejecución repetida de un bloque de código mientras se cumpla una
Bucles (Ciclos): Facilitan la ejecución repetida de un bloque de código mientras se cumpla una
condición determinada. Existen tres tipos principales de bucles en C:
while : Ejecuta un bloque de código repetidamente mientras una condición específica sea
verdadera.
do-while : Similar al bucle while , pero garantiza que el bloque de código se ejecute al menos una
vez, ya que la condición se evalúa al final del bucle.
break : Termina inmediatamente el bucle más interno ( for , while , o do-while ) o la instrucción
switch en la que se encuentra, trasladando el control a la instrucción siguiente a este bloque.
continue : Omite las instrucciones restantes dentro del ciclo actual del bucle más cercano ( for ,
while , o do-while ) y procede con la próxima iteración del bucle.
goto : Transfiere el control a una parte específica del programa indicada por una etiqueta. Aunque
es poderoso, su uso es generalmente desaconsejado debido a que puede hacer el código más
difícil de leer y mantener.
En C, la condición dentro de los paréntesis se evalúa. Si el resultado es distinto de cero (lo que se
considera verdadero en C), el bloque de código dentro de las llaves se ejecuta. Si la condición es
cero (considerada falsa), el bloque de código se omite.
EJEMPLO
#include <stdio.h> void app_main() { int numero = 5; if (numero > 0) { printf("El número
es positivo.\n"); } }
En este programa, se declara una variable numero con el valor 5 . La sentencia condicional if
verifica si numero es mayor que 0 . Dado que 5 es mayor que 0 , la condición se evalúa como
verdadera, por lo que el programa ejecuta la instrucción dentro del bloque if , imprimiendo en la
consola el mensaje "El número es positivo." .
EJEMPLO
Este programa comienza incluyendo el archivo de cabecera stdio.h , necesario para las funciones
de entrada/salida como printf y scanf . Luego, declara una variable entera numero para
almacenar el número que el usuario ingresará.
Utiliza printf para solicitar al usuario que ingrese un número y scanf para leer el número
ingresado desde la entrada estándar (teclado), almacenando el valor en la variable numero .
Después, con la sentencia if , verifica si el valor de numero es menor que 0 . Si esta condición se
cumple, significa que el número es negativo, y el programa imprime el mensaje "El número es
negativo." utilizando printf . Si el número es cero o positivo, el programa termina sin imprimir
ningún mensaje adicional.
3.- CONDICIONAL DOBLE Y MULTIPLE(ESCALERA)
EJEMPLO
En este programa, primero se solicita al usuario que ingrese un número. Luego, el programa utiliza
la operación de módulo ( % ) para determinar el residuo de dividir numero por 2 . Si el residuo es
0 , significa que el número es par y el programa imprime "El número es par.". Si el residuo no es
0 , entonces el número es impar, y el programa imprime "El número es impar.".
EJEMPLO
Cualquier valor diferente que cero es considerado true
Esta estructura permite evaluar múltiples condiciones de forma secuencial. Primero se evalúa
Esta estructura permite evaluar múltiples condiciones de forma secuencial. Primero se evalúa
condicion1 ; si es verdadera, se ejecuta el bloque de código asociado y se ignoran las demás
condiciones. Si condicion1 es falsa, se evalúa condicion2 , y así sucesivamente. Si ninguna de las
condiciones especificadas es verdadera, se ejecuta el bloque de código en la sección else al final
de la escalera de "if". Esto permite manejar múltiples casos de manera ordenada y eficiente.
EJEMPLO
switch (expresion) { case constante1: // Bloque de código para constante1 break; case
constante2: // Bloque de código para constante2 break; ... default: // Bloque de código
por defecto break; }
Donde:
expresion: Es una expresión que se evalúa una vez. El resultado de la expresión se compara con los
valores de cada case .
case: Se utiliza para definir un bloque de código que se ejecuta solo si el resultado de la expresión
coincide con el valor de ese case . Puede haber tantas sentencias case como sea necesario.
coincide con el valor de ese case . Puede haber tantas sentencias case como sea necesario.
break: Se utiliza al final de cada bloque de case para terminar la ejecución del bloque de código
del switch y continuar con la ejecución del código que sigue después del switch . Sin break , la
ejecución continuaría con el siguiente bloque de case , lo cual se conoce como "fall through".
default: Este bloque de código es opcional y se ejecuta si ninguno de los case coincide con la
expresión. Es similar a la cláusula else en una estructura condicional if-else .
#include <stdio.h> void app_main() { char grado = 'B'; switch (grado) { case 'A':
printf("Excelente\n"); break; case 'B': printf("Muy bien\n"); break; case 'C':
printf("Bien\n"); break; case 'D': printf("Pasaste\n"); break; case 'F': printf("Mejor
intenta de nuevo\n"); break; default: printf("Grado inválido\n"); } }
EJERCICIO 1.- Crear un programa que reciba temperatura corporal (mediante el puerto serial) de un
a persona y encienda un led rojo si tiene fiebre, encienda un led verde si no tiene fiebre. Nota
temperatura mayor a 37 fiebre
OPERADOR ++ EN EL LENGUAJE C
El operador ++ en C es conocido como el operador de incremento. Su propósito es aumentar en
uno el valor de la variable a la que se aplica. Este operador puede usarse de dos maneras: como
prefijo ( ++var ) y como sufijo ( var++ ), y aunque ambos incrementan la variable en uno, su
comportamiento difiere ligeramente cuando se utilizan en expresiones.
int a = 5; int b = ++a; // Aquí, 'a' se incrementa a 6 antes de asignarse a 'b', por lo
tanto, 'b' también es 6.
int a = 5; int b = a++; // Aquí, el valor original de 'a' (5) se asigna a 'b'. Después
de esa asignación, 'a' se incrementa a 6.
ESTRUCTURA WHILE
La estructura while en C es una sentencia de control de flujo que permite ejecutar repetidamente
un bloque de código mientras una condición dada sea verdadera. La sintaxis básica de un bucle
while es la siguiente:
Donde:
condicion: Es una expresión que se evalúa antes de cada iteración del bucle. Si la condición se
evalúa como verdadera (es decir, cualquier valor distinto de cero), el bloque de código dentro del
bucle se ejecuta. Si la condición se evalúa como falsa (es decir, cero), la ejecución del programa
bucle se ejecuta. Si la condición se evalúa como falsa (es decir, cero), la ejecución del programa
continúa con la primera instrucción después del bloque del bucle while .
Es fundamental asegurar que la condición eventualmente se vuelva falsa. De lo contrario, el bucle
se convertirá en un bucle infinito, lo que significa que el bloque de código dentro del while se
ejecutará indefinidamente.
EJERCICIO 2 Escribir un programa que reciba un numero por el puerto serial y realice parpadeos de
un led cada segundo. La cantidad de parpadeos es igual el numero ingresado
Donde:
inicialización: Se ejecuta una sola vez antes de la primera iteración del bucle. Generalmente se
utiliza para inicializar la variable de control del bucle.
condición: Antes de cada iteración, se evalúa esta expresión. Si la condición se evalúa como
verdadera (distinta de cero), el bucle continúa y se ejecuta el bloque de código. Si la condición es
falsa (cero), el bucle termina y continúa la ejecución con la instrucción siguiente al
falsa (cero), el bucle termina y continúa la ejecución con la instrucción siguiente al for .
incremento: Se ejecuta después de cada iteración del bucle. Suele utilizarse para actualizar la
variable de control del bucle. Esta expresión puede incrementar o decrementar una variable, o
cambiar el estado del bucle de alguna otra manera para eventualmente hacer que la condición sea
falsa y terminar el bucle.
En este ejemplo, el bucle for se utiliza para imprimir los números del 0 al 4. La variable de control
i se inicializa en 0, y la condición para continuar el bucle es que i sea menor que 5. Después de
cada iteración, i se incrementa en 1 gracias a la expresión de incremento i++ . Una vez que i
alcanza 5, la condición se evalúa como falsa, y el bucle termina.
EJEMPLO
La operación de actualización puede ser un decremento como en el siguiente código:
#include <stdio.h> void app_main() { for (int a = 2; a >= 0; a--) { printf("Dentro del
bucle for, a = %d \n",a); } printf("Fuera del bucle for\n"); }
EJEMPLO
La variable definida en la parte de inicialización del bucle for no es accesible fuera del cuerpo del
bucle for.
bucle for.
EJEMPLO
Una variable local fuera de la estructura del bucle for puede ser utilizada como índice de conteo
como en el Código siguiente:
EEJEMPLO
La parte de inicialización del bucle for puede escribirse fuera de la estructura del bucle for, como en
el Código siguiente:
EJEMPLO
En el Código siguiente, tanto la parte de inicialización como la de actualización del bucle for se
escriben fuera del encabezado del bucle for.
EJEMPLO
Más de una variable puede ser utilizada en el encabezado del bucle for.
EJEMPLO
En este ejemplo, se utiliza el OR lógico || en la parte condicional del bucle for.
EJEMPLO
El operador lógico && produce falso si uno de los operandos se evalúa como falso.
Este código ilustra cómo el bucle for se detiene cuando cualquiera de las condiciones ( a < 3 y b
< 785 ) deja de ser verdadera. El bucle incrementa a en 1 y b en 2 en cada iteración, lo que
significa que el bucle se detendrá tan pronto como a alcance 3, ya que esta condición se cumplirá
antes de que b alcance 785, demostrando así el funcionamiento del operador lógico AND ( && ): el
bucle se detiene cuando al menos una de las condiciones se evalúa como falsa.
EJEMPLO
Se puede crear un bucle infinito utilizando la estructura en el Código siguinete:
EJEMPLO
En este ejemplo, utilizamos la instrucción continue en un bucle for .
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" void
app_main() { for(int a = 0; a < 7; a++) { if(a == 3) continue; printf("a=%d \n", a); } }
Cuando a==3 , la función printf() no se ejecuta, y la ejecución del programa regresa al inicio del
bucle. Esto significa que en el momento en que a es igual a 3, el bucle omitirá las instrucciones
restantes dentro de su cuerpo (en este caso, la llamada a printf() ) y procederá inmediatamente a
la siguiente iteración del bucle, incrementando a y evaluando la condición del bucle nuevamente.
Como resultado, el número 3 no se imprimirá, pero se continuarán imprimiendo los demás
números de 0 a 6, excluyendo el 3.
EJEMPLO
En este ejemplo, utilizamos la instrucción continue en un bucle while .
Cuando a==3 , el resto del código no se ejecuta, y la ejecución del programa regresa al inicio del
bucle. Esto significa que después de incrementar a a 3 y ejecutar las instrucciones hasta el
continue , el bucle while omitirá las instrucciones restantes en su cuerpo y continuará con la
siguiente iteración. En este caso, implica que después de imprimir que la instrucción continue se
ha ejecutado y que se omite la parte inferior del bucle while , el control regresa al inicio del bucle
while para evaluar su condición con el valor actualizado de a . Como resultado, ciertas partes del
para evaluar su condición con el valor actualizado de . Como resultado, ciertas partes del
código se omiten cuando a es igual a 3, demostrando cómo la instrucción continue puede
alterar el flujo de control dentro de un bucle.
SENTENCIA BREAK
La instrucción break se utiliza para salir del bucle cuando se cumple una condición.
El uso de la instrucción break en el bucle while se ilustra en la Figura siguiente:
EJEMPLO
En este ejemplo, utilizamos la instrucción break dentro de un bucle while .
En este código, el bucle while se ejecuta indefinidamente debido a que su condición es siempre
verdadera ( while(1) ). Sin embargo, dentro del bucle, la variable a se incrementa en 2 en cada
iteración. Cuando a supera el valor de 8, la instrucción break se ejecuta, lo que causa que el bucle
se termine de inmediato. Después de salir del bucle, se imprime el valor de a fuera del bucle,
demostrando que el programa continúa su ejecución después del bucle while . Este patrón es útil
en situaciones donde se necesita ejecutar un bucle hasta que se cumpla una condición específica,
que puede no ser conocida antes de entrar al bucle.
EJEMPLO
Break dentro de un bucle for:
En este código, se utiliza un bucle for para iterar desde 0 hasta 6 (inclusive), con la variable a
sirviendo como contador. La instrucción if dentro del bucle verifica si a es igual a 3. Si esta
condición se cumple, el programa imprime un mensaje indicando que se va a salir del bucle for
condición se cumple, el programa imprime un mensaje indicando que se va a salir del bucle
debido a la ejecución de la instrucción break , y luego sale del bucle. Si a no es igual a 3, el
programa imprime el valor actual de a dentro del bucle. Después de salir del bucle (ya sea
naturalmente después de alcanzar el final de las iteraciones o debido a la instrucción break ), se
imprime el valor de a fuera del bucle for .
ANIDACIÓN EN FOR
Los bucles for pueden utilizarse de manera anidada, lo que significa que un bucle for puede
contener dentro de su cuerpo otro bucle for . Esta estructura permite realizar tareas que requieren
iteraciones dentro de otras iteraciones, como procesar los elementos de matrices
multidimensionales o generar combinaciones de valores. La estructura básica de los bucles for
anidados se muestra a continuación:
Donde:
init1 , condition1 , y update1 son la inicialización, la condición de continuación, y la
actualización para el bucle externo, respectivamente.
actualización para el bucle externo, respectivamente.
init2 , condition2 , y update2 son la inicialización, la condición de continuación, y la
actualización para el bucle interno, respectivamente.
Ejemplo práctico:
Supongamos que queremos imprimir una tabla de multiplicar de 2x3, podríamos hacerlo con
bucles for anidados de la siguiente manera:
Este código imprimirá la tabla de multiplicar para los números 1 y 2, mostrando los productos de 1
y 2 por los números 1, 2, y 3 en formato de tabla.
while(condition1) // Bucle externo { // Instrucciones del bucle externo antes del bucle
interno while(condition2) // Bucle interno { // Instrucciones del bucle interno } // Ins
trucciones del bucle externo después del bucle interno }
Donde condition1 es la condición que controla el bucle externo y condition2 es la condición que
controla el bucle interno.
Ejemplo práctico:
Supongamos que queremos imprimir los números del 1 al 3 en tres filas, usando bucles while
anidados. Aquí hay un ejemplo de cómo podríamos hacerlo:
Este código imprimirá tres filas de números, con cada fila conteniendo los números del 1 al 3. Los
bucles while anidados son especialmente útiles cuando el número de iteraciones de los bucles
internos depende de los valores o condiciones establecidas en el bucle externo.
EJERCICIO 1
Secuencia de LEDs
Objetivo: Crear una secuencia de encendido y apagado de LEDs utilizando un bucle for .
Materiales:
ESP32
4 LEDs
Resistencias de 220 ohmios
Resistencias de 220 ohmios
Cables de conexión
Descripción:
Conecta los LEDs a diferentes pines GPIO del ESP32 a través de resistencias. Utiliza un bucle for
para encender cada LED secuencialmente durante 500 ms y luego apagarlo antes de pasar al
siguiente LED.
EJERCICIO 3.
Sistema de Menú con LEDs y Botón
Objetivo: Implementar un sistema de menú simple que use un botón para navegar por diferentes
opciones indicadas por LEDs.
Materiales:
ESP32
4 LEDs (cada uno representa una opción de menú diferente)
4 LEDs (cada uno representa una opción de menú diferente)
1 botón
Resistencias de 220 ohmios para los LEDs
Descripción:
Cada presión del botón avanza al siguiente LED (opción de menú).
Al llegar al último LED, la siguiente presión vuelve al primer LED.
Solo un LED debe estar encendido a la vez, indicando la opción de menú actual.