Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Instrucciones Estructuradas
Bloque de instrucciones:
– Concatenación secuencial de instrucciones
Sintaxis:
– secuencia de instrucciones
– separadas por el carácter ;
– delimitada por BEGIN y END
Semántica
– un bloque representa una única instrucción compuesta
Ejemplo: Composición de instrucciones
bloque 1: 4 instrucciones
BEGIN {bloque 1}
write('Introduzca x,y:');
readln(x,y);
BEGIN {bloque 1.1}
aux:=x;
x:=y;
y:=aux
END; {bloque 1.1}
writeln('x,y = ',x,',',y)
END; {bloque 1}
bloque 1.1: 3 instrucciones
Composición de instrucciones
Composición de instrucciones:
– Subprogramas:
• se usan para modelar subproblemas y sus
soluciones algorítmicas en el marco del diseño
descendente y del refinamiento sucesivo
• son acciones/cálculos lógicos (para el programador)
– Bloques de instrucciones:
• se usan dentro de las instrucciones estructuradas
(de selección y de interacción)
• no tienen por qué formar una entidad lógica
(para el programador)
4.2 Instrucciones de Selección
La instrucción IF
La instrucción CASE
Instrucciones de Selección
Estructura de control de selección:
– permiten elegir dinámicamente (en tiempo de
ejecución) entre diferentes secuencias de
instrucciones
– Ejemplo:
SI en el examen de mañana apruebo ENTONCES
haré las maletas y
me iré de vacaciones
SI NO
me quedaré en casa y
estudiaré para el examen de septiembre
La instrucción IF
Sintaxis:
IF <Expresión Booleana> THEN
<Instrucción1>
ELSE
<Instrucción2>
Semántica:
– se evalúa <Expresión Booleana>
– si el resultado es true, se ejecuta <instrucción1>
– si el resultado es false, se ejecuta <instrucción2>
Ejemplo: versión 1
{bloque de instrucciones para
calcular el máximo de dos números}
BEGIN {bloque}
readln(x,y);
IF x > y THEN
max := x
ELSE
max := y;
writeln('El máximo es ',max)
END; {bloque}
Selección de secuencias de instrucciones
Se ejecuta: como:
IF <cond.> THEN IF <cond.> THEN
instrucción1; instrucción1;
instrucción2; instrucción2;
… …
instrucciónN instrucciónN
Recomendaciones
Sangrar adecuadamente las instrucciones
que forman parte del IF (usando
tabuladores)
Si se utilizan instrucciones compuestas,
documentar el fin del bloque con un
comentario
No se deben repetir instrucciones comunes
a las dos ramas de la estructura IF
– la versión 1 del ejemplo es preferible a la versión 2
Recomendaciones
No utilizar instrucciones IF para la
asignación de valores booleanos
– en vez de:
IF (x>=0) and (x<10) THEN
B:=true
ELSE
B:=false;
– mejor usar:
B:= (x>=0) and (x<10)
Alternativas múltiples
IF anidado
– usar cuando haya alternativas múltiples que
dependen de selectores diferentes
Ejemplo: IF anidado
Ejemplo:
– decidir si se alquila un coche en función de dos
variables selectoras:
• la posesión del carnet de conducir
• la edad
– regla:
• no tiene carnet • no se alquila coche
• tiene carnet y es menor de 25 • se alquila a precio
alto
• tiene carnet y es mayor de 25 • se alquila a
precio bajo
Ejemplo: IF anidado
IF tieneCarnet THEN
IF edad <= 25 THEN
{tienecarnet edad 25}
writeln('precio alto')
ELSE
{tienecarnet (edad 25)}
writeln('precio bajo')
ELSE
{ tienecarnet}
writeln('no se alquila coche');
4.3 Instrucciones de Iteración
Iteración:
– Proceso de ejecutar repetidamente el mismo
bloque de instrucciones.
– En cada iteración se ejecutan las mismas
acciones en el mismo orden.
Ciclo (ó bucle):
– Secuencia de enunciados que se repite
– Iteración: Acto de ejecutar repetidamente un ciclo
– Una iteración: Acto de ejecutar una vez un ciclo
Objetivos de Iteración
Instrucción N-1;
Instrucción N+1;
Ejemplo
Ejemplo: Calcular i = 1+2+...+n utilizando WHILE
BEGIN {bloque}
readln(n);
suma := 0;
contador := 1;
WHILE contador <= n DO BEGIN
suma := suma + contador;
contador := contador+1
END; {WHILE}
writeln(suma);
END {bloque}
Ciclos infinitos
Semántica:
– El bloque de instrucciones se ejecuta siempre la
primera vez (de 1 a n iteraciones).
– Luego se evalúa la expresión booleana
• si evalúa a true, se ejecuta la siguiente instrucción
• si evalúa a false, continuarán las iteraciones hasta
que se cumpla la expr. booleana.
Instrucción N-1;
REPEAT
instr N1;
. . .
instr Nk
UNTIL <condición> ¿Condición?
Condición = true Condición = false
Instrucción N+1;
Ejemplo 1
Ejemplo: Calcular i = 1+2+...+n utilizando REPEAT
BEGIN {bloque}
readln(n);
suma := 0;
contador := 1;
REPEAT
suma := suma + contador;
contador := contador+1
UNTIL contador > n;
writeln(suma)
END; {bloque}
Ejemplo 2
Aplicación preferente: lectura de datos
– seguir pidiendo datos hasta que se introduzcan
valores válidos
BEGIN {bloque para leer un entero positivo}
REPEAT
write('Introduzca un entero pos.: ');
readln(numero)
UNTIL numero > 0;
{número > 0}
END; {bloque}
Errores comunes
prevenir ciclos infinitos REPEAT:
– es tarea del programador prevenir ciclos infinitos,
por lo que ha de modificarse al menos una variable
en el cuerpo
– el ciclo termina cuando la condición evalúa a true
(contrario al WHILE)
– asegurarse que todas las operaciones durante la
primera ejecución del cuerpo son válidas (que no
haya división por cero etc.)
– tener en cuenta que también la primera ejecución
del cuerpo afecta a algunas de las variables de la
expresión booleana
Características del REPEAT
La estructura REPEAT modela ciclos
postprobados:
– La expresión booleana se evalúa después de las
instrucciones del cuerpo, por lo que éstas se ejecutan
al menos una vez
C := false;
REPEAT
WHILE not C DO BEGIN
I1;
I1;
... traducción
In ...
In
UNTIL C;
END; {WHILE}
WHILE y REPEAT...UNTIL
Recomendaciones técnicas (preliminares):
SI NO
Ciclo ascendente
– WHILE
cont:=cotaInferior;
WHILE cont<=cotaSuperior DO BEGIN
<instrucciones>;
cont:=succ(cont);
END; {WHILE}
– FOR equivalente
FOR cont:=cotaInferior TO cotaSuperior DO
BEGIN
<instrucciones>;
END; {FOR}
Estructura FOR .. TO .. DO
Ciclo descendente
– WHILE
Cont:=cotaSuperior;
WHILE cont>=cotaInferior DO BEGIN
<instrucciones>;
cont := pred(cont);
END; {WHILE}
– FOR equivalente
FOR cont:=cotaSuperior DOWNTO cotaInferior DO
BEGIN
<instrucciones>;
END; {FOR}
Sintaxis: FOR .. TO .. DO
En general, tanto la cota inferior como la cota
superior pueden ser expresiones
Sintaxis (ciclo ascendente):
FOR indice:= <expr. inicial> TO <expr. final> DO
<instrucción>
false
¿Indice<=ExpFinal?
IN-1; true
FOR Indice:=ExpIni TO ExpFinal DO
BEGIN
Indice :=
succ(Indice)
instrN1;
...
instrNk
END; {FOR}
IN+1;
Semántica ciclo FOR descendente
false
¿Indice>=ExpFinal?
IN-1; true
FOR Indice:=ExpIni DOWNTO ExpFinal DO
BEGIN
Indice :=
pred(Indice)
instrN1;
...
instrNk
END; {FOR}
IN+1;
Ejemplo
Ejemplo: Calcular i = 1+2+...+n utilizando FOR
BEGIN {bloque}
readln(n);
suma := 0;
FOR contador := 1 TO n DO BEGIN
suma := suma + contador;
END; {FOR}
writeln(suma)
END; {bloque}
La variable contadora
Indice:
– se llama variable contadora o índice del ciclo
– se ha de declarar como variable (no debe ser
parámetro formal etc.)
– ha de ser ordinal (no sólo integer, sino también char o
boolean). Por ejemplo:
FOR c:= 'A' TO 'Z' DO
write(c);
writeln
Expresión inicial y final
Exp. Inicial y Exp. Final:
– han de ser de tipos compatibles con el tipo de índice
– expIni y expFinal se evalúan sólo una vez, antes de la
ejecución del ciclo
– no se ejecuta el ciclo (ni una sólo vez)
• Si inicialmente expFinal<expInicial en ciclo
ascendente ó
• Si inicialmente expFinal>expInicial en ciclo
descendente
Restricciones para la variable contadora
El número de iteraciones se determina una vez al
iniciar la ejecución del ciclo FOR
Durante el ciclo no se debe alterar el número de
iteraciones.
Restricciones para índice:
– No se le debe asignar un valor
– No se debe pasar como parámetro VAR a un
subprograma
– No se debe llamar a read o readln con índice
– No se debe “reutilizar” como índice de un FOR anidado
– Al salir del ciclo FOR, habrá que suponer que el valor
de indice está sin definir
Estructuras FOR anidadas
Ejemplo:
– escribir los valores de una matriz n x m
– siendo cada elemento Mi,j= ½(i+j)
BEGIN {bloque}
writeln('Tamaño de la matriz: ');
readln(n,m);
FOR i:= 1 TO n DO
FOR j:= 1 to m DO
writeln('M[',i,',',j,']=',(i+j)/2)
END; {bloque}
Errores comunes y limitaciones
Prevenir errores comunes:
– no hay peligro de ciclos infinitos, a no ser que se
modifique la variable contadora en el cuerpo
– Nunca colocar un ; detrás del DO ya que indicaría que el
cuerpo está vacío
– No olvidar delimitar el cuerpo del bucle con BEGIN y END
Limitaciones:
– En Pascal no es posible definir ciclos FOR con
incrementos o decrementos distintos de 1 (siempre se
toma el sucesor o el predecesor del valor actual)
– en estos casos, habrá que usar un ciclo WHILE
equivalente
Características del FOR
La estructura FOR modela ciclos preprobados:
– Si la variable indice inicialmente es mayor que la
expresión inicial (o: menor, para ciclos descendentes),
el cuerpo no se llegará a ejecutar, y se ejecutará la
instrucción n+1
SI NO
SI NO
iniciar tratamiento
FOR primer elemento TO ultimo elemento DO
BEGIN
tratar elemento
END;
tratamiento final
Esquema de búsqueda
Problema 1. Determinar si aparece la letra ‘a’ en
una secuencia de caracteres acabada en ‘.’
BEGIN {bloque}
Read(car);
WHILE (car <> ‘.’) AND (car <> ‘a’) DO
Read(car);
esta:= car = ‘a’;
END {bloque}
Esquema de búsqueda
Se pretende localizar un elemento que
cumpla una determinada propiedad A
Es suficiente con localizar al primero de
los elementos que la cumplen
obtener/calcular posible primer elemento
iniciar tratamiento
WHILE no último elemento y no satisface A DO
obtener/calcular siguiente elemento
determinar si encontrado
Esquematización de algoritmos iterativos
Complejidad en espacio:
– las instrucciones estructuradas no
aumentan la complejidad en espacio
Complejidad en tiempo:
– reglas de cálculo de complejidad para
• instrucciones de selección
• instrucciones de iteración
Complejidad en tiempo
La complejidad en tiempo depende del valor de
ciertas variables
{n = 3} {n = 7}
WHILE n>2 DO WHILE n>2 DO
n:= n-2; n:= n-2;
Instrucción CASE
CASE ExpSel OF
1: I1
...
T(n) = TExpSel(n) + TIj(n)
j: Ij
... para ExpSel =j
n: In
END
Complejidad en tiempo: iteración
Instrucción FOR
– FOR j:= ExpIni TO ExpFinal DO I
– complejidad la inicialización Tinit(n)
• complejidad de evaluar ExpIni
• complejidad de evaluar ExpFinal
• complejidad de iniciar j con ExpIni: 1
• complejidad de comparar j con el valor de ExpFinal: 1
– complejidad del incremento Titer
• complejidad de incrementar/decrementar j: 1
• complejidad de comparar j con el valor de ExpFinal: 1
Complejidad en tiempo: iteración
Instrucción FOR
ExpFinal
– Complejidad: T (n ) = Tinit (n ) + (T (n) + T )
I Iter
k = ExpIni
– Ejemplo:
6
FOR i:= 2 TO 7-1 DO T = 3 + (TI + 2 )
k =2
k:=i;
6 6
IF k<4 THEN T = 3 + TI + 2
l:=j k =2 k =2
– Ejemplo:
n div 2
{n0} T (n ) = 1 + (2 + 1)
k =1
WHILE n>=2 DO
n:= n-2; T (n ) = 1 + 3 * (n div 2)
iteraciones: m = n div 2 p.e. T (5) = 7
Complejidad en tiempo: iteración
Instrucción REPEAT
– REPEAT I UNTIL c
– suponemos que el cuerpo I se ejecuta m veces
m
– complejidad: T (n ) = (TI (n ) + Tc (n ))
k =1
– Ejemplo:
n div 2
T (n ) = (2 + 1)
{n0}
REPEAT k =1
n:= n-2;
UNTIL n<2 T (n ) = 3 * (n div 2)
p.e. T (5) = 6
iteraciones: m = n div 2
4.4. Depuración y Corrección
Depuración
Verificación formal
– Corrección parcial de instrucciones de
selección
– Corrección parcial de instrucciones de iteración
– Terminación y Corrección total
Depuración de instrucciones estructuradas
Instrucción CASE
– verificar que la postcondición q se pueda
deducir en la rama de cada una de las
etiquetas si
Verificación: Iteración
La verificación de las instrucciones de
iteración se apoya en el concepto de
invariante
Invariante de ciclo:
– aserción que se cumple antes, durante, y
tras la ejecución de un ciclo
– describe la semántica del ciclo,
caracterizando el efecto de la iteración
Ejemplo: Calcular n!
BEGIN {bloque}
readln(n);
i := 0;
f := 1;
{f=i! 0in} antes
WHILE i < n DO BEGIN
durante
{f=i! 0in}
i := i + 1
f := f * i;
END; {WHILE}
{f=i! 0in ( ¬(i<n))} tras
END {bloque}
Verificación: Iteración
Idea de la verificación:
– encontrar una propiedad invariante (INV)
– probar que INV se cumple inmediatamente
antes de entrar en el ciclo
– probar que INV es conservada por el cuerpo
del ciclo
– deducir que INV se cumple inmediatamente
después de salir del ciclo
Verificación: Iteración
Instrucción WHILE:
WHILE B DO I
Regla :
INV B I INV
(RWH)
INV while B do I INV B
Verificación: Ejemplo
Verificar el siguiente programa para computar el
máximo común divisor (mcd) de dos enteros
positivos
u = X v = Y u 0 v 0
WHILE u v DO
IF u v THEN
u := u − v
ELSE
v := v − u
u = mcd ( X , Y )
Verificación: Iteración
En la demostración se utilizará implícitamente que
mcd ( A, B) = mcd (B, A)
Además, se aplicarán explícitamente dos
teoremas
T1 : mcd ( A, B ) = mcd ( A − B, A) si A B
T2 : mcd ( A, A) = A
Invariante del ciclo WHILE:
Corrección total:
– Todo programa S que comienza en un estado
que satisface p, termina en un estado que
satisface q: {p} [S] {q}
Verificación: Terminación
Terminación:
– Todo programa S que comienza en un estado que
satisface p, termina al cabo de un nº finito de
pasos
TER(p, S)
Corrección parcial y total:
– Si S no contiene iteración ni recursión (Tema 5):
{p} [S] {q} = {p} S {q}
– de lo contrario
{p} [S] {q} = {p} S {q} + TER(p,S)
Verificación: Terminación
Idea: encontrar una expresión cota que
– es una cota del nº de pasos restantes de la
iteración (en función de algún estado de
cómputo)
– demostrar que:
• inicialmente esta expresión evalúa a una cota
positiva (un número natural)
• el valor de la expresión decrece estrictamente en
cada iteración
Verificación: Terminación
Regla:
para probar TER(INV, while B do I ) hay que
encontrar una expresión cota e (formada por
variables que son modificadas por I), y
demostrar que
a) INV B → e N
b) INV B e = V I e V
Verificación: Terminación
El método para la instrucción REPEAT se
obtiene de forma similar
En general se verifica la terminación,
probando que una expresión e decrece con
respecto a cualquier orden bien fundado (O,
), del cual (N, ) es un caso especial
Ejemplo: Corrección de mcd
Terminación del programa mcd:
– Invariante del ciclo WHILE:
mcd (u, v ) = mcd ( X ,Y ) u 0 v 0
– Expresión cota e:
max(u, v )
– Demostración:
a) e toma valores en N
u = X v = Y u 0 v 0 u v → max(u, v ) 0
→ max(u, v ) N
Ejemplo: Terminación de mcd
b) e decrece en cada iteración
v >0
1. INV u v u v max(u, v ) = C → max(u − v, v ) C
2. max(u − v, v ) C u := u − v max(u, v) C (AA)
3. INV u v u v max(u, v) = Cu := u − v max(u, v) C (RC: 1+2)
u >0 v>u
4. INV u v u v max(u, v ) = C → max(u, v − u) C
5. max(u, v − u) C v := v − u max(u, v ) C (AA)
6. INV u v u v max(u, v) = Cv := v − u max(u, v) C (RC: 4+5)
7. INV u v max(u, v ) = C
IF u v THEN u := u − v ELSE v := v − u (RIF: 3+6)
max(u, v ) C