2016 TAD Entero - Dr. Oscar Bruno

Anuncio
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.—
Descargar