Control de Flujo
## Objetivos de Aprendizaje
- Usar sentencias condicionales (if-else, switch)
- Implementar bucles (for, while)
- Controlar la ejecucion de bucles (break, continue)
- Manejar errores apropiadamente
## Sentencias Condicionales
### Sentencia if
```matlab
x = 10;
if x > 0
disp('x es positivo');
end
```
### Sentencia if-else
```matlab
x = -5;
if x >= 0
disp('x es no negativo');
else
disp('x es negativo');
end
```
### Sentencia if-elseif-else
```matlab
puntuacion = 85;
if puntuacion >= 90
nota = 'A';
elseif puntuacion >= 80
nota = 'B';
elseif puntuacion >= 70
nota = 'C';
elseif puntuacion >= 60
nota = 'D';
else
nota = 'F';
end
disp(nota); % 'B'
```
### Sentencias if Anidadas
```matlab
x = 10;
y = 20;
if x > 0
if y > 0
disp('x e y son positivos');
else
disp('x positivo, y no positivo');
end
else
disp('x no es positivo');
end
```
## Sentencia switch
### switch Basico
```matlab
dia = 'Lunes';
switch dia
case 'Lunes'
disp('Inicio de semana laboral');
case 'Viernes'
disp('Fin de semana laboral');
case {'Sabado', 'Domingo'}
disp('Fin de semana!');
otherwise
disp('Dia regular');
end
```
### Multiples Valores por Caso
```matlab
mes = 2;
switch mes
case {1, 3, 5, 7, 8, 10, 12}
dias = 31;
case {4, 6, 9, 11}
dias = 30;
case 2
dias = 28;
end
```
### switch vs if-else
```matlab
% switch es souvent plus propre pour les valeurs discretes
% if-else est meilleur pour les plages ou les conditions complexes
% Exemple avec plages (if-else est mieux)
valor = 75;
if valor >= 90
resultado = 'A';
elseif valor >= 80
resultado = 'B';
else
resultado = 'C';
end
```
## Bucles for
### Bucle for Basico
```matlab
% Recorrer un rango
for i = 1:5
fprintf('i = %d\n', i);
end
```
### Recorrer un Arreglo
```matlab
arr = [10, 20, 30, 40, 50];
suma = 0;
for val = arr
suma = suma + val;
end
disp(suma); % 150
```
### Bucles for Anidados
```matlab
% Imprimir tabla de multiplicar
for i = 1:5
fila = '';
for j = 1:5
fila = [fila, sprintf('%4d', i*j)];
end
disp(fila);
end
```
### Bucle con Paso
```matlab
% Numeros pares del 2 al 10
for i = 2:2:10
disp(i); % 2, 4, 6, 8, 10
end
% Hacia atras
for i = 10:-1:1
disp(i); % 10, 9, 8, ..., 1
end
```
### Variaciones del Indice del Bucle
```matlab
A = [1, 2, 3; 4, 5, 6];
% Recorrer indices de fila y columna
[m, n] = size(A);
for i = 1:m
for j = 1:n
fprintf('A(%d,%d) = %d\n', i, j, A(i,j));
end
end
```
## Bucles while
### Bucle while Basico
```matlab
contador = 0;
while contador < 5
disp(contador);
contador = contador + 1;
end
```
### while con Condicion
```matlab
% Encontrar primera potencia de 2 mayor que 1000
valor = 1;
while valor <= 1000
valor = valor * 2;
end
disp(valor); % 1024
```
### Prevencion de Bucles Infinitos
```matlab
% Siempre asegurar que la condicion del bucle sera falsa eventualmente
maxIteraciones = 100;
contador = 0;
x = 1;
while abs(x) > 1e-10 && contador < maxIteraciones
x = x / 2;
contador = contador + 1;
end
if contador == maxIteraciones
disp('Maximo de iteraciones alcanzado');
end
```
## break y continue
### Sentencia break
```matlab
% Encontrar primer numero par en un arreglo
arr = [1, 3, 5, 7, 8, 9, 10];
for val = arr
if mod(val, 2) == 0
disp(['Primer par: ', num2str(val)]);
break;
end
end
```
### Sentencia continue
```matlab
% Imprimir solo numeros impares
for i = 1:10
if mod(i, 2) == 0
continue; % Saltar numeros pares
end
disp(i); % 1, 3, 5, 7, 9
end
```
### break vs continue
```matlab
% break - sale del bucle completamente
% continue - salta a la siguiente iteracion
```
## Ejemplos de Control de Bucles
### Sumar Hasta Condicion
```matlab
% Sumar elementos de arreglo hasta que la suma exceda 100
arr = [10, 20, 30, 40, 50, 60];
suma = 0;
for i = 1:length(arr)
suma = suma + arr(i);
if suma > 100
break;
end
end
fprintf('Suma: %d, Elementos usados: %d\n', suma, i);
```
### Saltar Valores Invalidos
```matlab
% Procesar solo valores positivos
data = [-5, 10, -3, 20, -1, 30];
sumaValida = 0;
for val = data
if val <= 0
continue;
end
sumaValida = sumaValida + val;
end
disp(sumaValida); % 60
```
## Vectorizacion (Alternativa a los Bucles)
### Reemplazar Bucles con Operaciones Vectoriales
```matlab
% Lento: enfoque con bucle
n = 1000;
resultado = zeros(1, n);
for i = 1:n
resultado(i) = i^2;
end
% Rapido: enfoque vectorizado
resultado = (1:n).^2;
```
### Indexacion Logica
```matlab
% Encontrar elementos mayores que 5
arr = [1, 6, 3, 8, 2, 9];
% Enfoque con bucle
grandes = [];
for val = arr
if val > 5
grandes = [grandes, val];
end
end
% Enfoque vectorizado
grandes = arr(arr > 5);
```
## Manejo de Errores
### try-catch
```matlab
try
resultado = 10 / 0;
disp('Division exitosa');
catch ME
disp('Ocurrio un error:');
disp(ME.message);
end
```
### Multiples Bloques catch
```matlab
try
x = notAFunction();
catch ME
if strcmp(ME.identifier, 'MATLAB:UndefinedFunction')
disp('Funcion no encontrada');
else
disp(['Error: ', ME.message]);
end
end
```
## Resumen
- Usar `if-elseif-else` para logica condicional
- Usar `switch` para coincidencia de valores discretos
- Usar bucles `for` cuando se conoce el numero de iteraciones
- Usar bucles `while` cuando se necesita iteracion basada en condiciones
- Usar `break` para salir de bucles anticipadamente
- Usar `continue` para saltar iteraciones
- Preferir vectorizacion sobre bucles para mejor rendimiento
- Usar `try-catch` para manejo de errores
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →