1. Fusión en una estructura abstracta de un archivo de registros con ...

Temas evaluados: Corte de control, fusión, apareo, listas enlazadas, abstracción procedural, archivos, y flujos. Diseñe
128KB Größe 7 Downloads 48 Ansichten
UTN – FRBA – Algoritmos y Estructura de Datos – Examen Final – 07/12/2013 Apellido y nombre:__________________________________ Legajo:__________ Cursó con Prof:_______________ Cantidad de hojas entregadas:_ Nota:_______________ Evaluó Prof: ________________ • Si luego de la lectura del examen, durante la resolución tiene alguna duda, escriba hipótesis de trabajo, las cuales también serán evaluadas. • Los puntos que solicitan codificación puede ser respondidos en C, C++, o en Pascal, pero debe indicar el lenguaje utilizado. • En C y C++ prototipo refiere a la declaración de la función, es decir tipo de dato retornado, nombre de la función, y tipos de los parámetros; en Pascal el concepto prototipo es análogo al encabezado del procedimiento o de la función previa al bloque que lo define.

1. Fusión en una estructura abstracta de un archivo de registros con una lista enlazada Temas evaluados: Corte de control, fusión, apareo, listas enlazadas, abstracción procedural, archivos, y flujos. Diseñe o codifique un subprograma que fusione en una estructura abstracta el contenido de un archivo con el de una lista enlazada de listas enlazadas. Los datos a tratar son secuencias de valores del tipo carácter que se agrupan bajo valores del tipo entero. El prototipo debe ser: procedure Fusionar(n:String, l: Lista, var p: Puntero) void Fusionar(const string& n, const Lista& l, Puntero& p); Asuma que el archivo y la lista de listas están ordenados de menor a mayor. Los registros del archivo tienen el campo grupo que es un entero y campo valor que es un carácter. El primer nivel de la lista de listas, es una lista enlazada de enteros, y el segundo nivel es una lista enlazada de caracteres. Por ejemplo:

Asuma que los caracteres en los grupos de la lista están siempre en el rango [a-m] y que los que están en el archivo están en el rango [n-z]; lo que implica que primero deben agregarse los valores de la lista, y luego los del archivo. El subprograma recibe una cadena con el nombre del archivo, y debe utilizar la biblioteca adjunta para recorrer ambas secuencias. El parámetro p es de salida, los otros dos son de entrada. La estructura que contendrá la fusión del archivo con la lista enlazada se debe manipular con las siguientes operaciones. function Crear():Puntero Puntero Crear(); Crea la estructura. procedure InsertarGrupo(var p: Puntero, g:Integer) void InsertarGrupo(Puntero &p, int g); Inserta en la estructura apuntada por p un nuevo grupo con identificador g. Si la estructura ya contenía ese grupo, no lo inserta. procedure InsertarValorEnGrupo(p: Puntero, g:Integer, v:Character) void InsertarValorEnGrupo(Puntero p, int g, char v); Inserta en la estructura apuntada por p el carácter v en el grupo g; Si g ya contiene v, no lo inserta. Si p no contiene g, lo inserta junto con v.

2. Selección de estructura eficiente Temas evaluados: Estructuras de datos, abstracción de datos, y abstracción procedural. • Describa y justifique cual es la mejor estructura concreta para la estructura abstracta descripta en el punto

UTN – FRBA – Algoritmos y Estructura de Datos – Biblioteca Genérica

Para la resolución del examen, los siguientes procedimientos y funciones pueden ser invocados sin ser implementados. Por cada procedimiento o función que decida invocar debe reescribir su prototipo reemplazando correctamente las palabras subrayadas y en cursiva (llamadas variables o no terminales); la invocación debe ser precisa y concordar con el prototipo.

Operaciones sobre Archivos bool LeerEspecial(FILE* in, TipoRegistro* registro); function LeerEspecial(var archivo: TipoArchivo; var registro: TipoRegistro): Boolean Lee un registro desde archivo y almacena en registro. Retorna pudo leer ? True : False. int BuscarBinArchivo(FILE* in, Tipo valor); function BuscarBinArchivo(var archivo: TipoArchivo; valor: Tipo): Integer Busca valor en archivo, mediante el algoritmo de búsqueda binaria. Retorna lo encontró ? Posición : -1. void BuscarBinArchivo(FILE* in, TipoInfo clave, TipoRegistro* registro); procedure BuscarBinArchivo(var archivo: TipoArchivo; clave: TipoInfo; var registro: TipoRegistro) Retorna el registro que tiene la clave buscada, la que se supone existe.

Operaciones sobre Arreglos procedure OrdenarArregloPorCampo(var arreglo: TipoArreglo; n: Integer) void OrdenarArregloPorCampo(Tipo arreglo, int n); Ordena por campo los primeros n elementos de arreglo. procedure CargarSinRepetir(vararreglo: TipoArreglo;n:Integer;varpos;varinserto:Boolean;clave: TipoInfo) void CargarSinRepetir(Tipo arreglo,intn,int&n,bool&inserto, TipoInfo clave); Carga una clave sin repetición en un arreglo, retorna en Pos, el índice donde lo encontró o lo insertó, y en inserto True, en caso de haberlo insertado function BuscarBinArreglo(var arreglo: TipoArreglo; N: Integer; clave: TipoInfo): Integer int BuscarBinArreglo(Tipo arreglo, int N, TipoInfo clave); procedure BuscarBinArreglo(vararreglo: TipoArreglo;N:Integer;clave: TipoInfo;varPos:Integer) procedure BuscarBinArreglo(Tipo arreglo, int N, TipoInfo clave, int& pos); Similar a la búsqueda binaria en archivo, modificando la estructura de dato y con el agregado de N que representa el tamaño lógico del arreglo

Estructuras Enlazadas

TipoNodo = record of info: TipoInfo; siguiente: ^TipoNodo;end;TipoPuntero =struct ^TipoNodo; TipoNodo { TipoInfo info; TipoNodo* siguiente;};typed Nodo info

Operaciones sobre Pilas procedure Push(var pila: TipoPuntero; valor: TipoInfo) void Push(TipoPuntero& pila, TipoInfo valor); Agrega valor a la cima de pila. procedure Pop(var pila: TipoPuntero; var valor: TipoInfo) void Pop(TipoPuntero& pila, TipoInfo& valor); Saca la cima de pila y la almacena en valor. function EstaVacia(frente, fin: TipoPuntero): Boolean bool EstaVacia(TipoPuntero& pila); Retorna True si la pila está vacía, si no, False.

siguiente

UTN – FRBA – Algoritmos y Estructura de Datos – Biblioteca Genérica Operaciones sobre Colas procedure Agregar(var frente, fin: TipoPuntero; valor: TipoInfo) void Agregar(TipoPuntero& frente, TipoPuntero& fin, TipoInfo valor); Agrega valor al final de una cola. procedure Suprimir(var frente, fin: TipoPuntero; var valor: TipoInfo) void Suprimir(TipoPuntero& frente, TipoPuntero& fin, TipoInfo& valor); Saca del primer elemento una cola y lo almacena en valor. function EstaVacia(frente, fin: TipoPuntero): Boolean bool EstaVacia(TipoPuntero& frente, TipoPuntero& fin); Retorna True si la cola está vacía, si no, False.

Operaciones sobre Listas procedure InsertarNodo(var lista: TipoPuntero; valor: TipoInfo) void InsertarNodo(TipoPuntero& lista, TipoInfo valor); procedure InsertarNodoDec(var lista: TipoPuntero; valor: TipoInfo) void InsertarNodoDec(TipoPuntero& lista, TipoInfo valor); Inserta en una lista ordenada en forma creciente (decreciente) por el primer campo valor. procedure SuprimirNodo(var lista: TipoPuntero; valor: TipoInfo) void SuprimirNodo(TipoPuntero& lista, TipoInfo valor); Busca un nodo con las características de valor, si lo encuentra lo elimina procedure BuscarOInsertar(var lista, ptr: TipoPuntero; valor: TipoInfo) void BuscarOInsertar(TipoPuntero& lista, TipoPuntero& ptr, TipoInfo valor); Busca un nodo con los datos de valor, si no lo encuentra, lo inserta y retorna en ptr la dirección de memoria creada. Si estaba retorna en ptr esa dirección. procedure InsertarPrimero(var lista: TipoPuntero; valor: TipoInfo) void InsertarPrimero(TipoPuntero& lista, TipoInfo valor); procedure InsertarAntesDe(var lista: TipoPuntero; valor: TipoInfo) void InsertarAntesDe(TipoPuntero& lista, TipoInfo valor); procedure InsertarDespuesDe(var lista: TipoPuntero; valor: TipoInfo) void InsertarDespuesDe(TipoPuntero& lista, TipoInfo valor); procedure InsertarAlFinal(var lista: TipoPuntero; valor: TipoInfo) void InsertarAlFinal(TipoPuntero& lista, TipoInfo valor); Cada procedimiento crea un nodo con valor y lo enlazan relativo a lista en la posición indicada por su nombre. function BuscarPorCampo(lista: TipoPuntero; valor: Tipo): TipoPuntero TipoPuntero BuscarPorCampo(TipoPuntero lista, TipoInfo valor); Busca el primer nodo con campo igual a valor. Retorna lo encontró ? Puntero al nodo : punteronulo