Práctica 3A de Seminario de Lenguajes A - Ada, comparación con Java y Delphi Objetivo: Profundizar en el overloading de operadores y en el modelo de E/S de Ada. Aprender a declarar tipos discretos definidos por el usuario. Aprender a declarar tipos continuos definidos por el usuario. Conocer los atributos de los tipos escalares: discretos y continuos. Saber definir restricciones de subrangos sobre tipos previamente definidos. Utilizar arreglos tradicionales, conocer formas de asignación (aggregates) y declaración. Utilizar registros tradicionales, conocer formas de asignación (aggregates) y declaración. Comparar las declaraciones con Java y Pascal. 1. Implementar en Ada una función matemática f (x) sobre enteros que realice lo siguiente: 2 x − g(x − 5) x > 0 f (x) = h(2) x=0 g(x)/x x<0 g(x) = ( f (x) ∗ (−3) x>0 p x4 ∗ 5 + |x| x <= 0 h(x) = x − x5 + 56 Evalúe la función en un rango de -10 a 10. Optativo(s): a) ¿ Qué es necesario en Pascal para utilizar recursión mutua ? b) ¿ Qué es necesario en Java para utilizar recursión mutua ? c) ¿ Cómo se proveen las funciones matemáticas en ambos lenguajes ? Sub-objetivo: Aprender recursión mutua. Separar especificación de implementación. Usar funciones matemáticas predefinidas (Sqrt) definidas en Ada.Numerics.Generic Elementary Functions. Comparar declaraciones de procedimientos y funciones con otro lenguajes 2. Declare el tipo de datos punto cardinal. a) Realizar un programa que lea un punto cardinal del cual viene el viento (N, S, E, O, NO, NE, SO, SE) e imprima hacia cuál se dirige. Encapsule la funcionalidad en un módulo con el nombre “-”. Resolver usando: 1) 2) 3) Un case. Los atributos Succ, Pred y Pos. Un arreglo constante como tabla de hash (arreglo declarado como constant que tiene como ı́ndice el tipo punto cardinal y cada elemento es el punto cardinal contrario al ı́ndice). 1 b) Declare un subtipo del tipo punto cardinal declarado anteriormente el cual incluya solamente los valores (S,SE,SO) y otro que incluya a (SO,NO). - ¿Qué cambios debió hacer a las tres soluciones propuestas? - ¿Qué valor devuelve Pos para el primer elemento de los nuevos subtipos? - ¿Qué valor devolverı́a, si en lugar de ser subtipos fueran tipos derivados?. Como se puede diferenciar los literales de un tipo base con los de sus tipos derivados? - ¿Qué valor devuelve Pred para el primer elemento de los subtipos? - ¿Qué valor devuelve Pred para el primer elemento del tipo base? c) Compare legibilidad, mantenibilidad y rendimiento de las tres soluciones según su criterio. Optativo(s): a) ¿ Cómo se declaran los tipos enumerativos definidos por el usuario en Pascal y Java ? b) ¿ Cuales son las propiedades provistas por un tipo enumerativo en Pascal, qué diferencias en funcionamiento de las mismas encuentra con Ada ? c) ¿ Cómo separarı́a y ocultarı́a la implementación de la especificación ? Sub-objetivo: Declarar tipos enumerativos definidos por el usuario. Declarar subtipos y tipos derivados a partir de tipos definidos por el usuario. Usar atributos de tipos discretos. Usar arreglos con ı́ndices enumerativos. Realizar E/S de tipos enumerativos. Overloading del “-” unario. Cualificación de tipos. 3. Suponga que tiene en Ada una función que lee desde un dispositivo un valor que representa un voltaje. La especificación del dispositivo indica que el valor adquirido es convertido a digital en un formato de punto fijo de 12 bits, 8 para la parte entera y 4 para la decimal. El voltaje siempre es positivo. a) Qué tipo de dato usarı́a?. Definir en Ada. b) Implemente una función que toma como entrada un valor que representa la muestra y cuente cuantos valores distan de esta al valor máximo representable (use Succ y Last). c) Construya un programa que lea un valor de este tipo, lo imprima y luego invoque a la función anterior. d) Construya un programa que calcule lo cantidad de valores que se pueden representar con dicho tipo de datos (use la función definida en (b)). e) Implemente una función “=” (igual) sobre el tipo, que devuelva verdadero si la diferencia entre los parámetros es menor o igual a dos veces el delta (diferencia entre dos valores consecutivos). Se puede reimplementar el “/=”?. Optativo(s): a) ¿ Ofrecen Java y Pascal tipos de punto fijo ? b) ¿ Se puede sobrecargar la igualdad (operador “=”) en Pascal o en Java ? Sub-objetivo: Declaración y uso de tipos de punto fijo con delta. Overloading del igual. E/S de tipos de punto fijo. Atributos Succ y Last para tipos de punto fijo. Restricciones para implementar el “/=”. 4. Para el tipo punto cardinal previamente definido, declare dos nuevos tipos: (N,S), (E,O) y construya una función “+” que tome como entrada dos valores, uno del primer tipo y otro del segundo; y los combine de la siguiente forma: 2 N+O = NO N+E = NE S+O = SO S+E = SE Dando como resultado un valor del tipo base. Nota: No debe utilizar sentencias de selección para resolver. Sub-objetivo: Declaración de tipos derivados. Overloading del “+”. Uso de los atributos Value e Image. 5. Defina la multiplicación entre puntos cardinales de forma que que el resultado sea el punto cardinal que se encuentra en la posición producida por multiplicar las posiciones de los valores de entrada módulo la cantidad de puntos cardinales. Por ejemplo: N*S=N ya que: (0*1) mod (Pos(Last)+1) = 0 y Val(0)=N. Sub-objetivo: Uso de tipos derivados. Overloading del “*”. Uso de los atributos Val, Pos y Last. 6. Defina compatibilidad e interoperabilidad. Dadas las siguientes declaraciones de tipos: type xxx is new integer range 1..10; type yyy is new integer; subtype zzz is yyy range 1..10; El tipo xxx es igual al tipo zzz? Son compatibles o interoperables ? Optativo(s): a) ¿ Cómo es la interoperabilidad y compatibilidad de tipos en Pascal y Java ? b) ¿ En que caso le parece conveniente tener interoperabilidad basada en estructura o basada en nombres ? Sub-objetivo: Uso de tipos derivados. Aprender como es la compatibilidad de tipos en Ada y comparar con otros lenguajes. 7. a) Defina el tipo CurrencyNum_T como un flotante que cubre un rango de −1 000 000,000 hasta 1 000 000,000 con tres decimales. b) Defina el tipo Currency_T que contiene un sı́mbolo monetario (‘$’, ‘L’, ‘U’, ‘E’) 1 y un valor de tipo CurrencyNum_T. El valor por omisión debe ser $0.00. c) Implemente los procedimientos Put y Get para el tipo Currency_T. d) Defina una función de conversión que dado un objeto Currency_T y un sı́mbolo monetario devuelva un objeto Currency_T expresado en la moneda indicada por el segundo parámetro. e) Realice un programa que lea un valor del tipo Currency_T y lo imprima convertido en todas las monedas soportadas. f) Declare las constantes 1 Peso (de forma nombrada) y 1 Dolar (de forma posicional). Optativo(s): 1 Pesos, Libras, Dólares y Euros 3 a) ¿ Provee Java y Pascal tipos de punto flotante personalizados ? b) ¿ Se pueden en Java o Pascal declarar constantes de tipos compuestos ? c) ¿ Cómo se puede realizar E/S de tipos enumerativos en los otros lenguajes ? d) ¿ Cómo se declaran estructuras (registros) en los otros lenguajes y como se les puede asignar valores por omisión (default) ? Sub-objetivo: Declaración de registros. Declaración de tipos reales con digits. Declaración de tipos enumerativos. E/S de tipos enumerativos. Valores por omisión de registros. Overloading de Get y Put para registros. Asignación de registros. 8. a) Declare el tipo par ordenado (x,y) de componentes enteras, de forma que las variables sean inicializadas por omisión en (0,0). Declare la operación “+” para este tipo. b) Declare la operación “/” de forma que divida las dos componentes por un valor entero. c) Declare las operaciones Get y Put. d) Realice una función que: usando las operaciones previamente definidas, “+”, “/” y Get, lea N (constante recibida como parámetro) valores de este tipo y retorne el valor promedio, es decir el par con las siguientes coordenadas: Pn Pn yi i=1 xi , i=1 N N e) Realice un programa que lea 10 Puntos e imprima el promedio en pantalla. Optativo(s): a) ¿ Cómo se declaran arreglos en Pascal y Java ?, ¿ Son estáticos o dinámicos ? Sub-objetivo: Declaración de registros. Declaración de arreglos de registros. E/S de registros. Overloading de procedimientos y operadores. Declaración de constantes y variables registros con aggregates. Comparación de regitros por “/=” o “=”. 9. a) Defina el tipo Byte_T como un arreglo de 8 (constante) booleans, con las operaciones Put y Get. Declare las constantes Zero (un byte con todos los bits en false) y One (un byte con todos los bits en true). b) Realice un programa que lea bytes hasta obtener uno que sea igual a la constante One e imprima el resultado de hacer un “AND” entre todos. c) Idem al anterior pero haciendo un “OR” y leyendo hasta Zero. d) Declare tres variables del tipo Byte_T, una con el valor (00001111), otra con el valor (10101010) y la última con (01010101). Optativo(s): a) ¿ Qué estructuras proveen Pascal y Java para trabajar con arreglos de booleanos ? b) ¿ Qué tipos y operadores proveen C, Pascal y Java para trabajar a nivel de bits dentro de un byte ? Sub-objetivo: Declaración de arreglos. Declaración de constantes y variables arreglos con aggregates. Operaciones lógicas sobre arreglos “AND”, “OR” y “NOT”. E/S de arreglos. Overloading de procedimientos. Comparación por “=” o “/=” entre arreglos. 4 10. a) Declare el tipo Date_T de forma que se puedan representar las fechas con dı́a, mes y año. Restringa la mayor posible los valores de los campos. El valor por omisión debe ser su fecha de nacimiento. b) Implemente el Put el “<” y el “+” entre fechas. c) Indique si las siguientes expresiones son válidas. Si no lo son justifique. if (X=(1,12,2000)) ... W1: Date_T := (others=>1,Month=>11); W2: Date_T := (Month=>11,others=>1); Z: Date_T := (others=>1); Y: Date_T := (others=>13); Q: Date_T := (1..3=>11); Optativo(s): a) ¿ Cómo se pueden manejar fechas en Java y Pascal ? Sub-objetivo: Declaración de registros. Declaración de subtipos. Valores por omisión. Overloading de operadores. E/S de registros. Cualificación de tipos para tipos compuestos (composites). Formas de aggregates. 11. Implementar el tipo enumerativo color básico con los valores Orange, Red, Violet, Yellow, Green, Blue y el subtipo color primario con los valores Red, Green, Blue. Hacer una función que sume dos colores primarios y retorne uno básico como resultado. Sub-objetivo: Declaración de tipos enumerativos definidos por el usuario. Declaración de subtipos definiendo rangos. Overloading de operadores. 5