Está en la página 1de 97

Universidad de Oviedo

FACULTAD DE CIENCIAS
TEMA 4. Esquemas de
Composición de Acciones

4.1 Introducción
4.2 Composición Secuencial de Acciones
4.3 Esquemas Condicionales

sentencias if, if/else, switch


4.4 Esquemas Iterativos
sentencias while, do until, for
4.5 Otras sentencias: break y continue

4.6 Propiedades de los programas


Universidad de Oviedo
FACULTAD DE CIENCIAS

Objetivos del tema


• Entender el funcionamiento de los esquemas de composición de
acciones secuencial, condicionales (if/else o switch) e
iterativos (while, for o do/until) y ser capaz de utilizarlos para
hacer programas sencillos

• Dominar la escritura de expresiones condicionales complejas


usando los operadores &&, || y !

• Ser capaz de diseñar algoritmos sencillos de tratamiento de tipos


de datos básicos (números, caracteres y valores lógicos) y de
codificarlos en un programa simple
Universidad de Oviedo
FACULTAD DE CIENCIAS
4.1 Introducción

 Los Esquemas de Composición de Acciones permiten crear


acciones compuestas a partir de otras
 Hay tres tipos de Esquemas

Secuencial
{ . . . }

Condicionales
if
if/else
switch

Iterativas
while
for
do until
Universidad de Oviedo
FACULTAD DE CIENCIAS

4.2 Composición Secuencial de Acciones

Sintaxis
{<acción-1> <acción-2> ... <acción-n>}

Semántica
Ejecución, una sola vez, de las acciones en el orden en el que están escritas

Diagrama de Flujo Estado


Inicial

acción-1

acción-n

Estado
Final
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejemplos de Esquemas Secuenciales

a=input(“Dame el valor de a”)


b=input(“Dame el valor de b”)
c=input(“Dame el valor de c”)
a = a + 7;
b = b – a;
c = c + 1;
printf(“El valor de a es %f, el de b es %f y el de c es %f”, a, b, c
);

¿Cuántas acciones tiene este


esquema secuencial?
Universidad de Oviedo
FACULTAD DE CIENCIAS Diseño de Esquemas Secuenciales

Ei Comp. Secuencial Ef

Descubrir los estados intermedios

Descubrir las acciones

Ei a1 E’ a2 E’’ ..... an Ef
Asegurar la coherencia Acción/Estado
Universidad de Oviedo
FACULTAD DE CIENCIAS Diseño de Esquemas Secuenciales

PROBLEMA: Escriba un algoritmo que reciba


Número como entrada dos números y produzca como
1 salida la suma de los mismos
Número
2 Número 1 Número 2 Suma
2 3 5
4 -1 3
Suma

Pseudocódigo
Lea número1
Lea número2
suma <- número1 + número2
Escriba un mensaje mostrando el valor de número1, el valor de
número2 y el resultado de realizar su suna
Universidad de Oviedo
FACULTAD DE CIENCIAS Diseño de Esquemas Secuenciales

PROBLEMA: Escriba un algoritmo que reciba


Número como entrada dos números y produzca como
1 salida la suma de los mismos
Número
2 Número 1 Número 2 Suma
2 3 5
4 -1 3
Suma

Implementación en Octave
x=input(“Dame un numero\n”)
y=input(“Dame otro numero\n”)
suma=x+y;
printf(“El valor de x es %f, el de y es %f y el de su suma es %f”, x,
y, suma);
Universidad de Oviedo
FACULTAD DE CIENCIAS
Diseño de Esquemas
Condicionales

PROBLEMA: Realizar un programa que,


reciba como entrada tres calificaciones
de un alumno, y, produzca como
Nota2 salida, la calificación final de dicho
Nota1 alumno

Nota3 Nota1 Nota2 Nota3 Calificación


7.5 3 4.2 4.9 - Suspenso
7.5 5 9 7.2 – Notable
2 9 9 6.6 - Aprobado
Calificación Final
Universidad de Oviedo
FACULTAD DE CIENCIAS
Diseño de Esquemas
Condicionales

PROBLEMA: Realizar un programa que, reciba como entrada tres calificaciones


de un alumno, y, produzca como salida, la calificación final de dicho alumno

Nota1 Nota2 Nota3 Calificación


7.5 3 4.2 4.9 - Suspenso ¿QUÉ TENEMOS
7.5 5 9 7.2 – Notable
2 9 9 6.6 - Aprobado
QUE HACER?

Escribimos la ETIQUETA
de la calificación:
Sumamos las tres notas Hallamos la media Suspenso, Aprobado,
Notable,
Sobresaliente
Universidad de Oviedo
FACULTAD DE CIENCIAS
Diseño de Esquemas
Condicionales

PROBLEMA: Realizar un programa que, reciba como entrada tres calificaciones


de un alumno, y, produzca como salida, la calificación final de dicho alumno

Hallamos la media: N N < 5 Escribimos: Suspenso


5 <= N < 7 Escribimos: Aprobado
Sumamos las tres notas
7 <= N < 9 Escribimos: Notable
9 <= N Escribimos: Sobresaliente

PSEUDOCÓDIGO
1. Leer las tres notas
2. Sumar los valores
3. Calcular la media (N)
4. Si N < 5 Entonces Escribimos “Suspenso”
5. Si 5 <= N < 7 Entonces Escribimos “Aprobado”
6. Si 7 <= N < 9 Entonces Escribimos “Notable”
7. Si N >= 9 Entonces Escribimos “Sobresaliente”
Universidad de Oviedo
FACULTAD DE CIENCIAS
Diseño de Esquemas
Condicionales

PROBLEMA: Realizar un programa que, reciba como entrada tres calificaciones


de un alumno, y, produzca como salida, la calificación final de dicho alumno

PSEUDOCÓDIGO. OTRA SOLUCIÓN


1. Leer las tres notas
2. Sumar los valores
3. Calcular la media (N)
4. Si N < 5 Entonces Escribimos “Suspenso”
5. SI NO, SI N <= 7 Entonces Escribimos “Aprobado”
6. SI NO, SI N <= 9 Entonces Escribimos “Notable”
7. SI NO Escribimos “Sobresaliente”

PROBLEMA: ¿QUÉ SOLUCIÓN ES MEJOR?


Universidad de Oviedo
FACULTAD DE CIENCIAS 4.3 Esquemas Condicionales

El Esquema Condicional if
if (<condición>) <acción>

El Esquema if/else
if (<condición>) <acción> else <acción>

El Esquema if/elseif/else
if (<condición>)
<acción>
elseif (<condición>)
<acción>
else
<acción>
Universidad de Oviedo
FACULTAD DE CIENCIAS
Diseño de Esquemas
Condicionales

Ei Esq. Condicional Ef

Deducir un conjunto de condiciones C1,...,Cn tales que en Ei


C1  ...  Cn = Verdadero
Cj  Ck = Falso, j  k
Asociar a cada condición la acción adecuada

Ei  Cj aj Ef

Asegurar la coherencia: Condición/Estado y Acción/Estado


Universidad de Oviedo
FACULTAD DE CIENCIAS El Esquema Condicional if

Sintaxis
if (<condición>) <acción> end
Semántica
Se evalúa la condición, si es cierta se ejecuta la acción y si es falsa,
nada.
Diagrama de Flujo Estado
Inicial

falso
condición

cierto

acción

Estado
Final
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Diseñe un algoritmo que lea dos números y diga si son iguales, o si el


primero es mayor/menor que el segundo. (Emplee IF)
Sabemos

Entrada: número 1, número 2

Salida: Mensaje indicando si son iguales o número 1 es mayor/menor que número 2.


Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Diseñe un algoritmo que lea dos números y diga si son iguales, o si el


primero es mayor/menor que el segundo. (Emplee IF)

x1=input(“\nEscribe el primer numero entero: ”);


x2=input(“\nEscribe el segundo numero entero: ”);
if (x1 == x2)
printf(“Los numeros son iguales\n”);
end
if (x1 > x2)
printf(“%f es mayor que %f\n”, x1, x2);
end
if (x1 < x2)
printf(“%f es menor que %f\n”, x1, x2);
end
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Diseñe un algoritmo que lea un número y muestre un mensaje


indicando si el número es par o si el número es impar. (Emplee IF)
Sabemos

Entrada: número

Salida: El número es par un mensaje indicando que lo es.

Un número es par si el resto de su división entre 2 es 0.


mod(x,y) = función que retorna el resto de dividir x entre y.
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Diseñe un algoritmo que lea un número y muestre un mensaje


indicando si el número es par. (Emplee IF)

Numero = input(“\nEscribe un numero entero: ”);


if (mod(Numero,2) == 0)
printf(“El numero %i es par”, Numero);
end
if (mod(Numero,2) != 0)
printf(“El numero %i es impar”, Numero);
end
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Diseñe un algoritmo que lea un número y muestre un mensaje


indicando si el número es par. (Emplee IF)

Numero = input(“\nEscribe un numero entero: ”);


Resto= mod(Numero,2);
if (Resto== 0)
printf(“El numero %i es par”, Numero);
end
if (Resto != 0)
printf(“El numero %i es impar”, Numero);
end
MEJOR  Ahorro calcular 2 veces el módulo
Universidad de Oviedo
FACULTAD DE CIENCIAS El Esquema Condicional if/else

Sintaxis
if (<condición>) <acción-1> else <acción-2> end
Semántica
Se evalúa la condición, si es cierta se ejecuta la acción-1 y si es falsa, la
acción-2
Diagrama de Flujo Estado
Inicial

cierto falso
condición

acción-1 acción-2

Estado
Final
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Diseñe un algoritmo que lea dos números y diga si son iguales, o si el


primero es mayor/menor que el segundo. (Emplee IF/ELSE)
Sabemos

Entrada: número 1, número 2

Salida: Mensaje indicando si son iguales o número 1 es mayor/menor que número 2.


Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Diseñe un algoritmo que lea dos números y diga si son iguales, o si el


primero es mayor/menor que el segundo. (Emplee IF/ELSE)
x1=input(“\nEscribe el primer numero entero: ”);
x2=input(“\nEscribe el segundo numero entero: ”);
if (x1 == x2)
printf(“Los numeros son iguales\n”);
else %x1!=x2
if (x1 > x2)
printf(“%f es mayor que %f\n”, x1, x2);
else %x1!=x2 && x1<=x2, luego x2 es el mayor
printf(“%f es menor que %f\n”, x1, x2);
end
end
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Diseñe un algoritmo que lea un número y muestre un mensaje


indicando si el número es par o impar. (Emplee IF/ELSE)
Sabemos

Entrada: número

Salida: El número es par un mensaje indicando que lo es.

Un número es par si el resto de su división entre 2 es 0.


mod(x,y) = función que retorna el resto de dividir x entre y.
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Diseñe un algoritmo que lea un número y muestre un mensaje


indicando si el número es par o impar. (Emplee IF/ELSE)

Numero = input(“\nEscribe un numero entero: ”);


Resto = mod(Numero,2);
if (Resto == 0)
printf(“El numero %i es par”, Numero);
else
printf(“El numero %i es impar”, Numero);
end
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Diseñe un algoritmo que lea un número y muestre un mensaje


indicando si el número que nos han introducido es entero (no tiene
decimales) o es real (con decimales). (Emplee IF/ELSE)
Sabemos

Entrada: número

Salida: Mensaje indicando si el número es entero o real.


Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Diseñe un algoritmo que lea un número y muestre un mensaje


indicando si el número que nos han introducido es entero (no tiene
decimales) o es real (con decimales). (Emplee IF/ELSE)

Numero = input(“\nDame un numero: ”);


if (int8(Numero)== Numero)
printf(“El numero %i es entero”, Numero);
else
printf(“El numero %i es real”, Numero);
end
¿Otras posibilidades?
• int8, int16, ….  Poco general
• Operaciones de redondeo
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Diseñe un algoritmo que lea un número y muestre un mensaje


indicando si el número que nos han introducido es entero (no tiene
decimales) o es real (con decimales). (Emplee IF/ELSE)

Numero = input(“\nDame un numero: ”);


if (floor(Numero)== Numero)
printf(“El numero %i es entero”, Numero);
else
printf(“El numero %i es real”, Numero);
end

También con otras operaciones de redondeo


Universidad de Oviedo
FACULTAD DE CIENCIAS El Esquema Condicional if/elseif

Sintaxis
if (<condición-1>)
<accion-1>
elseif (<condición-2>)
<accion-2>
elseif
…..
else
<acción-n>
endif
Semántica
Se evalúa la condición, si es cierta se ejecuta la acción-1 y si es falsa se
comprueba si se verifica la condición 2 si es cierta se ejecuta la acción 2
…………
El último bloque else no es obligatorio
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejemplos de Esquemas
Condicionales con if e if/else

if (a <= b)
if (c < d) if (a <= b)
a = b-2; if (c < d)
a = b-2;
elseif (d < e)
elseif (d < e)
b = b+3; b = b+3;
else end
if (e > f) else
c = a+5 if (e > f)
endif c = a+5;
endif end
endif end

¿Qué condiciones han de darse para que se ejecute c=a+5?


Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejemplos de Esquemas
Condicionales con if e if/else

if (a <= b)
if (c < d)
a = b-2;
else
if (d < e)
b = b+3;
end
end
elseif (e > f)
c = a+5;
end

¿Y aquí?
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Reescribe este código con IF/ELSEIF

x1=input(“\nEscribe el primer numero entero: ”);


x2=input(“\nEscribe el segundo numero entero: ”);
if (x1 == x2)
printf(“Los numeros son iguales\n”);
else %x1!=x2
if (x1 > x2)
printf(“%f es mayor que %f\n”, x1, x2);
else %x1!=x2 && x1<=x2, luego x2 es el mayor
printf(“%f es menor que %f\n”, x1, x2);
end
end
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio

Reescribe este código con IF/ELSEIF

x1=input(“\nEscribe el primer numero entero: ”);


x2=input(“\nEscribe el segundo numero entero: ”);
if (x1 == x2)
printf(“Los numeros son iguales\n”);
elseif (x1 > x2) %x1!=x2
printf(“%f es mayor que %f\n”, x1, x2);
else %x1!=x2 && x1<=x2, luego x2 es el mayor
printf(“%f es menor que %f\n”, x1, x2);
end
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejemplo: Cálculo de máximo
de tres números

Completa este código para que retorne el máximo de tres


números introducidos por teclado.

x1=input(“\nEscribe el primer numero entero: ”);


x2=input(“\nEscribe el segundo numero entero: ”);
x3=input(“\nEscribe el tercer numero entero: ”);

Asignar a Mayor el valor del mayor de x1, x2 y x3;

printf(“El mayor de los tres es %f\n”, Mayor);


Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejemplo: Cálculo de máximo
de tres números

Análisis de las condiciones y acciones

x1  x2
SI NO

x1  x3 x2  x3
SI NO SI NO

Mayor = x1 Mayor = x3 Mayor = x2 Mayor = x3


Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejemplo: Cálculo de máximo
de tres números

Codificación de la solución con Esquemas if/else


x1=input(“\nEscribe el primer numero entero: ”);
x2=input(“\nEscribe el segundo numero entero: ”);
x3=input(“\nEscribe el tercer numero entero: ”);
if (x1>=x2)
if (x1>=x3) Mayor = x1;
else Mayor = x3;
end
else %x1<x2
if (x2>=x3) Mayor = x2;
else Mayor = x3;
end
end
printf(“El mayor de los tres es %f\n”, Mayor);
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejemplo: Cálculo de máximo
de tres números

Codificación de la solución con Esquemas if/elseif


x1=input(“\nEscribe el primer numero entero: ”);
x2=input(“\nEscribe el segundo numero entero: ”);
x3=input(“\nEscribe el tercer numero entero: ”);
if (x1>=x2)
if (x1>=x3) Mayor = x1;
else Mayor = x3;
end
elseif (x2>=x3) %x1<x2
Mayor = x2;
else Mayor = x3;
end
printf(“El mayor de los tres es %f\n”, Mayor);
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio: Nota en texto

Diseñe un algoritmo que dada la nota numérica de un alumno, exprese


con texto la calificación que ha sacado (suspenso, aprobado, …)

Sabemos

Entrada: nota

Salida: Mensaje indicando la calificación obtenida.


Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio : Nota en texto

nota=input(“\nDime tu notat: ”);


if (nota<0) || (nota>10)
printf(“La nota es incorrecta\n”);
elseif (nota<5)
printf(“Suspenso\n”);
elseif (nota<7) Importante: Las condiciones en la
estructura multicondicional deben
printf(“Aprobado\n”); ser mutuamente excluyentes.
elseif (nota<9)
printf(“Notable\n”);
elseif (nota<10)
printf(“Sobresaliente\n”);
else
printf(“Matrícula de Honor\n”);
end
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio : Bloques

Determinar que bloques de sentencias se ejecutan (y en qué orden)


dependiendo de los valores de las condiciones.
if (cond1)
if (cond2)&&(cond3)
Bloque_1
else
if (cond4)
Bloque_2
end
Bloque_3
end
else
Bloque_4
end
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio : Bloques

cond1 cond2 cond3 cond4 Bloques


False - - - 4
True False - False 3
True False - True 2,3
True True False False 3
True True False True 2,3
True True True - 1
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio : Bloques

Suponiendo de nuevo la estructura de este código, podríamos escribirlo


sin emplear un esquema multicondicional.
if (cond1)
if (cond2)&&(cond3)
Bloque_1
else
if (cond4)
Bloque_2
end
Bloque_3
end
else
Bloque_4
end
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio : Bloques

Suponiendo de nuevo la estructura de este código, podríamos escribirlo


sin emplear un esquema multicondicional.
if (!cond1) Bloque_4 end
if (cond1)&&(!cond2)&&(!cond4) Bloque_3 end
if (cond1)&&(!cond2)&&(cond4)
Bloque_2
Bloque_3
end
if (cond1)&&(cond2)&&(!cond3)&&(!cond4) Bloque_3 end
if (cond1)&&(cond2)&&(cond3)&&(cond4)
Bloque_2
Bloque_3
end
if (cond1)&&(cond2)&&(cond3) Bloque_1 end
Universidad de Oviedo
Ejemplo: Cálculo de la nota final a
FACULTAD DE CIENCIAS partir de las notas de teoría y
prácticas

Si las prácticas están mal, o bien si la nota de teoría es menor que


5 la nota final es suspenso

Si la nota de teoría llega al 5 pero es menor que 7, entonces la


nota final será suspenso, aprobado o notable en el caso de que la
nota de prácticas sea regular, bien o muy bien, respectivamente

Si la nota de teoría llega al 7 pero no al 8.5, entonces la nota final


será aprobado, notable o sobresaliente dependiendo de que la nota
de practicas sea regular, bien o muy bien

Por último en el caso poco probable de que la nota de teoría supere


el 8.5 la nota final será notable, sobresaliente o matrícula de honor,
análogamente a los casos anteriores
Universidad de Oviedo
FACULTAD DE CIENCIAS
Nota Final: Primer Paso. Análisis de
las Condiciones y Acciones asociadas

Nota de Nota de Teoría (nt)


Practicas (np)
0  nt < 5 5  nt < 7 7 nt <8.5 8.5  nt

Mal Suspenso Suspenso Suspenso Suspenso


(‘m’)

Regular Suspenso Suspenso Aprobado Notable


(‘R’)

Suspenso Aprobado Notable Sobresal.


Bien
(‘B’)

Muy Suspenso Notable Sobresal. M. de H.


Bien
(‘M’)
Universidad de Oviedo
FACULTAD DE CIENCIAS
Nota Final: Siguiente Paso. Diseño de
un esquema condicional adecuado.

printf("La nota de teoria es un número real\n")


teoria=input("Introduzca la nota de teoria\n")
printf("La nota de prácticas es: M(mal), R(regular), B(bien), MB(muy
bien)\n")
practicas=input("Introduzca la nota de practicas\n","s")
if((practicas=="M")||(teoria<5)) notaFinal="Suspenso“;
elseif((teoria>=5) && (teoria <7))
if (practicas=="R") notaFinal="Suspenso" ;
elseif (practicas=="B") notaFinal="Aprobado“;
elseif (practicas==“MB") notaFinal="Notable“;
end
¿FUNCIONA?
elseif ((teoria>7) && (teoria <8.5))
…. ¿CORRECTO?
else
if (practicas=="R") notaFinal="Notable“;
elseif (practicas=="B") notaFinal="Sobresaliente“;
elseif (practicas==“MB") notaFinal=“Matricula de Honor “;
end
end
printf("La nota final es %s\n",notaFinal)
Universidad de Oviedo
FACULTAD DE CIENCIAS
Nota Final: Cuidado con las
condiciones.

El código anterior funciona. Sin embargo, al comparar la nota de


prácticas con su valor queremos que la condición retorne cierto (1) si
son iguales, falso (0) en caso contrario; no un vector de 0`s y 1’s que
es lo que retornaría al comparar por ejemplo “M”==“MB” (1 0)
>> “M”==“MB” >> if ("M"=="MB") disp(1) else disp(0)end
ans = 0
1 0 >> if ("AB"=="MB") disp(1) else disp(0)end
>> “AB”==“MB” 0
ans = >> if ("MBB"=="B") disp(1) else disp(0)end
0 1 0
>> “MBB”==“MB” >> if ("MBB"=="MB") disp(1) else disp(0)end
error: mx_el_eq: nonconformant error: mx_el_eq: nonconformant arguments
arguments (op1 is 1x3, op2 is 1x2) (op1 is 1x3, op2 is 1x2)

Para evitar comportamientos indeseados, comparar con strcmp


cuando alguno de los operandos del operador de comparación ==
pueda contener una cadena.
Universidad de Oviedo
FACULTAD DE CIENCIAS Nota Final: Mejor así.

printf("La nota de teoria es un número real\n")


teoria=input("Introduzca la nota de teoria\n")
printf("La nota de prácticas es: M(mal), R(regular), B(bien), MB(muy
bien)\n")
practicas=input("Introduzca la nota de practicas\n","s")
if((strcmp(practicas,"M"))||(teoria<5)) notaFinal="Suspenso“;
elseif((teoria>=5) && (teoria <7))
if (strcmp(practicas,"R“)) notaFinal="Suspenso" ;
elseif (strcmp(practicas,"B")) notaFinal="Aprobado“;
elseif (strcmp(practicas,“MB“)) notaFinal="Notable“;
end
elseif ((teoria>7) && (teoria <8.5)) Recuerda poner la condición
… (strcmp(practicas, “B”))
else equivale a
… (strcmp(practicas, “B”)==1)
end
printf("La nota final es %s\n",notaFinal)
Universidad de Oviedo
FACULTAD DE CIENCIAS El Esquema Condicional switch

Sintaxis (un ejemplo) Semántica


switch <expresion>
case etiqueta1 cierto
acción-a c=’a’ acción-a

case etiqueta2 falso


acción-b
cierto
........ c=’b’ acción-b
otherwise
falso
acción-por defecto
endswitch

etiqueta también puede ser acción


una expresión, pero ha de ser
excluyente con el resto de
expresiones colocadas en los
demás case.
Universidad de Oviedo
FACULTAD DE CIENCIAS El Esquema Condicional switch

if (X == 1) switch X
Bloque_1; case 1
elseif(X == 2) Bloque_1;
Bloque_2; case 2
else Bloque_2;
Bloque_3; otherwise
endif Bloque_3;
endswitch
Universidad de Oviedo
FACULTAD DE CIENCIAS El Esquema Condicional switch

Varias opciones en una etiqueta


A = 7;
switch (A)
case { 6, 7 }
printf (“La variable contiene un 6 o 7\n");
otherwise
printf ("variable no contiene ni 6 ni 7\n");
endswitch
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio: Calculadora

Diseñe un algoritmo que pida al usuario los operandos de una


calculadora, que contiene las operaciones suma, resta y división, y
muestre por pantalla un mensaje con el resultado de la operación
seleccionada en el menú. Emplea la función menu y a estructura
switch.
Sabemos

Entrada: numero1, numero2

Salida: Mensaje indicando el resultado de la operación según la opción de la calculadora


seleccionada.
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio: Calculadora

a=input("Dame un numero\n");
b=input("Dame otro numero\n");
opcion=menu("Calculadora","Suma", "Producto", "Division");
switch opcion
case 1
printf("La suma de a=%.2f mas b=%.2f es %.2f\n", a, b, a+b);
case 2
printf("El producto de a=%.2f por b=%.2f es %.2f\n", a, b, a*b);
case 3
printf("La división de a=%.2f entre b=%.2f es %.2f\n", a, b, a/b);
endswitch
Universidad de Oviedo
FACULTAD DE CIENCIAS El Esquema Condicional switch

Cada case es exclusivo, de modo que si entra en una opción, ya no


explora el resto.

La etiqueta puede ser cualquier expresión


También un string, lo que no ocurría con los if
Universidad de Oviedo
FACULTAD DE CIENCIAS El Esquema Condicional switch

Ventaja de emplear el
switch (X) switch frente a un if
case “Mañana"
printf(“Buenos días\n”);
case “Tarde”
printf(“Buenas tarde\n”);
othercase
printf(“Buenas noches\n”);
endswitch

if (strcmp (X, “Mañana"))


printf(“Buenos días\n”);
elseif …
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejemplo: Problema de las
notas

Diseñe un algoritmo que pida al usuario una cadena de caracteres con


la nota teórica obtenida por un alumno (suspenso, aprobado, notable,
sobresaliente, Matricula) e imprima un mensaje con el intervalo de
calificaciones con el que se corresponde.
Ej: “Suspenso” o “suspenso” mensaje “Nota teórica < que 5”

Sabemos
Entrada: Cadena de texto con la nota
Salida: Mensaje con el intervalo de calificaciones con el que se corresponde
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejemplo: Problema de las
notas

nota=input("Dame un nota en texto \n","s");


switch nota
case {"Suspenso","suspenso"}
printf("Nota teorica < que 5\n");
case {"Aprobado", "aprobado"}
printf("Nota teorica >= 5 y< 7\n");
case {"Notable","notable"}
printf("Nota teorica >= 7 y< 9\n");
case {"Sobresaliente","sobresaliente"}
printf("Nota teorica >= 9 y< 10\n");
case {"Matricula", "matricula"}
printf("Nota teorica == 10\n");
otherwise
printf("Nota incorrecta");
endswitch
4.4 Esquemas Iterativos
Universidad de Oviedo
FACULTAD DE CIENCIAS

El Esquema while
while(<condición>) <acción> end

El Esquema for
for (X) <acción> end
El Esquema do until
do <acción> until (<condición>)
El Esquema Iterativo while
Universidad de Oviedo
FACULTAD DE CIENCIAS

Sintaxis
while(<condición>) <acción> end

Semántica
Mientras que la condición sea cierta se repite la acción. Luego:
• La acción se repite un número no determinado de veces que puede ser 0
• Al finalizar la condición es falsa, luego la acción debe modificar el estado
para que la condición se evalúe a falso alguna vez.
Diagrama de Flujo Estado
Inicial

cierto
condición acción

falso
Estado
Final
Universidad de Oviedo Ejemplo: un programa que escribe los
FACULTAD DE CIENCIAS
números enteros de 1 a 10

/* Estos programas supuestamente escriben los


números enteros de 1 a 10. ¿Cuáles son correctos
y cuáles son razonables? */
x = 0; x = 0;
while (x < 10) while (x <= 10)
x = x + 1; x = x + 1;
disp(x) if (x <= 10)
end 1..10 disp(x)
Al salir x==10 end; 1..10
end Al salir x==11
x = 0;
while (x <= 10) x = 1;
disp(x); while (x < 10)
x = x + 1; disp(x)
0..10 x = x + 1;
end 1..9
Al salir x==11 end
Al salir x==10
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejemplo: Cálculo de la primera potencia
de 2 mayor o igual que 1000

Diseñe un algoritmo que calcule la primera potencia de 2


mayor que 1000.

Sabemos
Entrada:
Salida: Mensaje indicando cual es esa potencia
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejemplo: Cálculo de la primera potencia
de 2 mayor o igual que 1000

Diseñe un algoritmo que calcule la primera potencia de 2


mayor que 1000.

# Este programa calcula 2^exponente t.q.


# 2^(exponente-1) <= 1000 < 2^exponente

x = 1; # 2^0
exponente = 0;
while (x <= 1000)
exponente = exponente + 1;
x = 2 ** exponente;
end
printf (“La potencia es 2^ %i = %i“, exponente, x);
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejercicio: Suma de los números
introducidos por teclado

Diseñe un algoritmo que calcule la suma de los números


que se introduzcan por teclado. Para terminar se
introducirá el cero.

Sabemos
Entrada: Números que se introducen por teclado
Salida: Mensaje indicando cual es la suma de todos los números introducidos
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio: Suma de los números
introducidos por teclado

n=input("Dame un numero (0 para terminar)\n");


suma=0;
while (n!=0)
suma=suma+n;
n=input("Dame un numero\n");
endwhile
printf("La suma de los numeros es %.2f \n",suma);
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio: Verificar entrada

Diseñe un algoritmo que pida un número entero mayor o


igual que cero y lo muestre por pantalla. Si no cumple la
condición mostrar mensaje de error y volver a pedirlo.

Sabemos
Entrada: Número
Salida: Mensaje mostrando el número
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio: Verificar entrada

n=input("Dame un numero >=0 \n");


while ((floor(n)!=n)||(n<0))
printf("El numero ha de ser >=0\n");
n=input("Dame un numero >=0 \n");
endwhile
printf("El numero >=0 es el %i \n",n);
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejercicio: Buscar el mayor número de
un vector

Diseñe un algoritmo que pida un vector de números y


muestre por pantalla el mayor de los números contenidos
en él y en que posición se encuentra.

Sabemos
Entrada: Vector de números
Salida: Mensaje mostrando el número mayor y su posición en el vector.
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejercicio: Buscar el mayor número de
un vector

v=input("Dame un vector de numeros\n");


mayor=v(1);
pos_mayor=1;
i=2;
while (i<=length(v))
if(v(i)>mayor)
mayor=v(i);
pos_mayor=i;
endif
i=i+1;
endwhile
printf("El mayor numero del vector:\n");
disp(v);
printf("esta en la posicion %i y es %1.f\n",pos_mayor,mayor);
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejercicio: Recorrer las componentes
pares de un vector al revés

Diseñe un algoritmo que pida un vector de números, lo


recorra desde la última componente a la primera y muestre
sólo aquellas componentes que son pares.

Sabemos
Entrada: Vector de números
Salida: Muestra las componentes pares del vector, en orden inverso a su aparición en el
vector.
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejercicio: Recorrer las componentes
pares de un vector al revés

v=input("Dame un vector de numeros\n");


printf("Las componentes pares del vector son:\n");
i=length(v);
while (i>=1)
if(mod(v(i),2)==0)
printf("%i ",v(i));
endif
i=i-1;
endwhile
printf("\n");
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio: Serie de Fibonacci

Diseñe un algoritmo que rellene un vector con los 10


primeros números de la serie de Fibonacci y lo muestre por
pantalla.

Sabemos
Entrada:
Salida: Muestra los 10 primeros números de la serie de Fibonacci.

0, 1, 1, 2, 3, 5, 8, 13, ……
f0 = 0
f1 = 1

fn = fn-1+ fn-2
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio: Serie de Fibonacci

fib=[0, ones(1,9)]; # Inicializamos el vector


i=3;
while (i<=length(fib))
fib(i)=fib(i-1)+fib(i-2);
i=i+1;
endwhile
disp(fib);
Universidad de Oviedo
FACULTAD DE CIENCIAS WHILE. Ejercicio: Palíndromo

Diseñe un algoritmo que pida una cadena de caracteres y


muestre mediante un mensaje si es un palíndromo o no.

Sabemos
Entrada: Una cadena de caracteres.
Salida: Muestra un mensaje indicando si la palabra es un palíndromo o no.

Palíndromo: palabra que se lee igual de izquierda a derecha y de


derecha a izquierda. Ejemplos:

ababa, ana, ala ,arenera, oso, ojo, radar, reconocer, etc..


Universidad de Oviedo
FACULTAD DE CIENCIAS WHILE. Ejercicio: Palíndromo

cadena=input("Dame una cadena de texto: \n","s");


lc=length(cadena);
n=lc/2;
es_palindromo=1;
i=1;
while (es_palindromo && (i<=n))
if (cadena(i)!=cadena(lc-i+1))
es_palindromo=0;
endif
++i;
endwhile
if (es_palindromo)
printf("La cadena %s es un palindromo \n", cadena);
else
printf("La cadena %s no es un palindromo \n", cadena);
endif
El Esquema iterativo for
Universidad de Oviedo
FACULTAD DE CIENCIAS

Sintaxis
for X <accion> end

Semántica
Se repite la acción para todos los elementos de X. Luego:
• La acción se repite un número determinado de veces que puede ser 0
• Los valores de X los recorre automáticamente el bucle FOR.
Diagrama de Flujo
Estado
Estado
Inicial
Inicial

X<=4
Quedan X Desde X=1
hasta 4 acción
Para cada X acción

X>4
No quedan X Estado
Estado
Final
Final
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejemplo típico de uso de for

Un programa que escribe los números de 1 a N


for i = 1:N
disp(i);
end

Observaciones
La variable i toma valores de 1 a N.
Para cada valor de i que cumple la condición i<=N se ejecuta la
acción, luego la acción puede no ejecutarse nunca.
La acción no debe modificar a la variable (de control) i.
Universidad de Oviedo
FACULTAD DE CIENCIAS Bucle for descendente

¿Qué hacen estos bucles for?

for i = 10:1 for i = 10:-1:1 for i = 10:-2:1


disp(i); disp(i); disp(i);
endfor endfor endfor
No hace nada Muestra 10..1 Muestra 10 8 6 4 2
Iteraciones 0 Iteraciones 10 Iteraciones 5

i=10; i=10;
while (i>=1) while (i>=1)
WHILE disp(i); disp(i);
--i; i=i-2;
endwhile endwhile
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio: Serie de Fibonacci

Diseñe un algoritmo que rellene un vector con los 10


primeros números de la serie de Fibonacci y lo muestre por
pantalla. (FOR)

# WHILE # FOR
fib=[0, ones(1,9)]; fib=[0, ones(1,9)];
i=3; for i=3:length(fib)
while (i<=length(fib)) fib(i)=fib(i-1)+fib(i-2);
fib(i)=fib(i-1)+fib(i-2); endfor
i=i+1; disp(fib);
endwhile
disp(fib);
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejercicio: Cálculo de la media de N
números

Diseñe un algoritmo que calcule la media de N números y


la muestre por pantalla. (Suponemos N=25)

Sabemos
Entrada: -
Salida: Muestra la media de los N números introducidos por pantalla.
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejercicio: Cálculo de la media de N
números

N = 25; #N > 0
suma = 0;
for i = 1:N
x=input(“Numero?\n”); N = 25; #N > 0
suma += x; suma = 0;
end i = 1;
media = suma / N; while (i <= N)
printf(“Media = %.2f\n”,media) x=input(“Numero?\n”);
suma += x;
++i;
end
media = suma / N;
printf(“Media = %.2f\n”,media)

Codificación con while equivalente


Universidad de Oviedo
FACULTAD DE CIENCIAS FOR: Iterando sobre matrices y vectores
Iterando sobre una matriz
disp("Iterando sobre una matriz") 0
i=0; 1
for x = [0 -1 ; 1 4; 5 6] 5
disp(x); -1
++i; 4
end 6
printf("Iteraciones %i\n",i); Iteraciones 2

disp("Iterando sobre un vector") Iterando sobre un vector


i=0; 5
for x = [5 -1 2 1 0] -1
disp(x); 2
++i; 1
end 0
printf("Iteraciones %i\n",i); Iteraciones 5

disp("Iterando sobre un vector de cadenas") Iterando sobre un vector de cadenas


i=0; u
for x = ["uno" "dos”] n
disp(x); o
++i; d
end o
printf("Iteraciones %i\n",i); s
Iteraciones 6
Universidad de Oviedo
FACULTAD DE CIENCIAS
FOR anidados. Ejercicio: Cálculo de la
suma de los elementos de una matriz

Diseñe un algoritmo que pida una matriz y sume sus


elementos, mostrando el resultado de la suma por
pantalla.

Sabemos
Entrada: Una matriz.
Salida: Muestra la suma de los elementos de la matriz.
Universidad de Oviedo
FACULTAD DE CIENCIAS
Ejercicio: Cálculo de la suma de los
elementos de una matriz

M=input("Dame una matriz \n");


[f,c]=size(M) # calculamos dimensiones
# f <- filas; c <- columnas
suma=0; # suma inicial
for i = 1:f # bucle que recorre las filas
for j=1:c #bucle que recorre las columnas (en cada fila)
suma=suma+M(i,j); #agrega cada elemento a la suma
endfor
endfor
printf("Suma de los elementos de la matriz \n%.0f\n", suma);
Universidad de Oviedo
FACULTAD DE CIENCIAS
FOR anidados. Ejercicio: Mostrar una
matriz elemento a elemento

Diseñe un algoritmo que pida una matriz y muestre sus


componentes elemento a elemento.

Sabemos
Entrada: Una matriz.
Salida: Muestra la matriz elemento a elemento.
Universidad de Oviedo
FACULTAD DE CIENCIAS
FOR anidados. Ejercicio: Mostrar una
matriz elemento a elemento

M=input("Dame una matriz \n");


for i = 1:rows(M) # bucle que recorre filas
for j=1:columns(M) #bucle que recorre columnas (en cada fila)
printf("%i\t",M(i,j));
endfor
printf(" \n"); #salto para escribir la siguiente fila
endfor
Universidad de Oviedo
FACULTAD DE CIENCIAS
FOR anidados. Ejercicio: Pedir un
matriz elemento a elemento

Diseñe un algoritmo que pida las componentes de una


matriz cuadrada (n), componente a componente, y la
muestre por pantalla

Sabemos
Entrada: n, componentes de la matriz.
Salida: Muestra la matriz cuadrada.
Universidad de Oviedo
FACULTAD DE CIENCIAS
FOR anidados. Ejercicio: Pedir un
matriz elemento a elemento

# Pedimos la dimensión >0


n=input(“Numero de filas de la matriz (>0)? \n");
while ((floor(n)!=n)||(n<=0))
printf("La dimension ha de ser >0\n");
n=input("Dimension matriz (>0)? \n");
endwhile
# Pedimos las componentes fila a fila
for i = 1:n # bucle que recorre las filas
printf("Elementos fila %i\n", i);
for j=1:n #bucle que recorre las columnas (en cada fila)
printf("m(%i,%i)=",i,j);
m(i,j)=input(“");
endfor
endfor
disp(m);
Universidad de Oviedo
FACULTAD DE CIENCIAS
FOR anidados. Ejercicio: Pedir un
matriz elemento a elemento

...
# Pedimos las componentes fila a fila
for i = 1:n # bucle que recorre las filas
printf("Elementos fila %i\n", i);
for j=1:n #bucle que recorre las columnas (en cada fila)
printf("m(%i,%i)=",i,j);
m(i,j)=input(“");
# Comprobamos componente sin decimales
while (floor(m(i,j))!=m(i,j))
printf(“Componente no entera. Dame otra\n");
n=input("");
endwhile
endfor
endfor
disp(m);
Universidad de Oviedo
FACULTAD DE CIENCIAS El Esquema Iterativo do/until

Sintaxis
do
<acción>
until(<condición>);

Semántica
Se repite la acción hasta que la condición sea cierta
Es equivalente al esquema
<acción> while !(<condición>) <acción>
 luego la acción se ejecuta al menos una vez
Diagrama de Flujo
acción

falso
condición

cierto
Universidad de Oviedo
FACULTAD DE CIENCIAS
do/until. Ejercicio: Dígitos de un
número entero positivo al revés

Diseñe un algoritmo que dado un numero entero >=0 (no


es necesario que compruebe que lo es) escriba sus dígitos
al revés.

Sabemos
Entrada: número entero >=0.
Salida: número escrito al revés.
Universidad de Oviedo
FACULTAD DE CIENCIAS
do/until. Ejercicio: Dígitos de un
número entero positivo al revés.

n = input("Dame un numero entero >=0\n")


printf("El numero %i al reves es\n", n);
do
printf("%i", mod(n,10)); # siguiente dígito
n = fix(n / 10); # lo elimina
until (n == 0);
...
printf("%i", mod(n,10)); # siguiente dígito
while (n!=0)
n = fix(n / 10); # lo elimina
if (n!=0)
printf("%i", mod(n,10));# siguiente dígito
endif
WHILE
endwhile
Universidad de Oviedo
FACULTAD DE CIENCIAS
do/until. Ejercicio: Contar las cifras de
un número entero positivo

Diseñe un algoritmo que dado un numero entero >= 0 (no


es necesario que compruebe que lo es) cuente el número
de cifras que tiene.

Sabemos
Entrada: número entero >=0.
Salida: número cifrar del número introducido.
Universidad de Oviedo
FACULTAD DE CIENCIAS
do/until. Ejercicio: Contar las cifras de
un número entero positivo

n = input("Dame un numero entero >=0\n")


aux=n;
nc=0;
do
nc=nc+1; # cuenta la primera cifra
n = fix(n / 10); # la elimina
until (n == 0);
printf("El numero de cifras de %i es %i\n", aux,nc);
...
nc=1;
while (n!=0) WHILE
n = fix(n / 10);
if (n!=0)
nc=nc+1;
end
endwhile
...
Universidad de Oviedo
FACULTAD DE CIENCIAS
4.5 Las Sentencias break y
continue

break (con while, for)


provoca un salto a la acción siguiente al esquema
for x = 1:10
if ( x == 5)
break
end
disp(x);
end Muestra 1..4
continue (con while, for)
provoca un salto a la siguiente evaluación de la condición
x=1;
for x = 1:10 while x <= 10
if ( x == 5) if ( x == 5)
continue; continue;
end end
disp(x); Muestra 1..4 6..10 disp(x);
end Salta 5 x++;
end Bucle Infinito
Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio: Palíndromo

Diseñe un algoritmo que pida una cadena de caracteres y


muestre mediante un mensaje si es un palíndromo o no.

Sabemos
Entrada: Una cadena de caracteres.
Salida: Muestra un mensaje indicando si la palabra es un palíndromo o no.

Palíndromo: palabra que se lee igual de izquierda a derecha y de


derecha a izquierda. Ejemplos:

ababa, ana, ala ,arenera, oso, ojo, radar, reconocer, etc..


Universidad de Oviedo
FACULTAD DE CIENCIAS Ejercicio: Palíndromo

cadena=input("Dame una cadena de texto: \n","s");


lc=length(cadena);
n=lc/2;
es_palindromo=1;
i=1; for i=1:n
while (es_palindromo && (i<=n)) if (cadena(i)!=cadena(lc-i+1))
if (cadena(i)!=cadena(lc-i+1)) es_palindromo=0;
es_palindromo=0; break;
endif endif
++i; endfor
endwhile
if (es_palindromo)
printf("La cadena %s es un palindromo \n", cadena);
else
printf("La cadena %s no es un palindromo \n", cadena);
endif
Universidad de Oviedo
FACULTAD DE CIENCIAS 4.6 Propiedades de los Programas

El proceso de programación deberá estar encaminado a


producir programas con las siguientes propiedades:

correctos o eficaces: que produzcan resultados coherentes con


su especificación
legibles o claros: fácilmente comprensibles por el programador
(tiempo después de su diseño) y por cualquier otro programador
con acceso a la documentación aportada junto con el código
fuente
modificables: a lo largo de su ciclo de vida
reutilizables: algunos trozos deberían poder ser utilizados en
otros casos
eficientes: que optimicen el consumo de recursos informáticos
(tiempo, espacio, uso de periféricos)

También podría gustarte