13 - implementacióndatosyestructurascontrol
DESCRIPTION
kjbhTRANSCRIPT
Implementación de datos
Tipos predefinidos y tipos no estructurados definidos por el
usuarioEjemplo: Descriptor de un Número entero
• En el caso, de subrangos se guardará la misma información que para el base, pero en el descriptor se agregará los límites superiores e inferiores.
• Los tipos enumeración se implementan asignándole un valor de 0 a n-1 a cada constante
• Los booleanos y los caracteres se implementan como enumerativos.
Entero
Allí se guarda el valor
Tipos estructurados“Registros”
• Ejemplo: Descriptor detype t = record a:real; b: integer;
end
recorda
bEntero
t
Lugar dónde se almacenan los valores de los campos
Real
Tipos estructurados“Arreglos”
• Ejemplo: Descriptor detype a = array [0..10] of real;
entero010
real
amatriz
Acá se dejaría lugar para tantos elementos como tenga la matriz
Información sobre los índices de la matriz
Tipos estructurados“Unión discriminada”
• Ejemplo: Descriptor de
type z = record a:integer;
case b: boolean of true: (c:integer); false: (d:integer; e: real)
endainteger
b
lógico
zReg. Variante
truefalse
dentero
e
real
centero
Valor Lógico Parte
variante
Tipos estructurados“Punteros”
• Ejemplo: Descriptor de
t
type T = ↑ integer;var t: T;
Memoria Libre
Allí se guarda el valor
Pila de ejecución
Estructuras de Control
A Nivel de Sentencia A nivel de Unidad
Estructuras de control
• Son el medio por el cual los programadores pueden determinar el flujo de ejecución entre los componentes de un programa
A Nivel de Unidad : Cuando el flujo de control se pasa entre unidades. Intervienen los pasajes de parámetros.
A Nivel de Sentencia: Se dividen en tres grupos
Secuencia Selección Iteración
Estructuras de control a nivel de sentencia
Secuencia• Es el flujo de control más simple.• Indica la ejecución de una sentencia a continuación
de otra.• El delimitador más general y más usado es el “ ; ”.• Hay lenguajes que no tienen delimitador y establecen
que por cada línea vaya una instrucción. Se los llaman orientados a línea. Ej: Fortran
• Se pueden agrupar sentencias en una, llamada Sentencia compuesta, llevan delimitadores como Begin y End. Ej: Algol, Pascal, { y } en C, C++, etc.
Distinción en entre sentencia y expresión
• En cualquier lenguaje convencional, ej. Pascal, existe diferencia entre sentencia de asignación y expresión
• En otros lenguajes tales como C definen la sentencia de asignación, como una expresión con efectos laterales.
• Las sentencias de asignación devuelven valores.• Evalúa de derecha a izquierda
Ejemplo a=b=c=0; • La mayoría de los lenguajes de programación requieren
que sobre el lado izquierdo de la asignación aparezca un l-valor. C permite cualquier expresión que denote un l-valor. Ej.: ++ p = *q;
(i<j?z:y)=4;
Selección
• Esta estructura de control permite que el programador pueda expresar una elección entre un cierto número posible de sentencias alternativa
• Evolución:
➠ If lógico de Fortran:
If (condición lógica) sentencia
Si la condición es verdadera ejecuta la sentencia
➠If then else de Algol:If (condición lógica) then sentencia1
else sentencia2 Este permite tomar dos caminos posibleProblemas:
Ambigüedad, no establecía por lenguaje cómo se asociaban los else con los If abiertos.
➠ If then else de Pl/1, Pascal y C sin ambigüedad
Establecen por lenguaje que cada else cierra con el último If abierto.
Desventajas:
Ilegibilidad, programas con muchos If anidados pueden ser ilegibles. Utilizar Begin End.
➠If then else de Algol 68 y Ada sin ambigüedad y más legibles
Incorpora las cláusulas que cierran los if : fi
Ejemplo: If i=0
then
j:= j+1;
else
j:=j-1;
fi
Tanto Ada como Algol 68 permiten la abreviatura elif que reemplaza al else if
➠Sentencia Select de Pl/1Pl/1 incorpora la sentencia de selección entre dos o más
opcionesSelect
when(A) sentencia1;when(B) sentencia2;
............ Otherwise sentencia n;
End;Reemplazaría a los If anidados
If (A) then sentencia1 else If (B) then sentencia2
else If .................else sentencia n;
➠Sentencia de selección múltiple en otros lenguajes
Algol 68La expresión debe ser de tipo enteraLa rama i-ésima corresponde se ejecuta cuando la expresión
da el valor i.Tiene una cláusula opcional Out que se ejecuta cuando el
valor dado por la expresión no está expresado en el conjunto de valores
Si no se coloca se ejecuta por defecto Out y Skip. La sentencia Skip es una sentencia nula.Pascal
Incorpora que los valores de la expresión sean Ordinales y ramas con etiquetas. No importan el orden en que aparecen las ramas.
Es inseguro porque no establece qué sucede cuando un valor no cae dentro de las alternativas puestas
AdaCombina los aspectos positivos del Pascal y de Algol68
Las expresiones pueden ser de tipo entero o enumeración
Se debe estipular en las selecciones todos los valores posibles que puede tomar la expresión
Tiene la cláusula Others que se puede utilizar para representar a aquellos valores que no se especificaron explícitamente
Si en la sentencia no se coloca la rama para un posible valor y no aparece la opción Others, no pasará la compilación.
C, C++Para múltiple selección provee el constructor Switch
Cada rama es etiquetada por uno o más valores constantes
Cuando se coincide con una etiqueta del Switch se ejecutan las sentencias asociadas y se continúa con las sentencias de las otras entradas.
Existe la sentencia break, que provoca la salida
Tiene una cláusula default que sirve para los casos que el valor no coincida con ninguna de las opciones establecidas
Ejemplo de ADA:Case Operador is
when ´+´ => result:= a + b;
when ´-´ => result:= a - b;
when others => result:= a * b;
end case
Ejemplo de C, C++:Switch Operador {
case ´+´ :
result:= a + b; break;
case ´-´:
result:= a - b; break;
default :
result:= a * b;
}
IteraciónEste tipo de instrucciones se utilizan para representar
aquellas acciones que se repiten un cierto número de veces
Su evolución:➠Sentencia Do de Fortran
Do label var-de-control= valor1, valor2...........
Label continue La variable de control solo puede tomar valores enteros El Fortran original evaluaba si la variable de control había llegado al límite al final del bucle, o sea que siempre una vez lo ejecutaba
➠Sentencia For de Pascal, Algol 68, ADA, C , C++ La variable de control puede tomar cualquier valor ordinal, no solo enterosPascal no permite que se toquen ni los valores del límite inferior y superior, ni el valor de la variable de control.
La variable de control puede ser de cualquier valor ordinal.
El valor de la variable fuera del bloque se asume indefinida
Algol 68 no permite que se toque el valor de la variable de control, pero sí los valores de los límites superior e inferior, porque los evalúa en el comienzo. Además el alcance de la variable de control es solo en el bucle.
Ada encierra todo proceso iterativo entre las cláusulas loop y end loop. Permite el uso de la sentencia Exit para salir del loop y la variable de control NO necesita declararse, se declara implícitamente cuando se entra al bucle y desaparece cuando se sale de élC, C++ se compone de tres partes: una inicialización y dos expresiones
La primer expresión (2do. Parámetro) es el testeo que se realiza ANTES de cada iteración. Si no se coloca el for queda en LOOP.En el primer y último parámetro se pueden colocar sentencias separadas por comas