1 Control de Secuencia Øyvind Mo Edgar Acosta Adrián López
2 Las Estructuras de Control de Secuencia Proveen el marco de interacción para la ejecución de operaciones y datos. Controlan el orden de ejecución de las operaciones.
3 Categorias de ECS Expresiones Instrucciones o grupos de instrucciones Programación Declarativa Subprogramas Implícitas Explícitas
4 Categorías de ECS
5 Arboles para representar expresiones Composición funcional Operaciones y sus respectivos operandos Resultados de operaciones forman nuevos operandos Operaciones representadas por niveles No se define precedencia en operaciones en el mismo nivel
6 Ejemplo: Raíz de 2do grado / B + _ * * - *^ A4 C2B SQRT 2A -B+ B 2 – 4 * A * C 2 * A
7 Representación Sintáctica Linealización de arboles. Notación Prefija (Polaca) Notación Polaca Cambridge Notación Postfija Notación Infija
8 Representación Sintáctica : Ejemplo * -+ ADBC Prefija: *+AB-CD Prefija Cambridge: (*(+AB)(-CD)) Infija:(A+B)*(C-D) Postfija:AB+CD-*
9 Representación Semántica Evaluación de expresiones prefijas. Características –Evaluación en una sola pasada –Necesidad de saber el numero de argumentos por tipo de operación –No hay necesidad de paréntesis –Similitud con llamadas a funciones –Operaciones con cualquier número de operandos –Decodificacion sencilla a secuencias de código
10 Representación Semántica Evaluación de expresiones infijas. Características –Forma común de expresar las expresiones aritméticas –Trabaja con operadores binarios –Funciones y operadores unarios implementados a traves de notación prefija o postfija –Necesidad de uso de paréntesis para evitar ambigüedad –Decodificación compleja a secuencias de código
11 Jerarquía de operaciones Orden de precedencia de operadores Asociatividad –Izquierda a-b-c evaluado (a-b)-c –Derecha a^b^cevaluado a^(b^c) Lenguajes sin Jerarquía de operaciones
12 Jerarquia de Operaciones : Ejemplo C A= =B | C= = D evaluado (A= =B) | (C= = D) Precedencia del operador = = sobre | Pascal A=B | C=D evaluado A=(B | C)=D Precedencia del operador | sobre =
13 Representación de Expresiones en Tiempo de Ejecución
14 Etapas de traducción Establecer estructura de árbol (opcional) decidir el órden óptimo de evaluación
15 Formas en que se traducen las expresiones en notación infija Código máquina Estructura de árbol Prefija o postfija
16 Evaluación con las representaciones de árbol de expresiones
17 Problema 1. Reglas de evaluación uniforme
18 Evaluación glotona Ejemplo: (a+b)*(c-a) - * + baca
19 Ejemplo de evaluación glotona que no hace lo que se espera Z+(Y=0?X:X/Y) Ejemplo de evaluación glotona que no hace lo que se espera Z+(Y=0?X:X/Y) + / IF = Z 0X Y YX
20 Evaluación apática Es prohibitiva para los lenguajes aritméticos
21 Problema 2. Efectos secundarios Si a vale 1 inicialmente y fun(x) devuelve 3 y tiene el efecto secundario de modificar el valor de a a 2 el órden de evaluación es crítico: Evaluando en secuencia: 1 × = 5 Evaluando a solamente una vez: 1 × = 4 Evaluar fun(x) antes que a: 2 × = 8 a×fun(x)+a
22 Problema 3. Condiciones de error
23 Problema 4. Expresiones Booleanas de corto circuito if ( ( A == 0 ) || ( B / A > C ) ) {... } while ( ( L C) ) {... } Solución de Ada if ( A = 0 ) or else ( B / A > C) then
24 Categorías de ECS
25 Control de secuencia entre instrucciones Instrucciones básicas Tipos de control de secuencia a nivel de instrucciones Control de secuencia explícita Diseño estructurado de programas
26 Instrucciones básicas Instrucciones de asignación A:=B(PASCAL) A=B(C, Java) MOVE A TO B(COBOL) A B(APL) (SETQ A B)(LISP) A += B(C, Java) ++A A++
27 Instrucciones básicas Instrucciones de entrada y salida. ; System.out.println(”Hola”); Otros instrucciones de asignación. –NEWLINE = TRIM(INPUT) –PadreDe(X,Juan), PadreDe(Y,Juan), not (X=Y).
28 Tipos de control de secuencia a nivel de instrucciones Composición Alternación Iteración
29 Control de secuencia explicita GOTO incondicional GOTO condicional BREAK CONTINUE
30 #include void main() { int n; for(;;) { cout <<“Ingresa un número (0 para terminar): "; cin >> n; cout << n <<" al cubo es: " << n*n*n << "n"; if(n == 0) goto esc; } esc: cout << endl; } Goto : Ejemplo
31 C64 BASIC: 750 ifnv(0)=0thenf=0:goto goto ifint(rnd(1)*100+1)<=nthen nextx:goto ifn<>nv(1)andn<>0thennextx:goto1640 Problemas con Goto en Basic
32 Break #include void main() { int n, count = 0, sum = 0; cout <<"Enter positive integers. Terminate input with 0:n"; for (;;) { cout << "t" <<count + 1 << ": "; cin >> n; if(n ==0) break; ++count; sum += n; } cout <<"The average of the " << count << " numbers is " << (float) sum / count << endl; }
33 Continue #include int main() { int n = 0; for(;;) { n++; if (n%7 == 0) continue; cout << "n = " + n; }
34 Diseño estructurado de programas 1.Diseño jerárquico 2.Representación del diseño en el código del programa 3.La secuencia textual = la secuencia actual 4.Un grupo de instrucciones tiene solamente una función (No usar GOTO)
35 Control de Secuencia Estructurado Conjunto de instrucciones de control en un lenguaje de alto nivel –Composición o Agrupamiento –Condicionales o de Alternación –Iteración
36 Agrupamiento Contienen una o más instrucciones Actúan como un solo bloque Las instrucciones contenidas se ejecutan secuencialmente Ejemplos:Begin... End {... }
37 Condicionales Expresan la ejecucion alternada de dos instrucciones o la ejecución condicional de una instrucción La alternativa se controla por medio de una condición.
38 Instrucción IF : Ejecución Opcional If condición then instrucción end if...instrucciones antes del IF Evalua S = condición (0=False, 1=True) Salta a L0 + S L0: Salta a L2 (no hay instrucciones para Condición = false) L1: Instrucciones para Condición = True L2: Instrucciones después del if...
39 Instrucción IF : Ejecución Alternativa...instrucciones antes del IF Evalúa S = condición (0=False, 1=True) Salta a L0 + S L0: Salta a L1 Salta a L2 L1: Instrucciones para condición = False Salta a L3 L2: Instrucciones para condición = True L3 instrucciones después del if... If condición then instrucción1 else instrucción2 end if
40 Instrucción CASE Evalúa una condición y compara varios valores hasta encontrar una equivalencia....instrucciones antes del Case Evalua T de la variable Valor Salta a L0 + T L0: Salta a L1 Salta a L2 Salta a L3 L1: Instrucción 1 Salta a L4 L2: Instrucción 2 Salta a L4 L3: Instrucción 3 L4: instrucciones después del Case Case Valor when 0 begin instrucción1; end when 1 begin instrucción2; end when others begin instrucción3; end end case
41 Iteración Proveen capacidad de repetición de ejecución de un mismo código Estructuras básicas contienen un encabezado y un cuerpo El encabezado controla en número de veces que se iterará El cuerpo es el conjunto de instrucciones a repetirse
42 Iteración : Ejemplos Repetición Simple (Cobol) Perform cuerpo K veces Repetición mientras se mantiene una condición (C) While { cuerpo } Repetición mientras se incrementa un contador (Algol) for I := 0 step 2 until 30 do cuerpo Repetición controlada por datos (Perl) foreach { cuerpo } Repetición indefinida (Ada) Loop... Exit when... end Loop;
43 Condiciones excepcionales Utilizando go to Instrucción 1 If error go to α Instrucción 2 If error go to α... α: Manejo de errores On Error en VB y Raise en Ada como opción On error go to α Instrucción 1 Instrucción 2... α: Manejo de errores Salidas multiples de loops Utilizando go to For I := 1 to K do if Vect[I] = 0 then go to α Loop Exit en Ada y Break en C como opción For I = 1.. K loop exit when Vect[I] = 0 ; End loop; Problemas de ECS estructurada Discusión del Goto Do-While-Do Utilizando go to Loop read(x) if EOF then go to α process(x) End loop; Exit when en Ada e If Break en C como opción Loop read(x) If EOF break process(x) End loop;
44 Programas Primos
45 Componentes de un diagrama de flujo Nodo de funciónNodo de decisiónNodo de unión
46 Programa Primo
47 Programa compuesto
48 De un nodo De tres nodos if... then... while... do... do... while... repeat... until... do... while... repeat... until... De cuatro nodos if... then... else... do... while... do Programas Primos De dos nodos
49 Teorema de estructura Nodos originales Nodos transformados
50 Categorías de ECS
51 Secuenciación entre instrucciones no aritméticas Lenguajes declarativos usan formas de control de secuencia muy distintas a los que usan los lenguajes imperativos. Prolog, ML, Haskell etc.
52 Reconocimiento de patrones Muy importante en: –Trabajar con cadenas de texto PERL ML SNOBOL4 –Ejecución y control de programas declarativos Prolog ML Haskell
53 Ejemplos: Gramáticas en BNF –A 0A0 1A1 0 1 (lenguajes libres de contexto) Expresiones Regulares –{a,b}*a (lenguajes regulares)
54 Un ejemplo de SNOBOL4 START GRAMMAR = 0 | 1 | 0 *GRAMMAR 0 | 1 *GRAMMAR 1 LOOPNEWLINE = TRIM(INPUT): F(END) NEWLINE (POS(0) SPAN(“01”) RPOS(0)): F(BAD) SN = SIZE(NEWLINE) NEXTNEWLINE POS(0) GRAMMAR.PALINDROME POS(SN) :S(OK) F(NOTOK) OKOUTPUT = “MATCH: “ PALINDROME:(LOOP) NOTOKSN = SN – 1:(NEXT) BADOUTPUT = “IMPROPER INPUT:” NEWLINE:(LOOP) END
55 Un ejemplo de PERL while ( $line = ) { if ( $line =~ / ) { print $line; } O bien: while ( ) { print if / ; }
56 Un ejemplo mas interesante s/ (\S+)\s+(\S+) /$2 $1/ MADRE PURA
57 Prolog Usa reconocimiento de patrones para buscar y conectar información. –Padre(Abraham, Isaac) –Padre (Isaac, Jacob) –Abuelo(X,Y) :- Padre(X,Z), Padre(Z,Y) –:-Abuelo(X, Jacob)
58 Reescritura de términos Reescritura de términos es una forma restringida de reconocimiento de patrones. –Gramática BNF: A 0B 1 B 0A –Ejemplo de ML: Fun factoral(1) =1 factorial(N:int) = N * factorial(N-1);
59 Unificación El mecanismo básico de computación en lenguajes declarativos. Usa substitución. Asigna valores a variables.
60 Términos Se componen de: –Variables [x, y,..] –Funciones Constantes [a, b, c,...] Otros [ f(x), g(x, y)... ] –Paréntesis [( )] –Coma [,] Ejemplo: g(f(x, y), f(x, y))
61 Sustituciones Una sustitución mapea variables a términos. Es la forma mas común de asignar valores a variables en la programación lógica. Muchas veces es implícita en programas lógicos. {x1/t1,..., xn/tn} –for i [1,n], xi ti
62 Ejemplos de substitución Consideramos la substitución ={x/w, y/z}, y el termino s = f(a, y, z) Tenemos que s = f(a, z, z) Si tenemos otra substitución ={w/a, z/b} se puede componer una substitución nueva: = = {w/a, x/a, y/b, z/b} Entonces: s = f(a, b, b)
63 Unificadores Un unificador es una substitución que unifica dos términos. Dos términos son unificados si son idénticos. Ejemplo: = {x/a, y/b} es un unificador de s=f(a, y, z) y u=f(x, b, z), porque s = f(a, b, z) = u
64 Unificadores Más Generales (Most General Unifiers) Dos términos pueden ser unificados por varios unificadores, pero solo uno de ellos es el UMG (MGU). Ejemplo: Tanto ={x/a, y/b} como ={x/a, y/b, z/a} unifican s=f(a, y, z) y u=f(x, b, z). Sin embargo solo es el UMG
65 Unificación 1.Buscar un par de desacuerdo F:Salir con Exito 2.Unificarlo F:Salir con Fracaso 3.Calcular los términos nuevos 4.Volver a 1.
66 P(María, Juan) P(Pedro, José) P(Luis, Pedro) A(x,y):- P(x,z), P(z,y) :-A(Luis,w) :- P(Luis,z), P(z,w) {z | Pedro} :-A(Luis,w) :- P(Luis,Pedro), P(Pedro,w) {w | José} :-A(Luis,José) :- P(Luis,Pedro), P(Pedro,José)
67 Backtracking
68 :-A(Luis,w) :- P(Luis,Susana), P(Susana,w) {z | Susana}{z | Pedro} :-A(Luis,w) :- P(Luis,Pedro), P(Pedro,w) P(María, Juan) (el padre de María es Juan) P(Pedro, José) P(Luis,Susana) P(Luis, Pedro) A(x,y):- P(x,z), P(z,y) :-A(Luis,w) :- P(Luis,z), P(z,w) {w | José} :-A(Luis,José) :- P(Luis,Pedro), P(Pedro,José)
69 {z | Susana} :-A(Luis,w) :- P(Luis,Susana), P(Susana,w) P(Juan, María) (el padre de María es Juan) P(Pedro, José) P(Luis,Susana) P(Luis, Pedro) A(x,y):- P(x,z), !, P(z,y) :-A(Luis,w) :- P(Luis,z), P(z,w) :-A(Luis,w) :- fail
70 Bibliografía From Logic Programing to Prolog (Cap II) Krzyztof R. Apt Prentice Hall Programming Languages (Cap 8) Desing and Implementation 4a edición Terrence W. Pratt Marvin V. Zelkowitz Prentice Hall