Segundo parcial de Programación 2

Documentos relacionados
DEFINICION. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006

Instituto de Computación - Facultad de Ingeniería - Universidad de la República

Árboles. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

324 MR Versión 1 Prueba Integral 1/3 Semana 10 Lapso

Tecnólogo Informático- Estructuras de Datos y Algoritmos- 2009

ELO320 Estructuras de Datos y Algoritmos. Arboles Binarios. Tomás Arredondo Vidal

El programa que permite el manejo de la base de datos tiene la siguiente funcionalidad:

Procesadores de lenguaje Tema 6 La tabla de símbolos

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

Primer Parcial de Programación 3 (1/10/2009)

Unidad Nº V Listas Enlazadas

Tema 7.- Fundamentos de la Programación Orientada a Objetos

Tema 9. Algoritmos sobre listas. Programación Programación - Tema 9: Algoritmos sobre listas

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Elementos de un programa en C

Tabla de Símbolos. Programación II Margarita Álvarez

Estructuras de datos. Estructuras de datos

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

Tema 6. Gestión dinámica de memoria

funciones printf scanf

ESTRUCTURAS DE DATOS ÁRBOLES 143

Solución al Examen de Prácticas de Programación (Ingeniería Informática)

Este material es de uso exclusivo para estudio, los textos fueron tomados textualmente de varios libros por lo que está prohibida su impresión y

Un elemento de cualquier clase llamada Info; Un puntero a un nuevo nodo llamado sig; De tal forma una unión de nodos hace que tengamos una lista:

Algorítmica y Complejidad. Tema 3 Ordenación.


<tipo> Tipo de dato de los elementos del vector

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Examen escrito de Programación 1. Jueves 5 de febrero de Problema 1 o (3.5 puntos)

Clases e instancias. Algoritmos y Estructuras de Datos I. Clases e instancias. memoria dinámica.

PRÁCTICA No. 13 ÁRBOL BINARIO DE BÚSQUEDA

Estructura de Datos. TDA: Listas. Primer Semestre, Indice. Tipos de estructura de datos lineales

Tema 2. Memoria Dinámica. 2.1 Datos estáticos y dinámicos

Estructuras de Datos Dinámicas. Diseñar y programar en lenguaje C soluciones utilizando estructuras de datos dinámicas

Tema Árboles generales. 9.2 Árboles binarios 9.3 Árboles de búsqueda

Conceptos a tratar. Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos

Árboles Binarios Ordenados Árboles AVL

TEMA 8: Gestión dinámica de memoria

TADs en C. Matías Bordese Algoritmos y Estructuras de Datos II - Laboratorio 2013

CI2126 PRÁCTICA 9: TAD COLA. 1) Implemente las operaciones C_Insert y C_Remove del TAD COLA usando a. un arreglo. La estructura sería:

Tema 5. Estructura de datos Pila

Estructuras de Datos Declaraciones Tipos de Datos

INTRODUCCIÓN. Estructura de Datos Tipos Abstractos de Datos (TAD S) Profs. Lorna Figueroa M. Mauricio Solar F. UTFSM 1 / 2008

Caracteres y Cadenas Conversión de Datos Funciones y procedimientos Archivos cabecera. Fundamentos de programación

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Tema: Tipos Abstractos de Datos (TAD s) en C++.

Pilas y Colas. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

Guía práctica de estudio 05: Diagramas de flujo

TIPO DE DATO ABSTRACTO (TDA)

LA ESTRUCTURA DE DATOS PILA EN JAVA. CLASE STACK DEL API JAVA. EJEMPLO Y EJERCICIOS RESUELTOS. (CU00923C)

PROGRAMACION ORIENTADA A OBJETOS Ingenieria Informática Final Febrero 2006/07

Retículos y Álgebras de Boole

Los Tipos Abstractos de Datos. Estructuras de Datos y Algoritmos 03/04

Proyecto 1 parte 2 Diccionario sobre arreglos

Laboratorio 7 Motor de búsqueda web basado en el TAD Árbol Binario de Búsqueda GUIÓN DEL LABORATORIO

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

Árboles balanceados. Alonso Ramírez Manzanares Computación y Algoritmos Thursday, April 30, 15

Unidad II: Análisis semántico

Programación. Tema 8: Tablas Hash. Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el????

PILAS Fundamentos

Organización de Computadoras

Algoritmos de Strings. Héctor Navarro

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

GUIA 2: Repaso sobre uso de C#. Funciones, métodos y arreglos.

Programación Avanzada SOLUCIÓN EXAMEN FEBRERO 2011

Examen Principios de Programación Febrero 2012

Estructura de datos Tema 2: Tipos Abstractos de Datos (TADs)

EXAMEN DE SUFICIENCIA DE INFORMATICA

El lenguaje C. 1. Estructuras. Principios de Programación Definicion de estructuras

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Este método se basa en buscar el elemento menor el vector y colocarlo en la primera

Java Avanzado Facultad de Ingeniería. Escuela de computación.

Tablas Hash y árboles binarios

INTERFACE COMPARATOR. DIFERENCIAS ENTRE COMPARATOR Y COMPARABLE. CLASE COLLECTIONS. EJERCICIOS RESUELTOS. (CU00918C)

TEMA 4. ESTRUCTURAS DE CONTROL

Estructuras de Datos. Dr. Pablo E. Fidel Martínez López Lic. en Ciencias de la Computación UNR

Mostrar Números Ascendentemente. Soluciones Ejercicios Tema 5. tostring Recursivo de LEG. Suma Recursiva de un Vector (1/3)

Estructuras en LabVIEW.

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

11. PILAS Introducción Fundamentos

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Elabore el diagrama de clases en UML y la codificación de un programa para resolver los siguientes problemas:

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

Árboles binarios de búsqueda

Programación estructurada (Introducción a lenguaje C)

Estructura de datos y de la información Boletín de problemas - Tema 2

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Capítulo. Listas, pilas y colas en C. Contenido. Introducción

Arboles Binarios de Búsqueda

Transcripción:

Generalidades: Segundo parcial de Programación 2 a. La prueba es individual y sin material. b. La duración es 3hs. c. Sólo se contestan dudas acerca de la letra. 8 de Julio de 2016 d. Escriba las hojas de un sólo lado y con letra clara. e. Numere cada hoja, indicando en la primera el total. f. Coloque su nro. de cédula y nombre en cada hoja. Problema 1 (16 puntos) Considere la siguiente representación del tipo AB, de árboles binarios de enteros: struct nodo { int dato; nodo * izq, * der; typedef nodo * AB; Implemente un procedimiento llamado internosporniveles que dado un árbol de tipo AB, imprima sus elementos, de izquierda a derecha y por niveles de arriba hacia abajo. Los elementos se deben imprimir en un sólo renglón separados por un espacio y sin incluir los elementos de las hojas del árbol. Se debe implementar el procedimiento de forma iterativa, accediendo directamente a la representación del árbol, de forma tal que tenga O(n) de tiempo de ejecución en el peor caso, siendo n la cantidad de nodos del árbol. Use el TAD Cola de elementos de tipo AB para resolver el problema. Debe especificar pero no implementar el TAD Cola utilizado (se asume que el TAD Cola está implementado eficientemente, de modo que todas las operaciones básicas son O(1) de tiempo de ejecución en el peor caso). No use otras estructuras de datos o TADs auxiliares. Solución Problema 1 // Crea y devuelve una Cola de ABs vacía Cola crearc(); // Inserta a al final de la c void encolarc(ab a, Cola &c); // Devuelve true si c esta vacía y false en caso contrario bool esvaciac(cola c); // Devuelve el primer elemento de c. Pre:!esVaciaC(c) AB primeroc(tabla t); // Borra el primer elemento de c. Pre:!esVaciaC(c) void desencolarc(cola &c); // Libera la memoria de la cola void destruirc(cola &c); Segundo Parcial de Programación 2 8 de Julio 2016 Página1/6

void ImpNiveles (AB a){ Cola colaaux; AB arbactual; crearc(colaaux); if(a!= NULL) encolarc(a,colaaux); while (! esvaciac(colaaux)) { arbactual = primeroc(colaaux); desencolarc(colaaux); if ((arbactual->izq!= NULL) (arbactual->der!= NULL)){ printf("%i ", arbactual->raiz); if (arbactual->izq!= NULL) encolarc(arbactual->izq, colaaux); if (arbactual->der!= NULL) encolarc(arbactual->der, colaaux); destruirc(colaaux); Segundo Parcial de Programación 2 8 de Julio 2016 Página2/6

Problema 2 (22 puntos) Se quiere especificar e implementar un TAD Pedidos que permita registrar una colección de pedidos y atender los pedidos respetando el orden de llegada. Un pedido tiene un identificador que es un número en el rango [0:K] y una descripción que es un string. Se pide: a) Especifique completamente, en C* el TAD Pedidos con operaciones que permitan: Crear una estructura de pedidos vacía, que pueda contener hasta K+1 pedidos. Insertar un pedido con identificador i (0 i K) y descripción d, en una colección de pedidos p, siempre que no exista otro pedido con el mismo identificador i en p; en caso contrario la operación no tendrá efecto. Eliminar el pedido más antiguo (el primero ingresado) de una colección de pedidos no vacía y devolver la descripción de dicho pedido. Consultar si una colección de pedidos es vacía. Consultar si hay un pedido con identificador i (0 i K) en una colección de pedidos. b) Defina una representación del TAD anterior de tal manera que las operaciones de inserción y eliminación de pedidos tengan O(1) de tiempo de ejecución en el peor caso. c) Implemente las operaciones para crear e insertar de la parte a) accediendo directamente a la representación propuesta. Omita el código del resto de las operaciones del TAD (que puede asumir están implementadas). Solución Problema 2 a) Especificación completa del TAD Pedidos: // Crea y devuelve una Colección de pedidos vacía Cola crearp(); // Devuelve true si p esta vacía y false en caso contrario bool esvaciap(pedidos p); // Inserta el pedido con identificador i y descripción desc // en la colección de pedidos p void insertarp(int i, string desc, Pedidos &p); // Elimina el pedido más antiguo y devuelve su descripción. // Pre:!esVaciaP(p) string borrarp(pedidos &p); // Devuelve true si existe un pedido con identificador i en p bool existepedidop(int i, Pedidos p); Segundo Parcial de Programación 2 8 de Julio 2016 Página3/6

b) Representación del TAD Pedidos: struct nodop { int idp; string descp; nodop * sig; typedef nodop * colap; struct cabezalp { bool * idesp; colap inicioped; colap finped; typedef cabezalp * Pedidos; c) Implemente las operaciones para crear e insertar de la parte a). // Crea y devuelve una Colección de pedidos vacía Cola crearp(){ Pedidos p; p = new (cabezalp); p->idesp = new bool[k+1]; for (int i=0; i <= K; i++) p-> idesp[i] = false; p->inicioped = NULL; p->finped = NULL; return p; // Inserta el pedido con identificador i y descripción desc // en la colección de pedidos p void insertarp(int i, string desc, Pedidos &p){ colap nuevop; if (!p->idesp[i]){ p->idesp[i] = true; nuevop = new nodop; nuevop-> idp = i; nuevop-> descp = desc; nuevop-> sig = NULL; if (p->inicioped == NULL) p->inicioped = nuevop; else p->finped->sig = nuevop; p->finped = nuevop; Segundo Parcial de Programación 2 8 de Julio 2016 Página4/6

Problema 3 (22 puntos) Considere la siguiente especificación del TAD Tabla (funciones parciales) entre enteros (dominio) y strings (codominio): // Crea y devuelve una Tabla vacía Tabla creart(); // Asocia a d el valor s en t; si ya tenía un valor asociado, lo redefine void insertart(int d, string s, Tabla &t); // Devuelve true si t esta vacía y false en caso contrario bool esvaciat(tabla t); /* Devuelve true si el elemento d tiene asociado un elemento en t y false en caso contrario */ bool estadefinidaent(int d, Tabla t); /* Devuelve el elemento del codominio asociado a d en t Pre: estadefinidaent(d,t) */ string recuperart(int d, Tabla t); /* Modifica t de modo que d no tenga un elemento asociado. Si!estaDefinidaEnT(d,t), la operación no tiene efecto */ void borrart(int d, Tabla &t); Se pide: a) Proponga una implementación del TAD Tabla, sin usar TADs auxiliares y asumiendo que: i) es igualmente probable que se desee asociar un valor a cualquier elemento del dominio y que ii) la cantidad de asociaciones a almacenar en la tabla puede estimarse en un valor N. Las operaciones selectoras y la operación de inserción deben tener O(1) de tiempo de ejecución en el caso promedio. Defina el tipo en C* para la representación elegida del TAD y accediendo directamente a la representación, desarrolle el código de las operaciones creart y recuperart. Omita el código del resto de las operaciones del TAD (que puede asumir están implementadas). b) Usando las operaciones del TAD Tabla, definidas anteriormente, implemente la operación buscar que, dado un string s y una lista ordenada en forma ascendente de enteros li, devuelve el mayor de los enteros al cual le corresponde s: /* Dados un string s, una lista ordenada de forma ascendente de enteros li y una Tabla t, devuelve el mayor de los enteros que tiene imagen s en t. Pre: existe al menos un elemento d en li tal que estadefinidaent(d,t) y el resultado de recuperart(d,t)es el string s */ int buscar(string s, ListaEnt li, Tabla t); Utilice la función streq (que se asume implementada) para comparar strings; streq retorna true si y sólo si dos strings son iguales. También debe utilizar el TAD ListaEnt con las siguientes operaciones básicas (asuma que están implementadas): ListaEnt vacialent(); // Crea y devuelve una lista vacía ListaEnt insertariniciolent(listaent l, int x); // Inserta x al principio de l int obtenerprimerolent(listaent l); // Devuelve el primer elem de l no vacía ListaEnt restolent(listaent l); // Devuelve el resto de l no vacía bool EsVaciaLEnt(ListaEnt l); // Devuelve true si l es vacía Segundo Parcial de Programación 2 8 de Julio 2016 Página5/6

Solución Problema 3 a) La implementación elegida para el TAD Tabla es una tabla de hash abierta, donde la función de hash es h(i) = i mod N. struct nodot { int dom; string codom; nodot * sig; typedef nodot * ListaT; struct cabezalt { ListaT * hasht; typedef cabezalt * Tabla; Implemente las operaciones para creart y recuperart. // Crea y devuelve una Tabla vacía Tabla creart(){ Tabla t; t = new (cabezalt); t->hasht = new ListaT[N]; for (int i=0; i < N; i++) t->hasht[i] = NULL; return t; // Devuelve el elemento del codominio asociado a d en t // Pre: estadefinidaent(d,t) string recuperart(int d, Tabla t){ ListaT lst = t->hasht[d%n]; while (lst->dom!= d) lst = lst->sig; return lst->codom; //sabemos que está!! c) Operación buscar que, dado un string s y una lista ordenada en forma ascendente de enteros li, devuelve el mayor de los enteros al cual le corresponde s: /* Dados un string s, una lista ordenada de forma ascendente de enteros li y una Tabla t, devuelve el mayor de los enteros que tiene imagen s en t. Pre: existe al menos un elemento d en li tal que estadefinidaent(d,t) y el resultado de recuperart(d,t)es el string s */ int buscar(string s, ListaEnt li, Tabla t){ int candidato, resultado; while (!vacialent(li)){ candidato = obtenerprimerolent(li); li = restolent(li); if (estadefinidaent(candidato,t) && streq(recuperart(candidato,t),s)) //circuito corto resultado = candidato; return resultado; Segundo Parcial de Programación 2 8 de Julio 2016 Página6/6