UTN – FRBA – SSL TP – Astronomía – Programa Comando Sintaxis y Semántica de los Lenguajes 2016 TP – ADT Entero Contexto El ADT (Abstract Data Type, Tipo de Dato Abstracto) Entero permite a programadores del área Astronomía operar con cifras muy grandes. Valores Su conjunto de valores coincide con el conjunto numérico , pero dado el contexto de aplicación, se requiere que la implementación permita manejar cifras más grandes que la de los tipos de datos primitivos de la mayoría de los lenguajes de programación. El conjunto de valores debe implementarse con semántica de valor, con las siguientes declaraciones: #include <stdio.h> typedef struct { signed char size_t } Entero; losDigitos[ BUFSIZ ]; laCantidadDeDigitos; Operaciones Todas las operaciones de este TAD deben especificarse, y por lo tanto implementarse, con precondiciones. 1. CrearDesdeCadena Sumar : Entero Entero → Entero 2. 3. ( enteroComoCadena0 ) = entero0 La cadena que representa el número puede tener signo y no tiene separadores de miles. Comparar Análoga a la función de ANSI C strcmp. Operaciones de Persistencia Flujos Binarios 4o. Write : Entero × Flujo → Flujo 4i. Read : Flujo → Entero × Flujo La secuencia de datos en un flujo binario es, simplemente, el resultado de invocar a fwrite, pasando como argumento la variable con el entero: fwrite( & unEntero, sizeof unEntero, 1, out ); Flujos de Texto 5o. Print : Entero × Formato × Flujo → Flujo 5i. Scan : Flujo → Lógico × Entero × Flujo El conjunto Formato = {ConSeparadorDeMiles, SinSeparadorDeMiles} y se implementa con un enum. En un flujo de texto los enteros se representan como palabras del lenguaje EnteroComoCadena, las palabras tienen signo opcional para los positivos, obligatorio para los negativos, con separador de miles opcional, y con un punto y coma terminador; no pueden comenzar con el 0 salvo el cero, las cadenas +0 y -0 no son palabras. Ejemplos correctos: 1.000; Ejemplos incorrectos: 10.00; +1.000; 1000; +1000; ++1.000; 1+00-0; -33..222..111; (Punto 1.1) Definir su alfabeto. (Punto 1.2) Definirlo por comprensión. (Punto 1.3) Escribir una ER que lo represente. (Punto 1.4) Escribir una GIC que lo genere. -33222111; -33.222.111; -1.222.333 UTN – FRBA – SSL TP – Astronomía – Programa Comando (Punto 1.5) Formalizar un AFD que lo reconozca, dibujar su diagrama de transiciones. Durante el diseño del AFD ejemplificar las operaciones de concatenación para los signos, unión para los números con o sin separador de miles de AF. Asegurar que el AF resultante es el mínimo para que la implementación sea eficiente. (Punto 1.6) Para minimizar el AF y para los algoritmos que de las operaciones entre AF leer [MUCH2012]. El valor lógico devuelto por Scan es verdadero si la cadena disponible en el flujo pertenece al lenguaje, sino, el valor lógico es falso y el entero es cero. Para determinar determinar si la cadena pertenece al lenguaje Scan implementa un autómata finito. (Punto 1.7) Para la implementación del AFD, leer [MUCH2012] (Punto 1.8) Diseñar las sentencias que permitan leer todos los enteros disponibles en un flujo, ya sea con Read o Scan, y determinen si el fin de la lectura fue por error (en el flujo o de formato) o no (porque no hay más datos para leer). ¿Cómo escribir la condición del ciclo para que cumpla con el idioma presentado en la sección 1.5.1 de [K&R1988] para la lectura? Ayuda: operador coma (,). ¿Qué condición se debe evaluar a la salida del ciclo? Prototipos de algunas de las funciones que implementan las operaciones 1 . 2 . 4i. 5i. 5o. Entero Entero Entero int void Entero_CrearDesdeCadena(const char *unaCadenaConUnNumero); Entero_Sumar(Entero unEntero, Entero otroEntero); Entero_Read(FILE *in); Entero_Scan(FILE *in, Entero *unEntero /* out */); Entero_Print(Entero unEntero, Formato unFormato, FILE *out); (Punto 1.9) Los equipos deben intercambiar los binarios de las implementaciones (e.g., Entero.lib) y el encabezado (i.e., Entero.h), no el código fuente (i.e., Entero.c) y ejecutar el programa de prueba contra las dos implementaciones, la del propio equipo y la del equipo con la cual se hizo el intercambio. El resultado de la ejecución debe ser idéntico para ambas implementaciones. En el curso se estable cuál equipo se cruza con cual otro.—